execl()- в родительском процессе: SIGCHLD перехватывается ps
Я делаю присваивание для fork(),exec() и связанных вызовов UNIX, где мне нужно показать состояние зомби (дочернего) процесса. Вот соответствующий кусок кода:
pid = vfork(); //used vfork() for showing z state
if(pid>0)
{
(some sorting code)
execl("/bin/ps","/bin/ps","a",(char*)0);
}
Я ожидаю, что это:
(child's output)
(parent's output)
(Output of the ps command where I then would be able to show a 'defunct' entry)
Что я получаю это:
(child's output)
(parent's output)
No ps command output. Instead I get: Signal 17 (CHLD) caught by ps (procps version 3.2.8)
Однако когда sleep(int time)
(некоторое целое время в секундах) вставляется перед execl
позвоните, я получаю желаемый вывод, и об ошибках не сообщается.
Что тут происходит? Есть ли ps
становится новым родителем (пока не зомби) ребенка? И почему ps
команда не выполняется? Что значит sleep()
сделать это делает ps
выполнить как требуется?
Я новичок в программировании на POSIX/Linux, поэтому любая актуальность этого SIGCHLD
сигнал в отношении моей конкретной ситуации будет принята с благодарностью. Спасибо!
2 ответа
Я могу ошибаться, но я думаю, что происходит так:
- Ваш ребенок запускает и выполняет код сортировки, а родительский блокирует.
- Ребенок выходит.
- Родитель делает это половина
if
, выполняяps
, - После
ps
запущен,SIGCHLD
отправляется родительскому процессу из-за прекращения дочернего процесса (сигналы могут быть медленными и непредсказуемыми) - Если вы добавите сон,
SIGCHLD
доставляется родителю, который игнорирует его, а затем передает управлениеps
,
заглавие
ps -ef завершается с ошибкой "Сигнал 17 (CHLD) перехвачен ps (procps версия 3.2.8)""на Redhat 6.6
Описание
При запуске команды ps -ef в Redhat 6.6 происходит сбой со следующей ошибкой: "Сигнал 17 (CHLD) перехвачен ps (procps версии 3.2.8)"
причина
Это проблема третьей стороны. Redhat создал следующую статью для отслеживания проблемы:
https://access.redhat.com/solutions/1235753
разрешение
Пожалуйста, обратитесь к статье Redhat для последних обходных путей. https://access.redhat.com/solutions/1235753 К ним относится переименование файлов libfreebl3.chk следующим образом:
# mv /lib/libfreebl3.chk /lib/libfreebl3.chk-bz1153759
# mv /lib64/libfreebl3.chk /lib64/libfreebl3.chk-bz1153759
Дополнительная информация
Похоже, что это было исправлено RedHat сейчас. См. RHBA-2014:1867