Очереди сообщений POSIX для передачи текста между родительским и дочерним процессами

Я пытаюсь настроить демонстрации различных 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);
}

Я намерен, чтобы Ребенок получил все, отправленное родителем, и распечатал его, но иногда он выходит без сообщений в очереди, ничего не печатая, или просто печатает «Друзья!». Кто-нибудь знает, что я могу делать неправильно?

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector