消息隊(duì)列函數(shù)(msggetmsgctlmsgsndmsgrcv)及其范例_第1頁
消息隊(duì)列函數(shù)(msggetmsgctlmsgsndmsgrcv)及其范例_第2頁
消息隊(duì)列函數(shù)(msggetmsgctlmsgsndmsgrcv)及其范例_第3頁
消息隊(duì)列函數(shù)(msggetmsgctlmsgsndmsgrcv)及其范例_第4頁
消息隊(duì)列函數(shù)(msggetmsgctlmsgsndmsgrcv)及其范例_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、消息隊(duì)列函數(shù)(msgget、msgctl、msgsnd、msgrcv)及其范例消息隊(duì)列函數(shù)由msgget、msgctl、msgsnd、msgrcv四個(gè)函數(shù)組成。下面的表格列出了這四個(gè)函數(shù)的函數(shù)原型及其具體說明。1. msgget函數(shù)原型msgget(得到消息隊(duì)列標(biāo)識(shí)符或創(chuàng)建一個(gè)消息隊(duì)列對(duì)象)所需頭文件#include #include #include 函數(shù)說明得到消息隊(duì)列標(biāo)識(shí)符或創(chuàng)建一個(gè)消息隊(duì)列對(duì)象并返回消息隊(duì)列標(biāo)識(shí)符函數(shù)原型int msgget(key_t key, int msgflg)函數(shù)傳入值key0(IPC_PRIVATE):會(huì)建立新的消息隊(duì)列大于0的32位整數(shù):視參數(shù)msgflg

2、來確定操作。通常要求此值來源于ftok返回的IPC鍵值msgflg0:取消息隊(duì)列標(biāo)識(shí)符,若不存在則函數(shù)會(huì)報(bào)錯(cuò)IPC_CREAT:當(dāng)msgflg&IPC_CREAT為真時(shí),如果內(nèi)核中不存在鍵值與key相等的消息隊(duì)列,則新建一個(gè)消息隊(duì)列;如果存在這樣的消息隊(duì)列,返回此消息隊(duì)列的標(biāo)識(shí)符IPC_CREAT|IPC_EXCL:如果內(nèi)核中不存在鍵值與key相等的消息隊(duì)列,則新建一個(gè)消息隊(duì)列;如果存在這樣的消息隊(duì)列則報(bào)錯(cuò)函數(shù)返回值成功:返回消息隊(duì)列的標(biāo)識(shí)符出錯(cuò):-1,錯(cuò)誤原因存于error中附加說明上述msgflg參數(shù)為模式標(biāo)志參數(shù),使用時(shí)需要與IPC對(duì)象存取權(quán)限(如0600)進(jìn)行|運(yùn)算來確定消息隊(duì)列的存取

3、權(quán)限錯(cuò)誤代碼EACCES:指定的消息隊(duì)列已存在,但調(diào)用進(jìn)程沒有權(quán)限訪問它EEXIST:key指定的消息隊(duì)列已存在,而msgflg中同時(shí)指定IPC_CREAT和IPC_EXCL標(biāo)志ENOENT:key指定的消息隊(duì)列不存在同時(shí)msgflg中沒有指定IPC_CREAT標(biāo)志ENOMEM:需要建立消息隊(duì)列,但內(nèi)存不足ENOSPC:需要建立消息隊(duì)列,但已達(dá)到系統(tǒng)的限制如果用msgget創(chuàng)建了一個(gè)新的消息隊(duì)列對(duì)象時(shí),則msqid_ds結(jié)構(gòu)成員變量的值設(shè)置如下: msg_qnum、msg_lspid、msg_lrpid、 msg_stime、msg_rtime設(shè)置為0。 msg_ctime設(shè)置為當(dāng)前時(shí)間。 m

