Как проверить, запущен ли процесс, произошел ли segfault или завершен в linux из его pid в main () в c ++ - PullRequest
2 голосов
/ 08 июня 2010

Я вызываю несколько процессов в своем главном и могу получить pid этих процессов. Теперь я хочу подождать, пока все эти процессы не будут завершены, а затем очистить блок разделяемой памяти от моего родительского процесса. Также, если какой-либо процесс не завершен и не завершен, я хочу убить этот процесс. Итак, как проверить из pid процессов в коде моего родительского процесса, что процесс завершен без какой-либо ошибки или он дал сбой из-за ошибки времени выполнения или любой другой причины, чтобы я мог убить этот процесс.

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

Код приветствуется (я не ищу сценарий, а код).

Ответы [ 4 ]

4 голосов
/ 08 июня 2010

Просмотр waitpid(2) с опцией WNOHANG. Проверьте «судьбу» процесса с помощью макросов на странице руководства, особенно WIFSIGNALED().

Кроме того, процесс segfaults уже мертв (если SIGSEGV специально не обработан процессом, что обычно не очень хорошая идея.)

2 голосов
/ 08 июня 2010

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

Вы можете посмотреть на /proc/{pid}/status, чтобы получитьобзор того, что процесс в настоящее время делает, он или будет:

  • Запуск
  • Остановлен
  • Спящий
  • Диск (D) сон(связан с вводом-выводом, беспрерывно)
  • Zombie

Однако, как только процесс умирает (полностью, если не находится в зомбированном состоянии), происходит и его запись в / proc.Невозможно определить, успешно ли он завершился, вышел из строя, перехватил сигнал, который не может быть обработан, или не смог обработать сигнал, который можно обработать.Нет, если только его родитель не регистрирует эту информацию где-то.

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

1 голос
/ 08 июня 2010

Если программа работает с ошибками, вам не нужно ее убивать. Он уже мертв.

Используйте вызовы wait и waitpid, чтобы дождаться окончания работы детей и проверить состояние на предмет того, как они уходят. См. здесь для получения подробной информации о том, как использовать эти функции. Обратите особое внимание на макросы WIFSIGNALED и WTERMSIG.

0 голосов
/ 08 июня 2010

waitpid () из обработчика SIGCHLD, чтобы поймать момент, когда приложение завершает свою работу. Обратите внимание, что если вы запускаете несколько процессов, вы должны зацикливаться на waitpid () с WNOHANG, пока он не вернет 0.

kill () с сигналом 0, чтобы проверить, запущен ли еще процесс. Зомби IIRC по-прежнему считаются процессами, поэтому для этого вам нужно иметь соответствующий обработчик SIGCHLD.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...