msgrcv函数
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é)
- 上一篇: Porter Stemming Algo
- 下一篇: 使用API动态添加删除菜单项