免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2073 | 回复: 0
打印 上一主题 下一主题

[C] 各位大人来讲讲啊..posix ipc消息队列 [复制链接]

论坛徽章:
3
巳蛇
日期:2013-10-03 10:41:48申猴
日期:2014-07-29 16:12:04天蝎座
日期:2014-08-21 09:24:52
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-05 22:37 |只看该作者 |倒序浏览
公司的ipc基本上都是封装的,所以平时没写过,也不怎么熟悉.
并且大致看了下,好像都是system v的...

突然想熟悉下 posix ipc, 直接就用消息队列来学习下了.
代码如下,边写边加信息,比较烂..


send.c
创建消息队列,向里面添加数据.
recv.c
读数据.

问题主要是两个..
1,
  1. cc -Wall -g -I./ send.c -o send -lrt
  2. /tmp/ccbJPjDr.o: In function `main':
  3. /home/prog/test/c/ipc/send.c:23: warning: warning: mq_getattr is not implemented and will always fail
  4. /home/prog/test/c/ipc/send.c:27: warning: warning: mq_setattr is not implemented and will always fail
复制代码
mq_open完全没报这个warning啊..
虽然也能运行,但这个warning看着真搁眼..并且不知道为啥报个这东西.

2, 执行起来行为好奇怪..
这个send,应该直接一下就跑完了吧(想象中),实际不是,经常在i=10的时候就阻塞掉了,有一两次在i=0的时候就阻塞了(应该是mq_send阻塞,根据printf打印推断..).
只有启动recv后, send程序才能继续send..
不明白为啥看起来会阻塞..


send.c
  1. #include  "inc.h"

  2. int main(void)
  3. {
  4.         mqd_t mq_id,mq_check;
  5.         int i;
  6.         char c;
  7.         struct mq_attr attr;
  8.         struct mq_attr nattr;


  9.         setvbuf(stdout, NULL, _IONBF, 0);

  10.         printf("begin...\n");
  11.         mq_id = mq_open(MQ_NAME, O_RDWR|O_CREAT, S_IRWXU, NULL);
  12.         if(mq_id == (mqd_t) -1) {
  13.                 printf("mq_open err[%d], %s\n",
  14.                         errno, strerror(errno));
  15.                 return -1;
  16.         }
  17.         mq_getattr(mq_id, &attr);
  18.         memcpy(&nattr, &attr, sizeof(struct mq_attr));
  19.         nattr.mq_maxmsg = 100;
  20.         nattr.mq_msgsize = 100;
  21.         mq_setattr(mq_id, &nattr, &attr);

  22.         for(i=0; i<=NUM; i++)  {
  23.                 c = (char)i+'0';
  24.                 if(i>=10)
  25.                         c='a';
  26.                 printf("%2d ", i);
  27.                 mq_check = mq_send(mq_id, (char *)&c, sizeof(c), i*10);
  28.                 if(mq_check == (mqd_t) -1) {
  29.                         printf("mq_send err[%d], %s\n",
  30.                                         errno, strerror(errno));
  31.                         return -1;
  32.                 }
  33.                 printf(".\n");
  34.         }
  35.         printf("end...\n");


  36.         return 0;
  37. }
复制代码
recv.c
  1. #include  "inc.h"

  2. int main(void)
  3. {
  4.         mqd_t mq_id,mq_check;
  5.         int i,prio;
  6.         void *buff;
  7.         struct mq_attr attr;

  8.         setvbuf(stdout, NULL, _IONBF, 0);
  9.         mq_id = mq_open(MQ_NAME, O_RDONLY);
  10.         if(mq_id == (mqd_t) -1) {
  11.                 printf("mq_open err[%d], %s\n",
  12.                         errno, strerror(errno));
  13.                 return -1;
  14.         }
  15.         mq_getattr(mq_id, &attr);
  16.         buff = malloc(attr.mq_msgsize);

  17.         for(i=0; i<=NUM; i++)  {
  18.                 mq_check = mq_receive(mq_id, buff, attr.mq_msgsize, (unsigned *)&prio);
  19.                 if(mq_check ==  -1) {
  20.                         printf("mq_receive err[%d], %s\n",
  21.                                 errno, strerror(errno));
  22.                         return -1;
  23.                 }
  24.                 printf("[%s][%d] : %d %d %c\n",__FILE__,__LINE__, prio, mq_check, ((int *)buff)[0]);
  25.                 sleep(1);
  26.         }
  27.         printf("\n");


  28.         return 0;
  29. }
复制代码
inc.h
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <errno.h>


  5. #include <mqueue.h>


  6. #include <sys/types.h>
  7. #include <unistd.h>

  8. #define MQ_NAME "/abctest"
  9. #define PRIO_A 1
  10. #define NUM 20
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP