我正在尝试在父进程和子进程之间设置不同IPC的演示。我有管道和共享内存实现,但由于某种原因,我很难使用POSIX消息队列。
当我让两个进程无限循环时(父进程发送任意文本并且子进程检索并输出),似乎存在很多错误。我是否需要在固有的Message Queue阻止之外进行一些同步来防止这种情况?我已经看到POSIX消息队列允许信令。我应该以某种方式利用这个吗?我想我的问题是我不熟悉它们的使用情况,而且我发现的消息传递的具体例子并不多。
这是我目前的代码:
pid = fork();
if(pid == 0){ //Welcome Child Process
char buf[LIM];
unsigned int prio;
int errchkc;
if((mqdp = mq_open(QUENAME, O_CREAT | O_RDONLY, 0666, 0)) == -1){
perror("mq_open() Child");
exit(1);
}
errchkc = mq_getattr(mqdp, &attrc);
if(DEBUG){
cout << "mq_getattr status: " << errchkc <<" Messages in the Queue: " << attrc.mq_curmsgs <<endl;
}
while(mq_receive(mqdp, buf, LIM, &prio) != -1){
printf("RECEIVED: %s \n", buf);
memset(&buf[0], 0, sizeof(buf));
}
mq_close(mqdp);
//}
}else if(pid < 0){
cout << "ERROR: Process fork() experienced an issue...";
}else{ //Keep going Parent Process
int errchkp;
int prio = 1;
char buf[LIM];
char* msg = "Friends!";
strncpy(buf, msg, LIM);
if((mqdp = mq_open(QUENAME, O_CREAT | O_WRONLY, 0666, 0)) == -1){
perror("mq_open() Parent");
exit(1);
}
if((errchkp = mq_send(mqdp, msg, sizeof(msg), prio)) == -1){
perror("mq_send()");
exit(1);
}
char* msg2 = "Enemies!";
if((errchkp = mq_send(mqdp, msg2, sizeof(msg2), prio)) == -1){
perror("mq_send()");
exit(1);
}
mq_close(mqdp);
}
我打算让孩子接收父母发送的所有内容并将其打印出来,但有时它会在没有打印任何内容的情况下退出队列中没有消息,或者它只是打印“好友!”有没有人知道我可能做错了什么?