Я пытаюсь настроить демонстрации различных IPC между родительскими и дочерними процессами. У меня нет конвейера и реализации совместно используемой памяти, но по какой-то причине мне очень трудно использовать очередь сообщений POSIX.
Кажется, есть много ошибок, когда я позволяю двум процессам бесконечно зацикливаться (в то время как родитель отправляет произвольный текст, а потомок получает и выводит его). Нужна ли некоторая синхронизация за пределами внутренней блокировки очереди сообщений, чтобы предотвратить это? Я видел, что очереди сообщений 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);
}
Я намерен, чтобы Ребенок получил все, отправленное родителем, и распечатал его, но иногда он выходит без сообщений в очереди, ничего не печатая, или просто печатает «Друзья!». Кто-нибудь знает, что я могу делать неправильно?
Задача ещё не решена.
Других решений пока нет …