请教关于posix消息队列无法设置阻塞超时的问题
请教老鸟:小菜在一个线程中创建一个posix消息队列,用mq_timedreceive来阻塞接收,发现在消息队列空的时候,并没有等待超时时间到达,而是立即返回。
不知道小菜在哪里出了问题,还望老鸟给于指教。
RHEL AS5.1内核版本2.6.18
代码如下:
消息队列创建:
struct mq_attr newattr;
mq_unlink("/mqLcd");
newattr.mq_maxmsg = 10;
newattr.mq_curmsgs =0;
newattr.mq_msgsize = sizeof(STRU_LCDMSG);
if(ERROR == (msgQIdLcd = mq_open("/mqLcd", O_RDWR|O_CREAT, 0x777, &newattr)))
{
PDBG_L0("LCD消息队列创建错误!\n");
perror("<errno>");
return;
}
接收消息队列如下:
struct timespec tmout;
tmout.tv_sec = 6;
if(ERROR != (rcvlen = mq_timedreceive(msgQIdLcd, (char*)&struLcdMsgTmp, sizeof(STRU_LCDMSG), (unsigned *)NULL, (const struct timespec *)&tmout)))
//if(ERROR != (rcvlen = mq_receive(msgQIdLcd, (char*)&struLcdMsgTmp, sizeof(STRU_LCDMSG), (unsigned *)NULL)))
{
printf("receive a data, len = %d\n", rcvlen);
}
else
{
printf("rcv timeout\n");
perror("<error>");
printf("errno = %d\n", errno);
}
小菜偶发现用mq_receive可以正常阻塞,但用mq_timedreceive或mq_timedsend就会立即返回,用gcc或arm-linux-gcc编译后都如此,请问我的问题可能出在哪里? 希望大大们能够不吝指教,这个问题困惑小弟有段时间了,多谢了 没有人用过么:em16: 快两年了,也没有人回复,还是自己回复吧,以防有跟偶一样遇到这个问题的小菜搜到这篇帖子。
linux中的mq_timedreceive需要用“绝对时间”来阻塞,也就是说,如果你要阻塞一秒,需要先取得系统时间,再在系统时间上加一秒,把得到的结果做为mq_timedreceive的参加设回去就OK啦:mrgreen: orz…… thanks,orz。。。 支持楼主挖坟。。
页:
[1]