Я пытаюсь заставить процессы взаимодействовать и формировать группы через очереди сообщений.
В этом случае процесс разветвляется на несколько детей, которые общаются.
Что меня действительно беспокоит, так это тот факт, что при входе в конкретную функцию, которая использует как очередь сообщений, так и некоторые переменные, которые мне нужно изменить вместе с ней, доступ к разыменованным значениям, кажется, останавливает выполнение процесса (и других тоже, поскольку он). не «освобождает» семафор, которым они делятся), пока родительский процесс не остановит своих потомков и не начнет делать что-то еще.
struct msgbuf {
long mtype;
int mtext[2];
};
Это msgbuf, который я использую.
int checkMsg(int msgid, struct msgbuf messaggio, int voto, int * partner, int * took, int * rejects, int *pending){
...
while(msgrcv(msgid, &messaggio, sizeof(messaggio), getpid(), IPC_NOWAIT) != -1){
if(messaggio.mtext[0]==1){
printf("%s\n", strerror(errno)); // this is shown in the terminal
printf("%d\n", * partner); // this is not shown, blocking the execution
* partner = messaggio.mtext[1];
* took = 1;
* pending = *pending - 1;
refuseInvites(msgid, messaggio);
return 1;
}
...
}
...
}
А это проблемный кусок кода.
Я попытался изменить второй printf на output * взял, и это происходит, но затем выполнение снова останавливается (я предполагаю, что * партнер принимается во внимание). значение партнера должно быть установлено в 0 перед входом в функцию, а messaggio.mtext [1] является идентификатором процесса.
Я ожидаю, что функция не остановится и будет успешно возвращена, обеспечивая согласованность данных.
РЕДАКТИРОВАТЬ: вызов checkMsg () это:
taken = checkMsg(msgid, messaggio, voto, &partner, &took, &rejects, &pending);
partner, take, reject и pending устанавливаются в 0 перед разветвлением
РЕДАКТИРОВАТЬ 2: все переменные имеют тип int, и подпись checkMsg включается в заголовок перед запуском программы.