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
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