Как я могу обращаться с SIGCHLD?

Мне нужно правильно управлять SIGCHLD . Как я могу использовать его с моим существующим кодом. на данный момент я не могу ждать дочернего процесса, если я не использую 0 вместо WNOHANG|WUNTRACED .

 status = 0; pid_t child, endID; if(amp == 1) signal( SIGCHLD, SIG_IGN ); child = fork(); if (child < 0) { perror("fork() error\n"); exit(EXIT_FAILURE); } else if (child == 0) { // do sth here perror("error\n"); } else { //sleep(1) 

Если я удалю sleep тогда родитель будет выполнен первым .. почему?

Вот начало (но читайте ниже):

 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. */ 
Давайте будем гением компьютера.