亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 1615 | 回復(fù): 4
打印 上一主題 下一主題

[網(wǎng)絡(luò)配置] linux進(jìn)程間通信之消息傳遞 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2014-07-22 02:47 |只看該作者 |倒序?yàn)g覽
linux 進(jìn)程間通信中消息傳遞主要分為管道,F(xiàn)IFO,消息隊(duì)列
(1)管道
管道由pipe函數(shù)創(chuàng)建,提供一個(gè)單路(單向)數(shù)據(jù)流。pipe函數(shù)返回兩個(gè)文件描述符:fd[0]和fd[1]。前者打開來(lái)讀,后者打開來(lái)寫。管道沒(méi)有名字,所以只能由有親緣關(guān)系的進(jìn)程使用。盡管管道是由單個(gè)進(jìn)程創(chuàng)建的,它卻很少在單個(gè)進(jìn)程內(nèi)使用。管道的典型用途為兩個(gè)不同進(jìn)程(一個(gè)是父進(jìn)程,一個(gè)是子進(jìn)程)提供進(jìn)程間的通信手段。首先,由一個(gè)進(jìn)程(它將成為父進(jìn)程)創(chuàng)建一個(gè)管道后調(diào)用fork派生一個(gè)自身的副本。接著,父進(jìn)程關(guān)閉這個(gè)管道的讀出端,子進(jìn)程關(guān)閉同一管道的寫入端;蛘吒高M(jìn)程關(guān)閉這個(gè)管道的寫入端,子進(jìn)程關(guān)閉同一管道的讀出端。這就在父子進(jìn)程間提供了一個(gè)單向數(shù)據(jù)流。
(2)FIFO
FIFO指代先進(jìn)先出(First in,First out),linux中的FIFO類似管道。它是一個(gè)單向(半雙工)數(shù)據(jù)流。不同于管道的是,每個(gè)FIFO有一個(gè)路徑名與之關(guān)聯(lián),從而允許無(wú)親緣關(guān)系的進(jìn)程訪問(wèn)同一個(gè)FIFO。FIFO也稱為有名管道。FIFO由mkfifo函數(shù)創(chuàng)建。其中pathname是一個(gè)普通的Unix路徑名,它是該FIFO的名字。mkfifo 函數(shù)已隱含指定 O_CREAT|O_EXCL. 也就是說(shuō),它那么創(chuàng)建一個(gè)新的FIFO,要么返回一個(gè)EEXIST錯(cuò)誤(如果所指定的名字的FIFO已經(jīng)存在)。如果不想希望創(chuàng)建一個(gè)新的FIFO,那就改為調(diào)用open而不是mkfifo.要打開一個(gè)已存在的FIFO或創(chuàng)建一個(gè)新的FIFO,應(yīng)先調(diào)用mkfifo,再檢查它是否返回EEXIST錯(cuò)誤,若返回該錯(cuò)誤則改為調(diào)用open.mkfifo 命令也能創(chuàng)建FIFO?梢詮膕hell腳本或命令行中使用它。在創(chuàng)建出一個(gè)FIFO后,它必須或者打開來(lái)讀,或者打開來(lái)寫,所用的可以是open函數(shù),也可以是某個(gè)標(biāo)準(zhǔn)I/O打開函數(shù)。FIFO不能打開來(lái)既讀又寫,因?yàn)樗前腚p工的。對(duì)管道或FIFO的write總是往末尾添加數(shù)據(jù),對(duì)它們的read則總是從開頭返回?cái)?shù)據(jù)。如果對(duì)管道或FIFO調(diào)用lseek,那就返回ESPIPE錯(cuò)誤。
(3)Posix 消息隊(duì)列
消息隊(duì)列可認(rèn)為是一個(gè)消息鏈表。有足夠?qū)憴?quán)限的線程可往隊(duì)列中放置消息,有足夠讀權(quán)限的線程可從隊(duì)列中取走消息。每個(gè)消息都是一個(gè)記錄,它由發(fā)送者賦予一個(gè)優(yōu)先級(jí)。在某個(gè)進(jìn)程往一個(gè)隊(duì)列寫入消息之前,并不需要另外某個(gè)進(jìn)程在該隊(duì)列上等待消息的到達(dá)。這跟管道和FIFO是相反的,對(duì)后者來(lái)說(shuō),除非讀出者已存在,否則先有寫入者是沒(méi)有意義的。一個(gè)進(jìn)程可以往某個(gè)隊(duì)列寫入一些消息,然后終止,再讓另外一個(gè)進(jìn)程在以后某個(gè)時(shí)刻讀出這些消息。消息隊(duì)列具有隨內(nèi)核的持續(xù)性,這跟管道和FIFO不一樣。Posix消息隊(duì)列和System V消息隊(duì)列。這兩組函數(shù)間存在許多相似性,但也有主要的區(qū)別
1. 對(duì)Posix消息隊(duì)列的讀總是返回最高優(yōu)先級(jí)的最早消息,對(duì)System V消息隊(duì)列的讀則可以返回任意指定優(yōu)先級(jí)的消息。
2.當(dāng)往一個(gè)空隊(duì)列放置一個(gè)消息時(shí),Posix 消息隊(duì)列允許產(chǎn)生一個(gè)信號(hào)或啟動(dòng)一個(gè)線程。System。窒㈥(duì)列則不提供類似機(jī)制。
隊(duì)列中的每個(gè)消息具有如下屬性:
1.一個(gè)無(wú)符號(hào)整數(shù)優(yōu)先級(jí)(Posix)或一個(gè)長(zhǎng)整數(shù)類型(System V).
2.消息的數(shù)據(jù)部分長(zhǎng)度(可以為0).
3.數(shù)據(jù)本身(如果長(zhǎng)度大于0)
函數(shù)接口
1. mqd_t mq_open(const char *name,int oflag,...)
mq_open函數(shù)創(chuàng)建一個(gè)新的消息隊(duì)列或打開一個(gè)已存在的消息隊(duì)列
2.int mq_close(mqd_t mqdes);
mq_close函數(shù)關(guān)閉一個(gè)消息隊(duì)列。
3.int mq_unlink(const char *name);
從系統(tǒng)中刪除用作第一個(gè)參數(shù)的某個(gè)name.
4. int mq_getattr(mqd_t mqdes,struct mq_attr *attr);
   int mq_setattr(mqd_t mqdes,const struct mq_attr *attr,struct mq_attr *oattr);
