Linux環(huán)境進(jìn)程間通信(三)消息隊(duì)列_第1頁(yè)
Linux環(huán)境進(jìn)程間通信(三)消息隊(duì)列_第2頁(yè)
Linux環(huán)境進(jìn)程間通信(三)消息隊(duì)列_第3頁(yè)
Linux環(huán)境進(jìn)程間通信(三)消息隊(duì)列_第4頁(yè)
Linux環(huán)境進(jìn)程間通信(三)消息隊(duì)列_第5頁(yè)
已閱讀5頁(yè),還剩7頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、本系列文章中的前兩部分,我們探討管道及信號(hào)兩種通信機(jī)制,本文將深入第三部分,介紹系統(tǒng) V 消息隊(duì)列及其相應(yīng) API。消息隊(duì)列(也叫做報(bào)文隊(duì)列)能夠克服早期unix通信機(jī)制的一些缺點(diǎn)。作為早期unix通信機(jī)制之一的信號(hào)能夠傳送的信息量有限,后來(lái)雖然POSIX 1003.1b在信號(hào)的實(shí)時(shí)性方面作了拓廣,使得信號(hào)在傳遞信息量方面有了相當(dāng)程度的改進(jìn),但是信號(hào)這種通信方式更像"即時(shí)"的通信方式,它要求接受信號(hào)的進(jìn)程在某個(gè)時(shí)間范圍內(nèi)對(duì)信號(hào)做出反應(yīng),因此該信號(hào)最多在接受信號(hào)進(jìn)程的生命周期內(nèi)才有意義,信號(hào)所傳遞的信息是接近于隨進(jìn)程持續(xù)的概念(process-persistent),見(jiàn)附錄

2、1;管道及有名管道及有名管道則是典型的隨進(jìn)程持續(xù)IPC,并且,只能傳送無(wú)格式的字節(jié)流無(wú)疑會(huì)給應(yīng)用程序開(kāi)發(fā)帶來(lái)不便,另外,它的緩沖區(qū)大小也受到限制。消息隊(duì)列就是一個(gè)消息的鏈表??梢园严⒖醋饕粋€(gè)記錄,具有特定的格式以及特定的優(yōu)先級(jí)。對(duì)消息隊(duì)列有寫(xiě)權(quán)限的進(jìn)程可以向中按照一定的規(guī)則添加新消息;對(duì)消息隊(duì)列有讀權(quán)限的進(jìn)程則可以從消息隊(duì)列中讀走消息。消息隊(duì)列是隨內(nèi)核持續(xù)的(參見(jiàn)附錄 1)。目前主要有兩種類型的消息隊(duì)列:POSIX消息隊(duì)列以及系統(tǒng)V消息隊(duì)列,系統(tǒng)V消息隊(duì)列目前被大量使用??紤]到程序的可移植性,新開(kāi)發(fā)的應(yīng)用程序應(yīng)盡量使用POSIX消息隊(duì)列。在本系列專題的序(深刻理解Linux進(jìn)程間通信(IPC

3、)中,提到對(duì)于消息隊(duì)列、信號(hào)燈、以及共享內(nèi)存區(qū)來(lái)說(shuō),有兩個(gè)實(shí)現(xiàn)版本:POSIX的以及系統(tǒng)V的。Linux內(nèi)核(內(nèi)核因此,本文將主要介紹系統(tǒng)V消息隊(duì)列及其相應(yīng)API。在沒(méi)有聲明的情況下,以下討論中指的都是系統(tǒng)V消息隊(duì)列。一、消息隊(duì)列基本概念1. 系統(tǒng)V消息隊(duì)列是隨內(nèi)核持續(xù)的,只有在內(nèi)核重起或者顯示刪除一個(gè)消息隊(duì)列時(shí),該消息隊(duì)列才會(huì)真正被刪除。因此系統(tǒng)中記錄消息隊(duì)列的數(shù)據(jù)結(jié)構(gòu)(struct ipc_ids msg_ids)位于內(nèi)核中,系統(tǒng)中的所有消息隊(duì)列都可以在結(jié)構(gòu)msg_ids中找到訪問(wèn)入口。 2. 消息隊(duì)列就是一個(gè)消息的鏈表。每個(gè)消息隊(duì)列都有一個(gè)隊(duì)列頭,用結(jié)構(gòu)struct msg_queue來(lái)

4、描述(參見(jiàn)附錄 2)。隊(duì)列頭中包含了該消息隊(duì)列的大量信息,包括消息隊(duì)列鍵值、用戶ID、組ID、消息隊(duì)列中消息數(shù)目等等,甚至記錄了最近對(duì)消息隊(duì)列讀寫(xiě)進(jìn)程的ID。讀者可以訪問(wèn)這些信息,也可以設(shè)置其中的某些信息。 3. 下圖說(shuō)明了內(nèi)核與消息隊(duì)列是怎樣建立起聯(lián)系的:其中:struct ipc_ids msg_ids是內(nèi)核中記錄消息隊(duì)列的全局?jǐn)?shù)據(jù)結(jié)構(gòu);struct msg_queue是每個(gè)消息隊(duì)列的隊(duì)列頭。 從上圖可以看出,全局?jǐn)?shù)據(jù)結(jié)構(gòu) struct ipc_ids msg_ids 可以訪問(wèn)到每個(gè)消息隊(duì)列頭的第一個(gè)成員:struct kern_ipc_perm;而每個(gè)struct kern_ipc_pe

