(msgrcv(iMsgid2, buff, iType, 100, 0) == -1
[root@localhost root]# ./msgsnd0 -- hello
1 -- aaa
2 -- hello
3 -- hello
4 -- hello
5 -- hello
6 -- hello
7 -- hello
8 -- hello
9 -- end
[root@localhost root]# ./msgrcv
------- hello ------ 0 -- hello
------- aaa ------ 1 -- aaa
------- hello ------ 2 -- hello
------- hello ------ 3 -- hello
------- hello ------ 4 -- hello
------- hello ------ 5 -- hello
------- hello ------ 6 -- hello
------- hello ------ 7 -- hello
------- hello ------ 8 -- hello
------- end ------ 9 -- end
[root@localhost root]#
msgrcv权限是不是有问题?我不太清楚你要什么样的结果
一般使用步骤:1. 用ftok产生一个key。
2. 调用msgget(使用key作为参数)产生一个队列
3. 进程可以用msgsnd发送消息到这个队列,相应的别的进程用msgrcv读取。
这里需要注意msgsnd可能会失败的两个情况:
a) 可能被中断打断(包括msgsnd和msgrcv). 尤其是大流量应用中更容易出现. 比较安全的用法是判断 *** 作是否被中断打断,如果被打断,则需要继续尝试。
b) 消息队列满。产生这个错误,则需要考虑提高系统消息队列规格,或者查看消息接收处是否有问题
4. msgctl函数可以用来删除消息队列
消息队列产生之后,除非明确的删除(可以用),产生的队列会一直保留在系统中。linux下消息队列的个数是有限的,注意不要泄露。如果 使用已经达到上限,msgget调用会失败,产生的错误码对应的提示信息为no space left on device.
注意点:
1.消息的类型 mtype 不需为非0值。如果使用0,则msgsnd会失败,并得到”Invalid argument“错误。
2.msgflg为0表示阻塞等待,如果msgflg为IPC_NOWAIT表示非阻塞。
3.最好使用root权限执行消息队列,否则msgrcv 提示 "Permission denied"。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)