- 论坛徽章:
- 3
|
公司的ipc基本上都是封装的,所以平时没写过,也不怎么熟悉.
并且大致看了下,好像都是system v的...
突然想熟悉下 posix ipc, 直接就用消息队列来学习下了.
代码如下,边写边加信息,比较烂..
send.c
创建消息队列,向里面添加数据.
recv.c
读数据.
问题主要是两个..
1,- cc -Wall -g -I./ send.c -o send -lrt
- /tmp/ccbJPjDr.o: In function `main':
- /home/prog/test/c/ipc/send.c:23: warning: warning: mq_getattr is not implemented and will always fail
- /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- #include "inc.h"
- int main(void)
- {
- mqd_t mq_id,mq_check;
- int i;
- char c;
- struct mq_attr attr;
- struct mq_attr nattr;
- setvbuf(stdout, NULL, _IONBF, 0);
- printf("begin...\n");
- mq_id = mq_open(MQ_NAME, O_RDWR|O_CREAT, S_IRWXU, NULL);
- if(mq_id == (mqd_t) -1) {
- printf("mq_open err[%d], %s\n",
- errno, strerror(errno));
- return -1;
- }
- mq_getattr(mq_id, &attr);
- memcpy(&nattr, &attr, sizeof(struct mq_attr));
- nattr.mq_maxmsg = 100;
- nattr.mq_msgsize = 100;
- mq_setattr(mq_id, &nattr, &attr);
- for(i=0; i<=NUM; i++) {
- c = (char)i+'0';
- if(i>=10)
- c='a';
- printf("%2d ", i);
- mq_check = mq_send(mq_id, (char *)&c, sizeof(c), i*10);
- if(mq_check == (mqd_t) -1) {
- printf("mq_send err[%d], %s\n",
- errno, strerror(errno));
- return -1;
- }
- printf(".\n");
- }
- printf("end...\n");
- return 0;
- }
复制代码 recv.c- #include "inc.h"
- int main(void)
- {
- mqd_t mq_id,mq_check;
- int i,prio;
- void *buff;
- struct mq_attr attr;
- setvbuf(stdout, NULL, _IONBF, 0);
- mq_id = mq_open(MQ_NAME, O_RDONLY);
- if(mq_id == (mqd_t) -1) {
- printf("mq_open err[%d], %s\n",
- errno, strerror(errno));
- return -1;
- }
- mq_getattr(mq_id, &attr);
- buff = malloc(attr.mq_msgsize);
- for(i=0; i<=NUM; i++) {
- mq_check = mq_receive(mq_id, buff, attr.mq_msgsize, (unsigned *)&prio);
- if(mq_check == -1) {
- printf("mq_receive err[%d], %s\n",
- errno, strerror(errno));
- return -1;
- }
- printf("[%s][%d] : %d %d %c\n",__FILE__,__LINE__, prio, mq_check, ((int *)buff)[0]);
- sleep(1);
- }
- printf("\n");
- return 0;
- }
复制代码 inc.h- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <errno.h>
- #include <mqueue.h>
- #include <sys/types.h>
- #include <unistd.h>
- #define MQ_NAME "/abctest"
- #define PRIO_A 1
- #define NUM 20
复制代码 |
|