2015-05-04 3 views
1

Я начинаю процесс, используя execv и позволяя ему записывать в файл. Я запускаю поток одновременно, который контролирует файл таким образом, чтобы его размер не превышал определенного предела, используя stat.st_size. Теперь, когда предел поражен, I waitpid для дочернего процесса, но это вызывает ошибку, и процесс, который я запускаю в фоновом режиме, становится зомби. Когда я делаю остановку, используя тот же самый waitpid из основной нити, процесс уничтожается, не становясь зомби. Есть идеи?waitpid для дочернего процесса не удается

Редактировать: errno - 10 и waitpid возвращает -1. Это на платформе Linux.

+0

«но это порождает ошибку ...», и эта ошибка будет ... что? включают коды ошибок и все связанные сообщения * verbatim * в вашем размещенном вопросе. Также можно включить информацию о платформе. – WhozCraig

+0

waitpid возвращается -1 с ошибкой, установленным в 10. Ошибка errno указывает на то, что дочерний процесс не существует. Но, похоже, это не так, поскольку я могу видеть процесс с помощью ps ax. ОС - Linux. – user1295872

+0

И это будет в * комментарии *. Эта информация принадлежит * в вашем размещенном вопросе. * Независимо, возможно, раздел «Примечания к Linux» [в документации «waitpid»] (http: //linux.die.net/man/2/waitpid) могут быть связаны. – WhozCraig

ответ

1

Это сложно отладить без кода, но errno 10 is ECHILD.

За странице человека, это возвращается следующим образом:

ECHILD (для waitpid() или waitid()) процесс определяется pid (waitpid()) или idtype и id (waitid()) не существует или не является ребенка вызывающего процесса. (Это может произойти для собственного ребенка, если действие для SIGCHLD устанавливаются в SIG_IGN См. Также раздел Linux Примечания о потоках.)

Короче говоря, pid вы задаете не является дочерним вызывающим процессом waitpid() (или больше нет, возможно, потому что он закончился).

Примечания вводного раздел:

  • «Это может произойти для собственного ребенка, если действие для SIGCHLD устанавливается в SIG_IGN» - если вы установили обработчик сигнала для SIGCHLD быть SIG_IGN, wait эффективно выполняется автоматически, поэтому waitpid не будет работать, так как ребенок уже будет завершен (не пройдет состояние зомби).

  • «См. Также раздел« Примечания к Linux »о потоках». - В Linux потоки - это по существу процессы. Современный linux позволит одному потоку ждать детей других потоков (при условии, что они находятся в одной группе потоков - широко родительский процесс). Если вы используете Linux до 2.4, это не так. Подробную информацию см. В документации по телефону __WNOTHREAD.

Я предполагаю, что нить вещь является отвлекающим маневром, и проблема на самом деле обработчик сигнала, как это согласуется с вашим утверждением 'процесс будет убит, не став зомби.

+0

Я не настраиваю обработчик сигналов для SICHLD. Так что это не должно быть проблемой. Я использую ядро ​​2.6, которое должно неявно позволить моему потоку ждать процесса, созданного из основного потока. Но этого не происходит. Я установил параметры __WALL и __WCLONE для waitpid безрезультатно. Я буду продолжать изучать и возвращаться к вам. Спасибо за предложения, хотя. – user1295872

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