LINUX.ORG.RU

Почему зомби самоуничтожается?


0

1

Создаю дочерний процесс - fork(), в нем запускаю утилиту Oracle SqlLoader - execlp(...). Судя по документации после завершения работы процесса должен остаться зомби. Но когда я в коде вызываю waitpid() - получаю ошибку ECHILD, пробовал wait - получил ECHILD.

Если же я включаю обработчик сигнала SIGCHLD, причем обработчик ничего не делает:

static void sigchld_handler(int signo) { }

в этом случае waitpid отрабатывает нормально. Но тут возникает еще вопрос. Обрабатываю статус завершения процесса. Макросы WIFEXITED, WIFSIGNALED, WIFSTOPPED, WIFCONTINUED. Судя по той же документации либо WIFEXITED либо WIFSIGNALED возвращает true, но у меня true возвращают оба.

Если кто-то мне объяснит почему в доке одно а на деле другое, или даст ссылку на доку где все нормально, подробно описано - буду очень благодарен.

Система Redhat Linux 4.0. GCC 4.3.3

Я как-то особо не озадачивался этим вопросом, но из манов:

ECHILD
    процесс, указанный в pid, не существует или не является дочерним процессом текущего процесса. (Это может случиться и с собственным дочерним процессом, если обработчик сигнала SIGCHLD установлен в SIG_IGN. Смотри также главу ЗАМЕЧАНИЯ по поводу многозадачности процессов.) 

Это про первый случай, когда возвращается ECHILD.

pathfinder ★★★★
()

Если Вы нашли ошибку в ОС, то причем тут ЛОР? Если же вы предполагаете, что ошибка всё-таки в вашей программе, то почему бы не показать программу?

Sorcerer ★★★★★
()
Макрос WIFEXITED возвращает значение 1, если процесс завершился «добровольно», то есть в результате вызова exit() или _exit().
Макрос WIFSIGNALED возвращает 1, если выполнение процесса было завершено сигналом.

Я не вникал в детали, но пока не вижу противоречий. Дочерний процесс получил сигнал и сам закрылся через вызов exit().

pathfinder ★★★★
()

Если установка обработчика помогает, то по умолчанию стояло SIGIGN. В этом случае исчезновение зомби не порождает событий и оповещения папаши. Можно поставить еще дефолтную обработку.

io ★★
()

Создаю дочерний процесс - fork(), в нем запускаю утилиту Oracle SqlLoader - execlp(...). Судя по документации после завершения работы процесса должен остаться зомби.

может, всё же стоит посмотреть создался ли зомби процесс или нет?

shty ★★★★★
()
Ответ на: комментарий от pathfinder

Спасибо. вот это: (Это может случиться и с собственным дочерним процессом, если обработчик сигнала SIGCHLD установлен в SIG_IGN. Смотри также главу ЗАМЕЧАНИЯ по поводу многозадачности процессов.) к сожалению не везде описано.

sav1902
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.