免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 6148 | 回复: 6

请教关于posix消息队列无法设置阻塞超时的问题 [复制链接]

论坛徽章:
0
发表于 2009-01-09 10:20 |显示全部楼层
请教老鸟:

小菜在一个线程中创建一个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编译后都如此,请问我的问题可能出在哪里?

论坛徽章:
0
发表于 2009-01-09 16:22 |显示全部楼层
希望大大们能够不吝指教,这个问题困惑小弟有段时间了,多谢了

论坛徽章:
0
发表于 2009-01-12 08:44 |显示全部楼层
没有人用过么

论坛徽章:
0
发表于 2010-10-26 16:21 |显示全部楼层
快两年了,也没有人回复,还是自己回复吧,以防有跟偶一样遇到这个问题的小菜搜到这篇帖子。

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

论坛徽章:
0
发表于 2010-10-26 17:20 |显示全部楼层
orz……

论坛徽章:
0
发表于 2018-11-23 13:01 |显示全部楼层
thanks,orz。。。

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
发表于 2018-11-23 22:49 |显示全部楼层
支持楼主挖坟。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

数据风云,十年变迁
DTCC 第十届中国数据库技术大会已启航!

2019年5月8日~5月10日,由IT168旗下ITPUB企业社区平台主办的第十届中国数据库技术大会(DTCC2019),将在北京隆重召开。大会将邀请百余位行业专家,就热点技术话题进行分享,是广大数据领域从业人士的又一次年度盛会和交流平台。与SACC2018类似,本届大会将采用“3+2”模式:3天传统技术演讲+2天深度主题培训。大会不仅提供超100场的主题演讲,还会提供连续2天的深度课程培训,深化数据领域的项目落地实践方案。
DTCC2019,一场值得期待的数据技术盛会,殷切地希望您报名参与!

活动入口>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP