C: доступ или попытка изменить переданную переменную в определенном сегменте функции, включающей очереди сообщений, останавливает процесс - PullRequest
0 голосов
/ 01 мая 2019

Я пытаюсь заставить процессы взаимодействовать и формировать группы через очереди сообщений. В этом случае процесс разветвляется на несколько детей, которые общаются. Что меня действительно беспокоит, так это тот факт, что при входе в конкретную функцию, которая использует как очередь сообщений, так и некоторые переменные, которые мне нужно изменить вместе с ней, доступ к разыменованным значениям, кажется, останавливает выполнение процесса (и других тоже, поскольку он). не «освобождает» семафор, которым они делятся), пока родительский процесс не остановит своих потомков и не начнет делать что-то еще.

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 включается в заголовок перед запуском программы.

...