4、sg_qbytes設(shè)成系統(tǒng)的限制值。 msgflg的讀寫權(quán)限寫入msg_perm.mode中。 msg_perm結(jié)構(gòu)的uid和cuid成員被設(shè)置成當(dāng)前進(jìn)程的有效用戶ID,gid和cuid成員被設(shè)置成當(dāng)前進(jìn)程的有效組ID。2. msgctl函數(shù)原型msgctl (獲取和設(shè)置消息隊(duì)列的屬性)所需頭文件#include #include #include 函數(shù)說明獲取和設(shè)置消息隊(duì)列的屬性函數(shù)原型int msgctl(int msqid, int cmd, struct msqid_ds *buf)函數(shù)傳入值msqid消息隊(duì)列標(biāo)識(shí)符cmdIPC_STAT:獲得msgid的消息隊(duì)列頭數(shù)據(jù)到buf中IPC

5、_SET:設(shè)置消息隊(duì)列的屬性,要設(shè)置的屬性需先存儲(chǔ)在buf中,可設(shè)置的屬性包括:msg_perm.uid、msg_perm.gid、msg_perm.mode以及msg_qbytesbuf:消息隊(duì)列管理結(jié)構(gòu)體,請(qǐng)參見消息隊(duì)列內(nèi)核結(jié)構(gòu)說明部分函數(shù)返回值成功:0出錯(cuò):-1,錯(cuò)誤原因存于error中錯(cuò)誤代碼EACCESS:參數(shù)cmd為IPC_STAT,確無權(quán)限讀取該消息隊(duì)列EFAULT:參數(shù)buf指向無效的內(nèi)存地址EIDRM:標(biāo)識(shí)符為msqid的消息隊(duì)列已被刪除EINVAL:無效的參數(shù)cmd或msqidEPERM:參數(shù)cmd為IPC_SET或IPC_RMID,卻無足夠的權(quán)限執(zhí)行3. msgsnd函數(shù)

6、原型msgsnd (將消息寫入到消息隊(duì)列)所需頭文件#include #include #include 函數(shù)說明將msgp消息寫入到標(biāo)識(shí)符為msqid的消息隊(duì)列函數(shù)原型int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg)函數(shù)傳入值msqid消息隊(duì)列標(biāo)識(shí)符msgp發(fā)送給隊(duì)列的消息。msgp可以是任何類型的結(jié)構(gòu)體,但第一個(gè)字段必須為long類型,即表明此發(fā)送消息的類型,msgrcv根據(jù)此接收消息。msgp定義的參照格式如下: struct s_msg /*msgp定義的參照格式*/ long type; /* 必須大于

7、0,消息類型 */ char mtext256; /*消息正文,可以是其他任何類型*/ msgp;msgsz要發(fā)送消息的大小,不含消息類型占用的4個(gè)字節(jié),即mtext的長度msgflg0:當(dāng)消息隊(duì)列滿時(shí),msgsnd將會(huì)阻塞,直到消息能寫進(jìn)消息隊(duì)列IPC_NOWAIT:當(dāng)消息隊(duì)列已滿的時(shí)候,msgsnd函數(shù)不等待立即返回IPC_NOERROR:若發(fā)送的消息大于size字節(jié),則把該消息截?cái)啵財(cái)嗖糠謱⒈粊G棄,且不通知發(fā)送進(jìn)程。函數(shù)返回值成功:0出錯(cuò):-1,錯(cuò)誤原因存于error中錯(cuò)誤代碼EAGAIN:參數(shù)msgflg設(shè)為IPC_NOWAIT,而消息隊(duì)列已滿EIDRM:標(biāo)識(shí)符為msqid的消息隊(duì)列

8、已被刪除EACCESS:無權(quán)限寫入消息隊(duì)列EFAULT:參數(shù)msgp指向無效的內(nèi)存地址EINTR:隊(duì)列已滿而處于等待情況下被信號(hào)中斷EINVAL:無效的參數(shù)msqid、msgsz或參數(shù)消息類型type小于0 msgsnd()為阻塞函數(shù),當(dāng)消息隊(duì)列容量滿或消息個(gè)數(shù)滿會(huì)阻塞。消息隊(duì)列已被刪除,則返回EIDRM錯(cuò)誤;被信號(hào)中斷返回E_INTR錯(cuò)誤。如果設(shè)置IPC_NOWAIT消息隊(duì)列滿或個(gè)數(shù)滿時(shí)會(huì)返回-1,并且置EAGAIN錯(cuò)誤。msgsnd()解除阻塞的條件有以下三個(gè)條件: 不滿足消息隊(duì)列滿或個(gè)數(shù)滿兩個(gè)條件,即消息隊(duì)列中有容納該消息的空間。 msqid代表的消息隊(duì)列被刪除。 調(diào)用msgsnd函數(shù)的

