我试图了解消息队列的工作原理。我创建了这个小程序,其中子进程向父进程发送消息。大多数时候,它都有效,但有时我会收到错误:Error parent: No message of desired type
。我还尝试wait
让子进程完成,但我仍然会收到错误。
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
int main(){
struct msg{
long mtype;
char text[100];
};
int key = ftok(".", 10);
int qid = msgget(key, 0666|IPC_CREAT);
int pid = fork();
if(pid == 0){
struct msg send;
send.mtype = 1;
strcpy(send.text, "hello");
if(msgsnd(qid, (void*)&send, strlen(send.text), IPC_NOWAIT)<0){
printf("Error child: ");
}
}
else{
struct msg recieve;
if(msgrcv(qid, (void*)&recieve, 100, 1, IPC_NOWAIT)<0){
perror("Error parent: ");
};
printf("%s\n", recieve.text);
}
return 0;
}
感谢。
答案 0 :(得分:1)
http://pubs.opengroup.org/onlinepubs/7908799/xsh/msgrcv.html
参数msgflg指定在队列中没有所需类型的消息时要采取的操作。具体如下:
- 如果(msgflg&amp; IPC_NOWAIT)非零,则调用线程将立即返回,返回值为-1,errno设置为[ENOMSG] ...
您正在指定computeIfPresent
,这意味着您没有给予子进程足够的时间来生成任何消息。如果从参数ConcurrentHashMap
中删除它,即
computeIfPresent
父进程将阻塞,直到队列中有可用的东西。