2013-04-25 1 views
0

Я перенаправляю вывод программы (программа «exec'ed») с разветвленным процессом («pipe2file»), который обрабатывает чтение из трубы и записи в файл.Убив процесс, который отвечает за перенаправление stdout в файл, делает его зомби

Если программа «exec'ed» была убита, и ее состояние ожидания будет получено, то же самое нужно сделать для процесса «pipe2file».
Итак, что я делаю именно это:

  1. закрытия конца трубы, что она использовала
  2. посылает сигнал убить через kill(pipe2file, SIGKILL)
  3. с помощью waitpid, чтобы пожинать ее статус выхода, как этот waitpid(pipe2file, &status, 1)
  4. статус
  5. проверки с if (WIFEXITED(status) || WIFSIGNALED(status))

Still, после вышеуказанных шагов, процесс pipe2file заканчивается зомби.
Что не так?

ответ

0

У вас есть состояние гонки здесь. Вызов kill может не убить вашего ребенка сразу. Это требует времени. Вы не дожидаетесь достаточно долго, пока ваш ребенок не выйдет.

waitpid(pipe2file, &status, 1) 

откажется, если ваш ребенок еще не вышел. Параметры 1 в опции - это опция WNOHANG (например, не дожидайтесь, когда она действительно выйдет). Измените его на

waitpid(pipe2file, &status, 0) 
+0

Если я изменяю параметр на 0, программа зависает при этом ожидании. Почему процесс, ответственный за чтение из трубы и запись в файл, не прерывается? Когда процесс, использующий конец записи, уже вышел? – Chris

+0

@Chris Вам нужно будет опубликовать исходный код этого процесса, чтобы я сказал вам об этом. Вы всегда можете присоединить отладчика к ребенку и посмотреть, что он делает. –

Смежные вопросы