5、rm能夠與具體的消息隊(duì)列對(duì)應(yīng)起來(lái)是因?yàn)樵谠摻Y(jié)構(gòu)中,有一個(gè)key_t類型成員key,而key則唯一確定一個(gè)消息隊(duì)列。kern_ipc_perm結(jié)構(gòu)如下:struct kern_ipc_perm /內(nèi)核中記錄消息隊(duì)列的全局?jǐn)?shù)據(jù)結(jié)構(gòu)msg_ids能夠訪問(wèn)到該結(jié)構(gòu); key_t key; /該鍵值則唯一對(duì)應(yīng)一個(gè)消息隊(duì)列 uid_t uid; gid_t gid;uid_t cuid;gid_t cgid;mode_t mode;unsigned long seq;二、操作消息隊(duì)列對(duì)消息隊(duì)列的操作無(wú)非有下面三種類型:1、 打開(kāi)或創(chuàng)建消息隊(duì)列消息隊(duì)列的內(nèi)核持續(xù)性要求每個(gè)消息隊(duì)列都在系統(tǒng)范圍內(nèi)對(duì)應(yīng)唯一的鍵值

6、,所以,要獲得一個(gè)消息隊(duì)列的描述字,只需提供該消息隊(duì)列的鍵值即可;注:消息隊(duì)列描述字是由在系統(tǒng)范圍內(nèi)唯一的鍵值生成的,而鍵值可以看作對(duì)應(yīng)系統(tǒng)內(nèi)的一條路經(jīng)。2、 讀寫(xiě)操作消息讀寫(xiě)操作非常簡(jiǎn)單,對(duì)開(kāi)發(fā)人員來(lái)說(shuō),每個(gè)消息都類似如下的數(shù)據(jù)結(jié)構(gòu):struct msgbuflong mtype;char mtext1;mtype成員代表消息類型,從消息隊(duì)列中讀取消息的一個(gè)重要依據(jù)就是消息的類型;mtext是消息內(nèi)容,當(dāng)然長(zhǎng)度不一定為1。因此,對(duì)于發(fā)送消息來(lái)說(shuō),首先預(yù)置一個(gè)msgbuf緩沖區(qū)并寫(xiě)入消息類型和內(nèi)容,調(diào)用相應(yīng)的發(fā)送函數(shù)即可;對(duì)讀取消息來(lái)說(shuō),首先分配這樣一個(gè)msgbuf緩沖區(qū),然后把消息讀入該緩沖

7、區(qū)即可。3、 獲得或設(shè)置消息隊(duì)列屬性:消息隊(duì)列的信息基本上都保存在消息隊(duì)列頭中,因此,可以分配一個(gè)類似于消息隊(duì)列頭的結(jié)構(gòu)(struct msqid_ds,見(jiàn)附錄 2),來(lái)返回消息隊(duì)列的屬性;同樣可以設(shè)置該數(shù)據(jù)結(jié)構(gòu)。消息隊(duì)列API1、文件名到鍵值#include <sys/types.h>#include <sys/ipc.h>key_t ftok (char*pathname, char proj);它返回與路徑pathname相對(duì)應(yīng)的一個(gè)鍵值。該函數(shù)不直接對(duì)消息隊(duì)列操作,但在調(diào)用ipc(MSGGET,)或msgget()來(lái)獲得消息隊(duì)列描述字前,往往要調(diào)用該函數(shù)。典型的

