O sinal SIGCLD se comporta diferentemente dos outros. Se ele é ignorado, a terminação de um processo filho, sendo que o processo pai não está em espera, não irá acarretar a criação de um processo zumbi (veja seção 2.2.1)
Exemplo: O programa a seguir gera um processo zumbi quando o pai é informado da morte do filho através de um sinal SIGCLD.
/* arquivo test_sigcld.c */ #include <stdio.h> #include <unistd.h> int main() { if (fork() != 0) while(1) ; exit(0); }
Resultado da execução:
euler:~/> test_sigcld & euler:~/> ps PID TTY TIME CMD 675 pts/0 00:00:00 tcsh 1038 pts/0 00:00:01 test_sigcld 1039 pts/0 00:00:00 test_sigcld <defunct> 1040 pts/0 00:00:00 ps
No próximo programa, o pai ignora o sinal SIGCLD, e seu filho não vai mais se tornar um processo zumbi.
/* arquivo test_sigcld2.c */ #include <stdio.h> #include <signal.h> #include <unistd.h> int main() { signal(SIGCLD,SIG_IGN) ;/* ignora o sinal SIGCLD */ if (fork() != 0) while(1) ; exit(0); }
Resultado da execução:
euler:~/> test_sigcld2 & euler:~/> s PID TTY TIME CMD 675 pts/0 00:00:00 tcsh 1055 pts/0 00:00:01 test_sigcld2 1057 pts/0 00:00:00 ps
Observação: A primitiva signal() será mais detalhada na seção 3.2.2 do texto.