9、進(jìn)程被信號(hào)中斷。4. msgrcv函數(shù)原型msgrcv (從消息隊(duì)列讀取消息)所需頭文件#include #include #include 函數(shù)說明從標(biāo)識(shí)符為msqid的消息隊(duì)列讀取消息并存于msgp中,讀取后把此消息從消息隊(duì)列中刪除函數(shù)原型ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);函數(shù)傳入值msqid消息隊(duì)列標(biāo)識(shí)符msgp存放消息的結(jié)構(gòu)體,結(jié)構(gòu)體類型要與msgsnd函數(shù)發(fā)送的類型相同msgsz要接收消息的大小,不含消息類型占用的4個(gè)字節(jié)msgtyp0:接收第一個(gè)消息0:接收類型等

10、于msgtyp的第一個(gè)消息0:接收類型等于或者小于msgtyp絕對(duì)值的第一個(gè)消息msgflg0: 阻塞式接收消息,沒有該類型的消息msgrcv函數(shù)一直阻塞等待IPC_NOWAIT:如果沒有返回條件的消息調(diào)用立即返回,此時(shí)錯(cuò)誤碼為ENOMSGIPC_EXCEPT:與msgtype配合使用返回隊(duì)列中第一個(gè)類型不為msgtype的消息IPC_NOERROR:如果隊(duì)列中滿足條件的消息內(nèi)容大于所請(qǐng)求的size字節(jié),則把該消息截?cái)?,截?cái)嗖糠謱⒈粊G棄函數(shù)返回值成功:實(shí)際讀取到的消息數(shù)據(jù)長度出錯(cuò):-1,錯(cuò)誤原因存于error中錯(cuò)誤代碼E2BIG:消息數(shù)據(jù)長度大于msgsz而msgflag沒有設(shè)置IPC_NOE

11、RROREIDRM:標(biāo)識(shí)符為msqid的消息隊(duì)列已被刪除EACCESS:無權(quán)限讀取該消息隊(duì)列EFAULT:參數(shù)msgp指向無效的內(nèi)存地址ENOMSG:參數(shù)msgflg設(shè)為IPC_NOWAIT,而消息隊(duì)列中無消息可讀EINTR:等待讀取隊(duì)列內(nèi)的消息情況下被信號(hào)中斷msgrcv()解除阻塞的條件有以下三個(gè): 消息隊(duì)列中有了滿足條件的消息。 msqid代表的消息隊(duì)列被刪除。 調(diào)用msgrcv()的進(jìn)程被信號(hào)中斷。消息隊(duì)列使用程序范例5. 消息隊(duì)列控制范例msgctl.c源代碼如下:#include #include #include #include #include #include #defin

12、e TEXT_SIZE 512struct msgbuf long mtype ; char mtextTEXT_SIZE ; ;int main(int argc, char *argv) int msqid ; struct msqid_ds info ; struct msgbuf buf ; struct msgbuf buf1 ; int flag ; int sendlength, recvlength ; msqid = msgget( IPC_PRIVATE, 0666 ) ; if ( msqid 0 ) perror(get ipc_id error) ; return -

13、1 ; buf.mtype = 1 ; strcpy(buf.mtext, happy new year!) ; sendlength = sizeof(struct msgbuf) - sizeof(long) ; flag = msgsnd( msqid, &buf, sendlength , 0 ) ; if ( flag 0 ) perror(send message error) ; return -1 ; buf.mtype = 3 ; strcpy(buf.mtext, good bye!) ; sendlength = sizeof(struct msgbuf) - sizeo

