freedon 发表于 2009-01-09 10:20

请教关于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编译后都如此,请问我的问题可能出在哪里?

freedon 发表于 2009-01-09 16:22

希望大大们能够不吝指教,这个问题困惑小弟有段时间了,多谢了

freedon 发表于 2009-01-12 08:44

没有人用过么:em16:

freedon 发表于 2010-10-26 16:21

快两年了,也没有人回复,还是自己回复吧,以防有跟偶一样遇到这个问题的小菜搜到这篇帖子。

linux中的mq_timedreceive需要用“绝对时间”来阻塞,也就是说,如果你要阻塞一秒,需要先取得系统时间,再在系统时间上加一秒,把得到的结果做为mq_timedreceive的参加设回去就OK啦:mrgreen:

jerryz920 发表于 2010-10-26 17:20

orz……

糗友泛 发表于 2018-11-23 13:01

thanks,orz。。。

cokeboL 发表于 2018-11-23 22:49

支持楼主挖坟。。
页: [1]
查看完整版本: 请教关于posix消息队列无法设置阻塞超时的问题