8、調(diào)用代碼是: key=ftok(path_ptr, 'a'); ipc_id=ipc(MSGGET, (int)key, flags,0,NULL,0); 2、linux為操作系統(tǒng)V進(jìn)程間通信的三種方式(消息隊(duì)列、信號(hào)燈、共享內(nèi)存區(qū))提供了一個(gè)統(tǒng)一的用戶界面:int ipc(unsigned int call, int first, int second, int third, void *ptr, long fifth);第一個(gè)參數(shù)指明對(duì)IPC對(duì)象的操作方式,對(duì)消息隊(duì)列而言共有四種操作:MSGSND、MSGRCV、MSGGET以及MSGCTL,分別代表向消息隊(duì)列發(fā)送消息、從消

9、息隊(duì)列讀取消息、打開(kāi)或創(chuàng)建消息隊(duì)列、控制消息隊(duì)列;first參數(shù)代表唯一的IPC對(duì)象;下面將介紹四種操作。· int ipc(MSGGET, int first, int second, int third, void *ptr, long fifth);與該操作對(duì)應(yīng)的系統(tǒng)V調(diào)用為:int msgget( (key_t)first,second)。 · int ipc(MSGCTL, int first, int second, int third, void *ptr, long fifth)與該操作對(duì)應(yīng)的系統(tǒng)V調(diào)用為:int msgctl( first,second,

10、(struct msqid_ds*) ptr)。 · int ipc(MSGSND, int first, int second, int third, void *ptr, long fifth);與該操作對(duì)應(yīng)的系統(tǒng)V調(diào)用為:int msgsnd( first, (struct msgbuf*)ptr, second, third)。 · int ipc(MSGRCV, int first, int second, int third, void *ptr, long fifth);與該操作對(duì)應(yīng)的系統(tǒng)V調(diào)用為:int msgrcv( first,(struct msgbu

11、f*)ptr, second, fifth,third), 注:本人不主張采用系統(tǒng)調(diào)用ipc(),而更傾向于采用系統(tǒng)V或者POSIX進(jìn)程間通信API。原因如下:· 雖然該系統(tǒng)調(diào)用提供了統(tǒng)一的用戶界面,但正是由于這個(gè)特性,它的參數(shù)幾乎不能給出特定的實(shí)際意義(如以first、second來(lái)命名參數(shù)),在一定程度上造成開(kāi)發(fā)不便。 · 正如ipc手冊(cè)所說(shuō)的:ipc()是linux所特有的,編寫(xiě)程序時(shí)應(yīng)注意程序的移植性問(wèn)題; · 該系統(tǒng)調(diào)用的實(shí)現(xiàn)不過(guò)是把系統(tǒng)V IPC函數(shù)進(jìn)行了封裝,沒(méi)有任何效率上的優(yōu)勢(shì); · 系統(tǒng)V在IPC方面的API數(shù)量不多,形式也較簡(jiǎn)潔。 3

12、.系統(tǒng)V消息隊(duì)列API系統(tǒng)V消息隊(duì)列API共有四個(gè),使用時(shí)需要包括幾個(gè)頭文件:#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>1)int msgget(key_t key, int msgflg)參數(shù)key是一個(gè)鍵值,由ftok獲得;msgflg參數(shù)是一些標(biāo)志位。該調(diào)用返回與健值key相對(duì)應(yīng)的消息隊(duì)列描述字。在以下兩種情況下,該調(diào)用將創(chuàng)建一個(gè)新的消息隊(duì)列:· 如果沒(méi)有消息隊(duì)列與健值key相對(duì)應(yīng),并且msgflg中包含了IPC_CREAT標(biāo)志位; · key參數(shù)為I

13、PC_PRIVATE; 參數(shù)msgflg可以為以下:IPC_CREAT、IPC_EXCL、IPC_NOWAIT或三者的或結(jié)果。調(diào)用返回:成功返回消息隊(duì)列描述字,否則返回-1。注:參數(shù)key設(shè)置成常數(shù)IPC_PRIVATE并不意味著其他進(jìn)程不能訪問(wèn)該消息隊(duì)列,只意味著即將創(chuàng)建新的消息隊(duì)列。2)int msgrcv(int msqid, struct msgbuf *msgp, int msgsz, long msgtyp, int msgflg);該系統(tǒng)調(diào)用從msgid代表的消息隊(duì)列中讀取一個(gè)消息,并把消息存儲(chǔ)在msgp指向的msgbuf結(jié)構(gòu)中。msqid為消息隊(duì)列描述字;消息返回后存儲(chǔ)在msg

