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

Другие вопросы по тегам