LINUX.ORG.RU

Особенности sigwait на FreeBSD и Linux

 ,


0

1

Существует программа, которая после инициализации ждет сигнала своего завершения (который другой процесс должен послать). Код:

sigset_t waitset;
int sig;
sigemptyset( &waitset );
sigaddset( &waitset, SIGTERM );
sigprocmask( SIG_BLOCK, &waitset, NULL );
sigwait( &waitset, &sig );
Также регестрируется обработчик сигнала SIGTERM, который при SIGTERM делает ::exit(0):
struct sigaction sigHandler;
memset( &sigHandler, 0, sizeof( sigHandler ) );
sigHandler.sa_handler = SigHandler;
sigemptyset(&sigHandler.sa_mask);
sigHandler.sa_flags = 0;
sigaction( SIGTERM, &sigHandler, 0 );
В процессе работы из другого потока периодически делается fork+exec.
Во freebsd почему то возвращается sigwait с кодом ошибки 4 (No child processes). В линуксах все нормально, sigwait возвращается только когда родительский процесс посылает SIGTERM. В чем м.б. проблема?



Последнее исправление: nerdogeek (всего исправлений: 1)

с кодом ошибки 4 (No child processes)

#define EINTR 4 /* Interrupted system call */

AptGet ★★★
()

sigwait() + обработчик одного и того же сигнала? Сигнал, который ждет sigwait(), должен быть заблокирован.

AptGet ★★★
()
Ответ на: комментарий от AptGet

Да, он блокируется. Просто в код не влезло

nerdogeek
() автор топика
Ответ на: комментарий от takino

Потомок при вызове execl с неправильным путем посылал родителю SIGTERM.

nerdogeek
() автор топика
Последнее исправление: nerdogeek (всего исправлений: 1)
31 декабря 2013 г.
Ответ на: комментарий от takino

Сам же нагуглил этот тред :)
В общем, в некоторых *nix, когда приходит сигнал в момент ожидающего выполнения в ядре syscall, этот сисколл возвращает EINTR. Т.е. во фряхе когда я ожидал sigwait, поток словил другой сигнал (SIGCHLD), прервав тем самым этот sigwait. Ядро Linux не прерывает выполнение sigwait. Т.е. получается что поведение Linux и FreeBSD отличается.

nerdogeek
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.