14、p指向的地址,msgsz指定msgbuf的mtext成員的長(zhǎng)度(即消息內(nèi)容的長(zhǎng)度),msgtyp為請(qǐng)求讀取的消息類型;讀消息標(biāo)志msgflg可以為以下幾個(gè)常值的或:· IPC_NOWAIT 如果沒(méi)有滿足條件的消息,調(diào)用立即返回,此時(shí),errno=ENOMSG · IPC_EXCEPT 與msgtyp>0配合使用,返回隊(duì)列中第一個(gè)類型不為msgtyp的消息 · IPC_NOERROR 如果隊(duì)列中滿足條件的消息內(nèi)容大于所請(qǐng)求的msgsz字節(jié),則把該消息截?cái)啵財(cái)嗖糠謱G失。 msgrcv手冊(cè)中詳細(xì)給出了消息類型取不同值時(shí)(>0; <0; =0),調(diào)用

15、將返回消息隊(duì)列中的哪個(gè)消息。msgrcv()解除阻塞的條件有三個(gè):1. 消息隊(duì)列中有了滿足條件的消息; 2. msqid代表的消息隊(duì)列被刪除; 3. 調(diào)用msgrcv()的進(jìn)程被信號(hào)中斷; 調(diào)用返回:成功返回讀出消息的實(shí)際字節(jié)數(shù),否則返回-1。3)int msgsnd(int msqid, struct msgbuf *msgp, int msgsz, int msgflg);向msgid代表的消息隊(duì)列發(fā)送一個(gè)消息,即將發(fā)送的消息存儲(chǔ)在msgp指向的msgbuf結(jié)構(gòu)中,消息的大小由msgze指定。對(duì)發(fā)送消息來(lái)說(shuō),有意義的msgflg標(biāo)志為IPC_NOWAIT,指明在消息隊(duì)列沒(méi)有足夠空間容納要發(fā)

16、送的消息時(shí),msgsnd是否等待。造成msgsnd()等待的條件有兩種:· 當(dāng)前消息的大小與當(dāng)前消息隊(duì)列中的字節(jié)數(shù)之和超過(guò)了消息隊(duì)列的總?cè)萘浚?· 當(dāng)前消息隊(duì)列的消息數(shù)(單位"個(gè)")不小于消息隊(duì)列的總?cè)萘浚▎挝?quot;字節(jié)數(shù)"),此時(shí),雖然消息隊(duì)列中的消息數(shù)目很多,但基本上都只有一個(gè)字節(jié)。 msgsnd()解除阻塞的條件有三個(gè): 1. 不滿足上述兩個(gè)條件,即消息隊(duì)列中有容納該消息的空間; 2. msqid代表的消息隊(duì)列被刪除; 3. 調(diào)用msgsnd()的進(jìn)程被信號(hào)中斷; 調(diào)用返回:成功返回0,否則返回-1。4)int msgctl(int

17、 msqid, int cmd, struct msqid_ds *buf);該系統(tǒng)調(diào)用對(duì)由msqid標(biāo)識(shí)的消息隊(duì)列執(zhí)行cmd操作,共有三種cmd操作:IPC_STAT、IPC_SET 、IPC_RMID。1. IPC_STAT:該命令用來(lái)獲取消息隊(duì)列信息,返回的信息存貯在buf指向的msqid結(jié)構(gòu)中; 2. IPC_SET:該命令用來(lái)設(shè)置消息隊(duì)列的屬性,要設(shè)置的屬性存儲(chǔ)在buf指向的msqid結(jié)構(gòu)中;可設(shè)置屬性包括:msg_perm.uid、msg_perm.gid、msg_perm.mode以及msg_qbytes,同時(shí),也影響msg_ctime成員。 3. IPC_RMID:刪除msqi

