想要把msgrcv 包装成可以指定阻塞时间的函数,我是这样做的,不知是否可行,有没有设计不足。
int my_msgrcv(int msgid,void * msg,int len,long msgtype,int sec)
{
struct sigaction saNew, saOld;
saNew.sa_handler = handler;
sigemptyset(&saNew.sa_mask);
sigaddset(&saNew.sa_mask, SIGALRM);
saNew.sa_flags = 0;
sigaction(SIGALRM, &saNew, &saOld);
alarm(sec);
int ret =msgrcv(msgid,msg,len,msgtype,0);
alarm(0);
sigaction(SIGALRM, &saOld, NULL);
return ret;
}
完全不需要,可以探测消息队列中的消息。 用循环+sleep 来探测,超出次数认为失败。记得把请求的msgsnd的消息取出来
```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);
}