Ждать и / или убивать процессных внуков, созданных fork - PullRequest
1 голос
/ 03 июня 2011

I fork() в процесс X и Y, затем Y forks() снова в себя и обработку Z несколько раз.

Теперь процесс Y - это своего рода «слушатель», и я бы хотел, чтобы X был удалителем. Процессы Z выполняют фактические действия. Z процессы у внуков X.

С помощью FIFO и некоторой сигнализации X создал список всех pids процессов Z. Проблема сейчас в том, что я хотел бы удалить Z-процесс зомби с помощью X (просматривая список пидов).

Я пробовал это с waitpid(), но, конечно, это не работает (это работает только для непосредственных детей). Но я читал о возможности сделать расширение самостоятельно для этого. Но я действительно не знаю, как это сделать.

Я думал о том, что средство удаления хранит другой список с зомби (сигнал при выходе), но это то же самое, что я делал при сохранении пидов, я хотел бы сделать это по-другому.

Кто-нибудь знает, как это сделать?

Ответы [ 3 ]

2 голосов
/ 03 июня 2011

Единственный процесс, который может получить статусы выхода у своих удаленных внуков N-го поколения, - это процесс 'init', и это правило особого случая, реализованное ядром.

В общем, процесс можеттолько ждать, пока его прямые дети умрут;он не может дождаться смерти своих детей.

Болезненное дело ...


Если вы отвечаете за код процесса Y или можете повлиять на него, возможно,этот процесс должен установить signal(SIGCHLD, SIG_IGN), чтобы процессы Z не создавали зомби.Процесс X может даже сделать это сам, в то время как он разветвляет процессы Y, игнорируя SIGCHILD в дочернем процессе после fork() и перед любым exec*() процесса Y.Это переопределяется, только если процессы Y явно устанавливают другой обработчик для SIGCHLD.И если код Y явно устанавливает обработку SIGCHLD и фактически не собирает его зомби (процессы Z), то вы можете сообщить об ошибке в коде Y.

1 голос
/ 03 июня 2011

Это не поддерживается. Если ваше единственное намерение состоит в том, чтобы предотвратить превращение процессов 'Z' (то есть внуков) в зомби, вы можете использовать setsid(). Однако если вам действительно нужен статус выхода, вам действительно нужно пожинать их из процессов «Y».

1 голос
/ 03 июня 2011

Ваш вопрос делает потрясающую работу, затрудняя понимание проблемы. Тем не менее, я считаю, что могу различить следующее: «Я хочу избавиться от зомби». Ну, не все ли мы.

Есть несколько способов сделать это:

  • Иметь Y игнорировать SIGCHLD. forked дети не превратятся в зомби после смерти
  • Периодически пожинайте Y (wait) для любых детей

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

...