永发信息网

linux 消息队列接收端如何知道有消息过来了

答案:2  悬赏:0  手机版
解决时间 2021-03-23 05:43
  • 提问者网友:山高云阔
  • 2021-03-23 00:39
各位好!最近用消息队列做多进程数据传递,想请教一个问题,数据接收端msgrcv如何知道队列里是否有消息呢,我看网上的例子一般都是while(1)循环接收,有没有对消息队列监听判断之类的处理?还有,是否调用msgrcv函数之后,队列里的该消息就自动删除了?非常感谢
最佳答案
  • 五星知识达人网友:玩世
  • 2021-03-23 01:58
好像没有判断消息队列是否有消息可读的机制(不像网络的select可通过结果得到可读可写的socket状态),你只要用msgrcv()循环去读取就好了 如果消息有类型 可以根据特定的类型去读,不设置类型去读的话就会读走队列的第一条,队列的消息读取之后就从队列里面移出了。
全部回答
  • 1楼网友:山有枢
  • 2021-03-23 02:15
我的作业,你凑合着用吧 //msgq_send.c #include #include #include #define maxsize 256 int main(int argc, char *argv[]) { if (argc < 2) { printf("error args\n"); return -1; } int msgid; msgid = msgget((key_t)2000, ipc_creat | 0644); if (msgid == -1) { printf("msgget error\n"); return -1; } if (msgsnd(msgid, (void *)argv[1], maxsize, 0) == -1) { printf("msgsnd error\n"); return -1; } return 0; } //msgq_recv.c #include #include #include #define maxsize 256 int main(void) { int msgid; int msgsize; char buff[maxsize]; msgid = msgget((key_t)2000, ipc_creat | 0644); if (msgid == -1) { printf("msgget error\n"); return -1; } msgsize = msgrcv(msgid, (void *)&buff, maxsize, 0, 0); if (msgsize == -1) { printf("msgrcv error\n"); return -1; } printf("%s\n", buff); return 0; } //makefile target := msgq_send msgq_recv cc := gcc cflags := -wall -g all: msgq_send msgq_recv msgq_send: msgq_send.o $(cc) $(cflags) $^ -o $@ msgq_recv: msgq_recv.o $(cc) $(cflags) $^ -o $@ clean: rm -fr *.o $(target) .phony :clean
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