18、d標(biāo)識(shí)的消息隊(duì)列; 調(diào)用返回:成功返回0,否則返回-1。三、消息隊(duì)列的限制每個(gè)消息隊(duì)列的容量(所能容納的字節(jié)數(shù))都有限制,該值因系統(tǒng)不同而不同。在后面的應(yīng)用實(shí)例中,輸出了redhat 8.0的限制,結(jié)果參見(jiàn)附錄 3。另一個(gè)限制是每個(gè)消息隊(duì)列所能容納的最大消息數(shù):在redhad 8.0中,該限制是受消息隊(duì)列容量制約的:消息個(gè)數(shù)要小于消息隊(duì)列的容量(字節(jié)數(shù))。注:上述兩個(gè)限制是針對(duì)每個(gè)消息隊(duì)列而言的,系統(tǒng)對(duì)消息隊(duì)列的限制還有系統(tǒng)范圍內(nèi)的最大消息隊(duì)列個(gè)數(shù),以及整個(gè)系統(tǒng)范圍內(nèi)的最大消息數(shù)。一般來(lái)說(shuō),實(shí)際開(kāi)發(fā)過(guò)程中不會(huì)超過(guò)這個(gè)限制。四、消息隊(duì)列應(yīng)用實(shí)例消息隊(duì)列應(yīng)用相對(duì)較簡(jiǎn)單,下面實(shí)例基本上覆蓋了對(duì)消息隊(duì)

19、列的所有操作,同時(shí),程序輸出結(jié)果有助于加深對(duì)前面所講的某些規(guī)則及消息隊(duì)列限制的理解。#include <sys/types.h>#include <sys/msg.h>#include <unistd.h>void msg_stat(int,struct msqid_ds );main()int gflags,sflags,rflags;key_t key;int msgid;int reval;struct msgsbuf int mtype; char mtext1; msg_sbuf;struct msgmbuf int mtype; char mte

20、xt10; msg_rbuf;struct msqid_ds msg_ginfo,msg_sinfo;char* msgpath="/unix/msgqueue"key=ftok(msgpath,'a');gflags=IPC_CREAT|IPC_EXCL;msgid=msgget(key,gflags|00666);if(msgid=-1) printf("msg create errorn"); return;/創(chuàng)建一個(gè)消息隊(duì)列后,輸出消息隊(duì)列缺省屬性msg_stat(msgid,msg_ginfo);sflags=IPC_NOWAI

21、T;msg_sbuf.mtype=10;msg_sbuf.mtext0='a'reval=msgsnd(msgid,&msg_sbuf,sizeof(msg_sbuf.mtext),sflags);if(reval=-1) printf("message send errorn");/發(fā)送一個(gè)消息后,輸出消息隊(duì)列屬性msg_stat(msgid,msg_ginfo);rflags=IPC_NOWAIT|MSG_NOERROR;reval=msgrcv(msgid,&msg_rbuf,4,10,rflags);if(reval=-1) prin

22、tf("read msg errorn");else printf("read from msg queue %d bytesn",reval);/從消息隊(duì)列中讀出消息后,輸出消息隊(duì)列屬性msg_stat(msgid,msg_ginfo);msg_sinfo.msg_perm.uid=8;/just a trymsg_sinfo.msg_perm.gid=8;/msg_sinfo.msg_qbytes=16388;/此處驗(yàn)證超級(jí)用戶可以更改消息隊(duì)列的缺省msg_qbytes/注意這里設(shè)置的值大于缺省值reval=msgctl(msgid,IPC_SET,

23、&msg_sinfo);if(reval=-1) printf("msg set info errorn"); return;msg_stat(msgid,msg_ginfo);/驗(yàn)證設(shè)置消息隊(duì)列屬性reval=msgctl(msgid,IPC_RMID,NULL);/刪除消息隊(duì)列if(reval=-1) printf("unlink msg queue errorn"); return;void msg_stat(int msgid,struct msqid_ds msg_info)int reval;sleep(1);/只是為了后面輸出時(shí)間的

