Вот начало (но читайте ниже):
static void
child_handler(int sig)
{
pid_t pid;
int status;
/* EEEEXTEERMINAAATE! */
while((pid = waitpid(-1, &status, WNOHANG)) > 0)
;
}
/* Establish handler. */
struct sigaction sa;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sa.sa_handler = child_handler;
sigaction(SIGCHLD, &sa, NULL);
Конечно, это все бессмысленно .Если родитель просто игнорирует SIGCHLD
, дети молча пожинаются и не превращаются в зомби.
Цитирование TLPI :
Явное определение расположенияиз SIGCHLD в SIG_IGN заставляет любой дочерний процесс, который впоследствии завершается, немедленно удаляться из системы вместо того, чтобы превращаться в зомби .
Так что нечто подобное должно сделать трюк дляВы:
signal(SIGCHLD, SIG_IGN); /* Silently (and portably) reap children. */