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

Chinaunix

標(biāo)題: linux進(jìn)程間通信之消息傳遞 [打印本頁]

作者: superheola    時間: 2014-07-22 02:47
標(biāo)題: linux進(jìn)程間通信之消息傳遞
linux 進(jìn)程間通信中消息傳遞主要分為管道,F(xiàn)IFO,消息隊列
(1)管道
管道由pipe函數(shù)創(chuàng)建,提供一個單路(單向)數(shù)據(jù)流。pipe函數(shù)返回兩個文件描述符:fd[0]和fd[1]。前者打開來讀,后者打開來寫。管道沒有名字,所以只能由有親緣關(guān)系的進(jìn)程使用。盡管管道是由單個進(jìn)程創(chuàng)建的,它卻很少在單個進(jìn)程內(nèi)使用。管道的典型用途為兩個不同進(jìn)程(一個是父進(jìn)程,一個是子進(jìn)程)提供進(jìn)程間的通信手段。首先,由一個進(jìn)程(它將成為父進(jìn)程)創(chuàng)建一個管道后調(diào)用fork派生一個自身的副本。接著,父進(jìn)程關(guān)閉這個管道的讀出端,子進(jìn)程關(guān)閉同一管道的寫入端。或者父進(jìn)程關(guān)閉這個管道的寫入端,子進(jìn)程關(guān)閉同一管道的讀出端。這就在父子進(jìn)程間提供了一個單向數(shù)據(jù)流。
(2)FIFO
FIFO指代先進(jìn)先出(First in,First out),linux中的FIFO類似管道。它是一個單向(半雙工)數(shù)據(jù)流。不同于管道的是,每個FIFO有一個路徑名與之關(guān)聯(lián),從而允許無親緣關(guān)系的進(jìn)程訪問同一個FIFO。FIFO也稱為有名管道。FIFO由mkfifo函數(shù)創(chuàng)建。其中pathname是一個普通的Unix路徑名,它是該FIFO的名字。mkfifo 函數(shù)已隱含指定 O_CREAT|O_EXCL. 也就是說,它那么創(chuàng)建一個新的FIFO,要么返回一個EEXIST錯誤(如果所指定的名字的FIFO已經(jīng)存在)。如果不想希望創(chuàng)建一個新的FIFO,那就改為調(diào)用open而不是mkfifo.要打開一個已存在的FIFO或創(chuàng)建一個新的FIFO,應(yīng)先調(diào)用mkfifo,再檢查它是否返回EEXIST錯誤,若返回該錯誤則改為調(diào)用open.mkfifo 命令也能創(chuàng)建FIFO。可以從shell腳本或命令行中使用它。在創(chuàng)建出一個FIFO后,它必須或者打開來讀,或者打開來寫,所用的可以是open函數(shù),也可以是某個標(biāo)準(zhǔn)I/O打開函數(shù)。FIFO不能打開來既讀又寫,因為它是半雙工的。對管道或FIFO的write總是往末尾添加數(shù)據(jù),對它們的read則總是從開頭返回數(shù)據(jù)。如果對管道或FIFO調(diào)用lseek,那就返回ESPIPE錯誤。
(3)Posix 消息隊列
消息隊列可認(rèn)為是一個消息鏈表。有足夠?qū)憴?quán)限的線程可往隊列中放置消息,有足夠讀權(quán)限的線程可從隊列中取走消息。每個消息都是一個記錄,它由發(fā)送者賦予一個優(yōu)先級。在某個進(jìn)程往一個隊列寫入消息之前,并不需要另外某個進(jìn)程在該隊列上等待消息的到達(dá)。這跟管道和FIFO是相反的,對后者來說,除非讀出者已存在,否則先有寫入者是沒有意義的。一個進(jìn)程可以往某個隊列寫入一些消息,然后終止,再讓另外一個進(jìn)程在以后某個時刻讀出這些消息。消息隊列具有隨內(nèi)核的持續(xù)性,這跟管道和FIFO不一樣。Posix消息隊列和System V消息隊列。這兩組函數(shù)間存在許多相似性,但也有主要的區(qū)別
1. 對Posix消息隊列的讀總是返回最高優(yōu)先級的最早消息,對System。窒㈥犃械淖x則可以返回任意指定優(yōu)先級的消息。
2.當(dāng)往一個空隊列放置一個消息時,Posix 消息隊列允許產(chǎn)生一個信號或啟動一個線程。System V消息隊列則不提供類似機制。
隊列中的每個消息具有如下屬性:
1.一個無符號整數(shù)優(yōu)先級(Posix)或一個長整數(shù)類型(System V).
2.消息的數(shù)據(jù)部分長度(可以為0).
3.數(shù)據(jù)本身(如果長度大于0)
函數(shù)接口
1. mqd_t mq_open(const char *name,int oflag,...)
mq_open函數(shù)創(chuàng)建一個新的消息隊列或打開一個已存在的消息隊列
2.int mq_close(mqd_t mqdes);
mq_close函數(shù)關(guān)閉一個消息隊列。
3.int mq_unlink(const char *name);
從系統(tǒng)中刪除用作第一個參數(shù)的某個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);
每個消息隊列有四個屬性,mq_getattr返回所有這些屬性,mq_setattr則設(shè)置其中某個屬性。
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ù)往消息隊列中寫入消息,mq_receive函數(shù)從消息隊列中讀出消息。
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ù)為指定隊列建立或刪除異步事件通知。一些普遍適用于該函數(shù)的若干規(guī)則
1).如果notification參數(shù)非空,那么當(dāng)前進(jìn)程希望在一個消息達(dá)到所指定的先前為空的隊列時得到通知。我們說"該進(jìn)程被注冊為接收該隊列的通知"。
2).如果notification參數(shù)為空指針,而且當(dāng)前進(jìn)程目前被注冊為接收所指定隊列的通知,那么已存在的注冊將被撤銷。
3).任意時刻只有一個進(jìn)程可以被注冊為接收某個給定隊列的通知。
4).當(dāng)有一個消息達(dá)到某個先前為空的隊列,而且已有一個進(jìn)程被注冊為接收該隊列的通知時,只有在沒有任何線程阻塞在該隊列的mq_receive調(diào)用中的前提下,通知才會發(fā)出。這就是說,在mq_receive調(diào)用中的阻塞比任何通知的注冊都優(yōu)先。
5).當(dāng)該通知被發(fā)送給它的注冊進(jìn)程時,其注冊即被撤銷。該進(jìn)程必須再次調(diào)用mq_notify以重新注冊(想要的話)。
作者: rdcwayx    時間: 2014-07-22 06:06
跟jboss 或者中間件有關(guān)系嗎?沒有的話,我就將帖子轉(zhuǎn)到Linux 板塊了。
作者: kirafa    時間: 2014-07-22 16:53
囧丁乙……好吧,我承認(rèn),樓主比我牛
作者: chynna_phillips    時間: 2014-07-23 11:02
真不知道,還有這么好心的樓主 支持
作者: 機智的小學(xué)生    時間: 2014-07-23 11:20
好多高大上的帖子,學(xué)習(xí)了




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2