24、方便reval=msgctl(msgid,IPC_STAT,&msg_info);if(reval=-1) printf("get msg info errorn"); return;printf("n");printf("current number of bytes on queue is %dn",msg_info.msg_cbytes);printf("number of messages in queue is %dn",msg_info.msg_qnum);printf("max nu

25、mber of bytes on queue is %dn",msg_info.msg_qbytes);/每個(gè)消息隊(duì)列的容量(字節(jié)數(shù))都有限制MSGMNB,值的大小因系統(tǒng)而異。在創(chuàng)建新的消息隊(duì)列時(shí),/msg_qbytes的缺省值就是MSGMNBprintf("pid of last msgsnd is %dn",msg_info.msg_lspid);printf("pid of last msgrcv is %dn",msg_info.msg_lrpid);printf("last msgsnd time is %s",

26、ctime(&(msg_info.msg_stime);printf("last msgrcv time is %s", ctime(&(msg_info.msg_rtime);printf("last change time is %s", ctime(&(msg_info.msg_ctime);printf("msg uid is %dn",msg_info.msg_perm.uid);printf("msg gid is %dn",msg_info.msg_perm.gid);程序輸出

27、結(jié)果見(jiàn)附錄 3。小結(jié):消息隊(duì)列與管道以及有名管道相比,具有更大的靈活性,首先,它提供有格式字節(jié)流,有利于減少開(kāi)發(fā)人員的工作量;其次,消息具有類型,在實(shí)際應(yīng)用中,可作為優(yōu)先級(jí)使用。這兩點(diǎn)是管道以及有名管道所不能比的。同樣,消息隊(duì)列可以在幾個(gè)進(jìn)程間復(fù)用,而不管這幾個(gè)進(jìn)程是否具有親緣關(guān)系,這一點(diǎn)與有名管道很相似;但消息隊(duì)列是隨內(nèi)核持續(xù)的,與有名管道(隨進(jìn)程持續(xù))相比,生命力更強(qiáng),應(yīng)用空間更大。附錄 1:在參考文獻(xiàn)1中,給出了IPC隨進(jìn)程持續(xù)、隨內(nèi)核持續(xù)以及隨文件系統(tǒng)持續(xù)的定義:1. 隨進(jìn)程持續(xù):IPC一直存在到打開(kāi)IPC對(duì)象的最后一個(gè)進(jìn)程關(guān)閉該對(duì)象為止。如管道和有名管道; 2. 隨內(nèi)核持續(xù):IPC一

28、直持續(xù)到內(nèi)核重新自舉或者顯示刪除該對(duì)象為止。如消息隊(duì)列、信號(hào)燈以及共享內(nèi)存等; 3. 隨文件系統(tǒng)持續(xù):IPC一直持續(xù)到顯示刪除該對(duì)象為止。 附錄 2:結(jié)構(gòu)msg_queue用來(lái)描述消息隊(duì)列頭,存在于系統(tǒng)空間:struct msg_queue struct kern_ipc_perm q_perm; time_t q_stime; /* last msgsnd time */ time_t q_rtime; /* last msgrcv time */ time_t q_ctime; /* last change time */ unsigned long q_cbytes; /* curren

29、t number of bytes on queue */ unsigned long q_qnum; /* number of messages in queue */ unsigned long q_qbytes; /* max number of bytes on queue */ pid_t q_lspid; /* pid of last msgsnd */ pid_t q_lrpid; /* last receive pid */ struct list_head q_messages; struct list_head q_receivers; struct list_head q

30、_senders;結(jié)構(gòu)msqid_ds用來(lái)設(shè)置或返回消息隊(duì)列的信息,存在于用戶空間;struct msqid_ds struct ipc_perm msg_perm; struct msg *msg_first; /* first message on queue,unused */ struct msg *msg_last; /* last message in queue,unused */ _kernel_time_t msg_stime; /* last msgsnd time */ _kernel_time_t msg_rtime; /* last msgrcv time */ _k

31、ernel_time_t msg_ctime; /* last change time */ unsigned long msg_lcbytes; /* Reuse junk fields for 32 bit */ unsigned long msg_lqbytes; /* ditto */ unsigned short msg_cbytes; /* current number of bytes on queue */ unsigned short msg_qnum; /* number of messages in queue */ unsigned short msg_qbytes;

32、/* max number of bytes on queue */ _kernel_ipc_pid_t msg_lspid; /* pid of last msgsnd */ _kernel_ipc_pid_t msg_lrpid; /* last receive pid */;/可以看出上述兩個(gè)結(jié)構(gòu)很相似。附錄 3:消息隊(duì)列實(shí)例輸出結(jié)果:current number of bytes on queue is 0number of messages in queue is 0max number of bytes on queue is 16384pid of last msgsnd is

33、0pid of last msgrcv is 0last msgsnd time is Thu Jan 1 08:00:00 1970last msgrcv time is Thu Jan 1 08:00:00 1970last change time is Sun Dec 29 18:28:20 2002msg uid is 0msg gid is 0/上面剛剛創(chuàng)建一個(gè)新消息隊(duì)列時(shí)的輸出current number of bytes on queue is 1number of messages in queue is 1max number of bytes on queue is 16384pid of last msgsnd is 2510pid of last msgrcv is 0last msgsnd time is Sun Dec 29 18:28:21 2002last msgrcv

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論