14、f(long) ; flag = msgsnd( msqid, &buf, sendlength , 0 ) ; if ( flag 0 ) perror(send message error) ; return -1 ; flag = msgctl( msqid, IPC_STAT, &info ) ; if ( flag 0 ) perror(get message status error) ; return -1 ; printf(uid:%d, gid = %d, cuid = %d, cgid= %dn , info.msg_perm.uid, info.msg_perm.gid,

15、 info.msg_perm.cuid, info.msg_perm.cgid ) ; printf(read-write:%03o, cbytes = %lu, qnum = %lu, qbytes= %lun , info.msg_perm.mode&0777, info.msg_cbytes, info.msg_qnum, info.msg_qbytes ) ; system(ipcs -q) ; recvlength = sizeof(struct msgbuf) - sizeof(long) ; memset(&buf1, 0x00, sizeof(struct msgbuf) ;

16、flag = msgrcv( msqid, &buf1, recvlength ,3,0 ) ; if ( flag 0 ) perror(recv message error) ; return -1 ; printf(type=%d, message=%sn, buf1.mtype, buf1.mtext) ; flag = msgctl( msqid, IPC_RMID,NULL) ; if ( flag 0 ) perror(rm message queue error) ; return -1 ; system(ipcs -q) ; return 0 ;編譯 gcc msgctl.c

17、 o msgctl。執(zhí)行 ./msg,執(zhí)行結(jié)果如下:uid:1008, gid = 1003, cuid = 1008, cgid= 1003read-write:666, cbytes = 1024, qnum = 2, qbytes= - Message Queues -key msqid owner perms used-bytes messages0x 65536 zjkf 666 1024 2type=3, message=good bye!- Message Queues -key msqid owner perms used-bytes messages6. 兩進(jìn)程通過消息隊(duì)列收

18、發(fā)消息(1)發(fā)送消息隊(duì)列程序msgsnd.c源代碼如下:#include #include #include #include #include #include #define TEXT_SIZE 512struct msgbuf long mtype ; int status ; char time20 ; char mtextTEXT_SIZE ; ;char *getxtsj() time_t tv ; struct tm *tmp ; static char buf20 ; tv = time( 0 ) ; tmp = localtime(&tv) ; sprintf(buf,%02

19、d:%02d:%02d,tmp-tm_hour , tmp-tm_min,tmp-tm_sec); return buf ;int main(int argc, char *argv) int msqid ; struct msqid_ds info ; struct msgbuf buf ; struct msgbuf buf1 ; int flag ; int sendlength, recvlength ; int key ; key = ftok(msg.tmp, 0x01 ) ; if ( key 0 ) perror(ftok key error) ; return -1 ; ms

20、qid = msgget( key, 0600|IPC_CREAT ) ; if ( msqid 0 ) perror(create message queue error) ; return -1 ; buf.mtype = 1 ; buf.status = 9 ; strcpy(buf.time, getxtsj() ; strcpy(buf.mtext, happy new year!) ; sendlength = sizeof(struct msgbuf) - sizeof(long) ; flag = msgsnd( msqid, &buf, sendlength , 0 ) ;

21、if ( flag 0 ) perror(send message error) ; return -1 ; buf.mtype = 3 ; buf.status = 9 ; strcpy(buf.time, getxtsj() ; strcpy(buf.mtext, good bye!) ; sendlength = sizeof(struct msgbuf) - sizeof(long) ; flag = msgsnd( msqid, &buf, sendlength , 0 ) ; if ( flag 0 ) perror(send message error) ; return -1

22、; system(ipcs -q) ; return 0 ;(2)接收消息隊(duì)列程序msgrcv.c源代碼如下:#include #include #include #include #include #define TEXT_SIZE 512struct msgbuf long mtype ; int status ; char time20 ; char mtextTEXT_SIZE ; ;int main(int argc, char *argv) int msqid ; struct msqid_ds info ; struct msgbuf buf1 ; int flag ; int recvlength ; int key ; int mtype ; key = ftok(msg.tmp, 0x01 ) ; if ( key 0

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論