日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

msgrcv函数

發(fā)布時(shí)間:2025/3/13 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 msgrcv函数 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

msgrcv()函數(shù)被用來(lái)從消息隊(duì)列中取出消息。它在linux/msg.h
中的定義是這樣的:
系統(tǒng)調(diào)用: msgrcv()
函數(shù)聲明: int msgrcv ( int msqid, struct msgbuf *msgp, int msgsz, long
mtype,
int msgflg )
返回值: Number of bytes copied into message buffer
-1 on error: errno = E2BIG (Message length is greater than
msgsz,
no MSG_NOERROR)
EACCES (No read permission)
EFAULT (Address pointed to by msgp is
invalid)
EIDRM (Queue was removed during
retrieval)
EINTR (Interrupted by arriving signal)
EINVAL (msgqid invalid, or msgsz less than 0)
ENOMSG (IPC_NOWAIT asserted, and no
message
exists in the queue to satisfy the
request)
函數(shù)的前三個(gè)參數(shù)和msgsnd()函數(shù)中對(duì)應(yīng)的參數(shù)的含義是相同的。第四個(gè)參數(shù)mtype
指定了函數(shù)從隊(duì)列中所取的消息的類型。函數(shù)將從隊(duì)列中搜索類型與之匹配的消息并將之
返回。不過(guò)這里有一個(gè)例外。如果mtype 的值是零的話,函數(shù)將不做類型檢查而自動(dòng)返回
隊(duì)列中的最舊的消息。
第五個(gè)參數(shù)依然是是控制函數(shù)行為的標(biāo)志,取值可以是:
0,表示忽略;
IPC_NOWAIT,如果消息隊(duì)列為空,則返回一個(gè)ENOMSG,并將控制權(quán)交回調(diào)用函數(shù)
的進(jìn)程。如果不指定這個(gè)參數(shù),那么進(jìn)程將被阻塞直到函數(shù)可以從隊(duì)列中得到符合條件的
消息為止。如果一個(gè)client 正在等待消息的時(shí)候隊(duì)列被刪除,EIDRM 就會(huì)被返回。如果進(jìn)
程在阻塞等待過(guò)程中收到了系統(tǒng)的中斷信號(hào),EINTR 就會(huì)被返回。
MSG_NOERROR,如果函數(shù)取得的消息長(zhǎng)度大于msgsz,將只返回msgsz 長(zhǎng)度的信息,
剩下的部分被丟棄了。如果不指定這個(gè)參數(shù),E2BIG 將被返回,而消息則留在隊(duì)列中不被
取出。
當(dāng)消息從隊(duì)列內(nèi)取出后,相應(yīng)的消息就從隊(duì)列中刪除了。
我們將開(kāi)發(fā)一個(gè)msgrcv()的封裝函數(shù)read_message():
int read_message( int qid, long type, struct mymsgbuf *qbuf )
{
int result, length;
/* The length is essentially the size of the structure minus sizeof(mtype) */
length = sizeof(struct mymsgbuf) - sizeof(long);
if((result = msgrcv( qid, qbuf, length, type, 0)) == -1)
{
return(-1);
}
return(result);
}
利用上面提到的msgrcv()對(duì)消息長(zhǎng)度的處理,我們可以使用下面的方法來(lái)檢查隊(duì)列內(nèi)
是存在符合條件的信息:
int peek_message( int qid, long type )
{
int result, length;
if((result = msgrcv( qid, NULL, 0, type, IPC_NOWAIT)) == -1)
{
if(errno == E2BIG)
return(TRUE);
}
return(FALSE);
}
這里我們將msgp 和msgsz 分別設(shè)為NULL 和零。然后檢查函數(shù)的返回值,如果是E2BIG
則說(shuō)明存在符合指定類型的消息。一個(gè)要注意的地方是IPC_NOWAIT 的使用,它防止了阻塞

轉(zhuǎn)載于:https://www.cnblogs.com/wangchaoguo-li/archive/2012/11/07/2758506.html

總結(jié)

以上是生活随笔為你收集整理的msgrcv函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。