On Wed, Apr 16, 2008 at 01:39:20AM +0400, Evgeny Sinelnikov wrote: > > Логика такая: поскольку не все процессы после рассылки SIGKILL > > завершаются, дожидаться появления ECHILD бесполезно. > > Логика, как мне кажется, ошибочна... ECHILD приходит, когда последний > процесс умирает. Почему вы так решили? "The waitpid() function shall fail if: [ECHILD] The process specified by pid does not exist or is not a child of the calling process, or the process group specified by pid does not exist or does not have any member process that is a child of the calling process." Пример: $ cat waitpid.c #include int main(void) { int status; waitpid(-1, &status, WNOHANG); waitpid(-1, &status, WNOHANG); return 0; } $ strace -qe waitpid ./waitpid waitpid(-1, 0xbf88880c, WNOHANG) = -1 ECHILD (No child processes) waitpid(-1, 0xbf88880c, WNOHANG) = -1 ECHILD (No child processes) > Приход именно этого сигнала выдавал предупреждение, > когда не до конца ожидался момент умирания всех процессов перед > отмонтированием. По сути получается так, что при умирании последнего > процесса, цикл в обработчике сигнала вынужден получить такую ошибку. > Поэтому отключение обработчика сигнала перед циклом ожидания > неверно... Отключение обработчика сигнала? Мы точно говорим про один и тот же код? > Это же подтверждено не практике. В моём случае стоит > ожидание только по этому сигналу, иначе цикл в killall() у меня вообще > не завершится... Но он завершается, а следовательно ECHILD, как и > ожидается, приходит... ECHILD у init произойдёт только в случае если в системе не останется процессов, у которых ppid==1; такое может произойти, но может и не произойти. У нас на стенде init не получал ECHILD ни разу. -- ldv