永发信息网

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

答案:2  悬赏:0  手机版
解决时间 2021-03-23 05:43
各位好!最近用消息队列做多进程数据传递,想请教一个问题,数据接收端msgrcv如何知道队列里是否有消息呢,我看网上的例子一般都是while(1)循环接收,有没有对消息队列监听判断之类的处理?还有,是否调用msgrcv函数之后,队列里的该消息就自动删除了?非常感谢
最佳答案
好像没有判断消息队列是否有消息可读的机制(不像网络的select可通过结果得到可读可写的socket状态),你只要用msgrcv()循环去读取就好了 如果消息有类型 可以根据特定的类型去读,不设置类型去读的话就会读走队列的第一条,队列的消息读取之后就从队列里面移出了。
全部回答
我的作业,你凑合着用吧 //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
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
求高中数学论文,800字左右。谢谢!!
感慨高中的美文,高中的抒情散文有哪些
原味烤花生怎么做
在日本旅游,怎样寻找和挑选合适的民宿
--We could have asked Mr. Zhang for help.
江天大酒店(北门)地址在哪,我要去那里办事
whoo水研天热起来味道会大起来吗
学会计和IT那个更好发展和就业
木易造型在什么地方啊,我要过去处理事情
金立手机不小心按了出厂设置 黑屏了 怎么办
中国联通肃州营业厅地址有知道的么?有点事想
微信群里的图片怎么删除?让所有人都看不到《
单选题3.9g镁铝合金恰好完全溶解于120mL4mol
生产制造车间标语大全,气温太高有没有可能是
阿迪达斯翻毛皮鞋怎么洗?不要复制的,亲自做
推荐资讯
有国家标准安全帽GB2811电子版吗
新飞双筒九点五公斤洗衣机956115 BS价格多少
废电池随处丢弃会造成什么样的污染?
常徳到东莞的火车票
《左忠毅公逸事》中写了左光头和史可法的哪些
从北京到随州市大巴要多少车费??
变速箱油多少公里更换,为什么换了变速箱油后
男的每次拉女的手都会说一句,你的手怎么总这
拼音打字一天500字坚持多久才能达到每分钟70
MLA的翻译是:什么意思
龙岩十大企业
佛山公交时间表?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?