每個(gè)消息隊(duì)列有四個(gè)屬性,mq_getattr返回所有這些屬性,mq_setattr則設(shè)置其中某個(gè)屬性。
struct mq_attr{
   long mq_flags;
   long mq_maxmsg;
   long mq_msgsize;
   long mq_curmsgs;
};
5.int mq_send(mqd_t mqdes,const char *ptr,size_t len,unsigned int prio);
 int mq_receive(mqd_t mqdes,char *ptr,size_t len,unsigned int *priop);
mq_send函數(shù)往消息隊(duì)列中寫入消息,mq_receive函數(shù)從消息隊(duì)列中讀出消息。
6.int mq_notify(mqd_t mqdes,const struct sigevent *motification);
結(jié)構(gòu)體:
union sigval{
    int sival_int;
    void *sival_ptr;
};
struct sigevent
{
    int sigev_notify;
    int sigev_signo;
    union sigval sigev_value;
    void  (*sigev_notify_function)(union sigval);
    pthread_attr_t *sigev_notify_attributes;
};
mq_notify函數(shù)為指定隊(duì)列建立或刪除異步事件通知。一些普遍適用于該函數(shù)的若干規(guī)則
1).如果notification參數(shù)非空,那么當(dāng)前進(jìn)程希望在一個(gè)消息達(dá)到所指定的先前為空的隊(duì)列時(shí)得到通知。我們說(shuō)"該進(jìn)程被注冊(cè)為接收該隊(duì)列的通知"。
2).如果notification參數(shù)為空指針,而且當(dāng)前進(jìn)程目前被注冊(cè)為接收所指定隊(duì)列的通知,那么已存在的注冊(cè)將被撤銷。
3).任意時(shí)刻只有一個(gè)進(jìn)程可以被注冊(cè)為接收某個(gè)給定隊(duì)列的通知。
4).當(dāng)有一個(gè)消息達(dá)到某個(gè)先前為空的隊(duì)列,而且已有一個(gè)進(jìn)程被注冊(cè)為接收該隊(duì)列的通知時(shí),只有在沒(méi)有任何線程阻塞在該隊(duì)列的mq_receive調(diào)用中的前提下,通知才會(huì)發(fā)出。這就是說(shuō),在mq_receive調(diào)用中的阻塞比任何通知的注冊(cè)都優(yōu)先。
5).當(dāng)該通知被發(fā)送給它的注冊(cè)進(jìn)程時(shí),其注冊(cè)即被撤銷。該進(jìn)程必須再次調(diào)用mq_notify以重新注冊(cè)(想要的話)。

論壇徽章:
15
2015年辭舊歲徽章
日期:2015-03-03 16:54:15雙魚座
日期:2015-01-15 17:29:44午馬
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉雞
日期:2014-04-02 12:24:51雙子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥豬
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
2 [報(bào)告]
發(fā)表于 2014-07-22 06:06 |只看該作者
跟jboss 或者中間件有關(guān)系嗎?沒(méi)有的話,我就將帖子轉(zhuǎn)到Linux 板塊了。

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2014-07-22 16:53 |只看該作者
囧丁乙……好吧,我承認(rèn),樓主比我牛

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2014-07-23 11:02 |只看該作者
真不知道,還有這么好心的樓主 支持

論壇徽章:
5
子鼠
日期:2014-05-15 13:49:32子鼠
日期:2014-07-16 11:16:45卯兔
日期:2014-07-17 11:34:49巨蟹座
日期:2014-07-21 12:05:002015亞冠之柏太陽(yáng)神
日期:2015-07-30 16:26:53
5 [報(bào)告]
發(fā)表于 2014-07-23 11:20 |只看該作者
好多高大上的帖子,學(xué)習(xí)了
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP