Синхронизация доступа к pipe посредством сигналов

Синхронизация доступа к pipe посредством сигналов

11.12.2019 03:56:08 Просмотров 29 Источник

Два процесса с общим родителем должны обменяться пидами посредством одного канала pipe. Мой код:

int pipes[2];
pipe(pipes);
FILE *out = fdopen(pipes[1], "w");
FILE *in = fdopen(pipes[0], "r");
setvbuf(stdout, NULL, _IONBF, 0);
setvbuf(out, NULL, _IONBF, 0);
sigset_t *set = malloc(sizeof(sigset_t));
sigemptyset(set);
sigaddset(set, SIGUSR1);
pid_t first = fork();
if (!first) {
    pid_t brot;
    fprintf(out, "%d\n", getpid());
    sigwait(set, NULL);
    fscanf(in, "%d", &brot);
    printf("Second PID = %d\n", brot);
    exit(0);
}
pid_t second = fork();
if (!second) {
    pid_t brot;
    fscanf(in, "%d", &brot);
    kill(brot, SIGUSR1);
    fprintf(out, "%d\n", getpid());
    printf("First PID = %d\n", brot);
    exit(0);
}

Потом в родителе закрываю все дескрипторы и завершаю программу. При выводе появляется лишь строчка "First PId = x", где х - значение. Почему не выводится вторая строчка?Складывается ощущение, что первый сын не получает сигнал от килл, но почему - непонятно. Вроде бы посылаться сигнал должен гарантированно после того, как первый процесс попадет в режим ожидания. В чем может быть проблема?

У вопроса есть решение - Посмотреть?

Ответы - Синхронизация доступа к pipe посредством сигналов / Синхронизация доступа к pipe посредством сигналов

Является ответом!
avp

12.12.2019 12:45:13

Думаю, проблема в том, что вы обработчик сигнала SIGUSR1 (надо вызвать sigaction() или signal()) не установили. Вот процесс first и умирает...

А также sigwait(set, NULL); у вас не должен нормально компилироваться, задайте во втором аргументе адрес переменой.

https://ru.stackoverflow.com/questions/1057307/%d0%a1%d0%b8%d0%bd%d1%85%d1%80%d0%be%d0%bd%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%8f-%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%b0-%d0%ba-pipe-%d0%bf%d0%be%d1%81%d1%80%d0%b5%d0%b4%d1%81%d1%82%d0%b2%d0%be%d0%bc-%d1%81%d0%b8%d0%b3%d0%bd%d0%b0%d0%bb%d0%be%d0%b2/1057519#comment1808847_1057519
Спасибо большое, правки решили проблему
https://ru.stackoverflow.com/questions/1057307/%d0%a1%d0%b8%d0%bd%d1%85%d1%80%d0%be%d0%bd%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%8f-%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%b0-%d0%ba-pipe-%d0%bf%d0%be%d1%81%d1%80%d0%b5%d0%b4%d1%81%d1%82%d0%b2%d0%be%d0%bc-%d1%81%d0%b8%d0%b3%d0%bd%d0%b0%d0%bb%d0%be%d0%b2/1057519#comment1809364_1057519
Я вчера, кстати, копался в этом — подвесил SIGUSR1 на SIG_IGN и у меня first зависал в sigwait... есть идеи, почему?
https://ru.stackoverflow.com/questions/1057307/%d0%a1%d0%b8%d0%bd%d1%85%d1%80%d0%be%d0%bd%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%8f-%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%b0-%d0%ba-pipe-%d0%bf%d0%be%d1%81%d1%80%d0%b5%d0%b4%d1%81%d1%82%d0%b2%d0%be%d0%bc-%d1%81%d0%b8%d0%b3%d0%bd%d0%b0%d0%bb%d0%be%d0%b2/1057519#comment1809716_1057519
@Fat-Zer, темная это история, вот тут тоже человек пытался разобраться. Наверное kernel копать надо, но не факт, что прозрачную идею, стоящую за таким поведением удастся нарыть....
Закрыть X