Стандартный подход для определения успеха или неудачи fork / exec (в то время как родитель работает одновременно) - PullRequest
7 голосов
/ 25 сентября 2011

Я сделал программу, используя fork() и exec*(). Проблема в том, что я не могу определить успех или неудачу exec() от родительского процесса, потому что он находится на отдельном дочернем процессе. Я думаю, что для проверки этого состояния можно использовать какую-то сигнализацию, но я понятия не имею об этом.

  1. Какой рекомендуемый / стандартный / широко используемый способ проверить это?
  2. И о каких подводных камнях я должен заботиться, делая это?

Обновление деталей вопроса (Извините за упущение важных деталей)

Я хочу, чтобы оба процесса работали, поэтому я не могу просто ждать завершения дочернего процесса. Другими словами, я хочу получать уведомления об успехе или неудаче дочернего процесса exec.

1 Ответ

7 голосов
/ 25 сентября 2011

Ваш родительский процесс может использовать pid дочернего процесса, чтобы обнаружить, что он активен или завершился (и может устранить неоднозначность кода ошибки и ошибок "умер из-за сигнала", см. Waitpid).Вы можете использовать определенные коды ошибок или сигналы, чтобы уведомить родителя о конкретных случаях ошибки (например, в разветвленном дочернем элементе перед exec), но для полностью общего дочернего элемента вы не сможете зарезервировать какие-либо коды выхода или сигналы (так какparent не сможет определить, удалось ли выполнить exec, а затем дочерний процесс завершился с этими значениями).

Другой часто используемый подход - создание пары pipe fd (см. системный вызов 'pipe') и передачаодин конец для ребенка (обычно конец записи), а другой - для родителя.Ребенок может использовать это, чтобы отправить конкретные коды ошибок родителю.И родитель может обнаружить преждевременное завершение, если канал закрыт без получения каких-либо данных.Есть некоторые подводные камни: SIGPIPE будет отправлено родителю, если он читает по каналу без активных пишущих, и использование fd (кроме stdin / stdout / stderr) в дочернем процессе может привести к путанице в некоторых плохо написанных дочерних процессах (хотя close-on-exec может помочь исправить это).

В общем, весь код, который я видел, чтобы сделать fork + exec надежным, довольно хакерский.

...