Оказывается, мы можем предотвратить появление процесса зомби (т. Е. Тот, у которого родительский не wait()
для него до _exit()
), указав SIGCHLD
сигнал, который должен быть проигнорирован его родителем sigaction()
. Однако, по-видимому, SIGCHLD
по-прежнему игнорируется. Почему это работает?Каково использование игнорирования сигнала SIGCHLD с помощью `sigaction (2)`?
int main (void) {
struct sigaction sa;
sa.sa_handler = SIG_IGN; //handle signal by ignoring
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
if (sigaction(SIGCHLD, &sa, 0) == -1) {
perror(0);
exit(1);
}
int pid = fork();
if (pid == 0) { //child process
_exit(0);
}
do_something(); //parent process
return 0;
}
Означает ли это, что отказ от сигнала и игнорирование сигнала - это два разных поведения? – igor
Что особенно важно, игнорируя это явно, вызывая 'sigaction()'. Он не изменяет способ обработки сигнала в вашем процессе, но он изменяет то, что происходит с процессом, который выходит. – Barmar
@igor Да, отбрасывая сигнал и игнорируя это разные вещи. Отбрасывание означает, что сигнал в основном просто выброшен, в то время как игнорирование означает, что он фактически считается доставленным, но обработчик или любые другие специальные действия не выполняются. – twalberg