Re: Запустить параллельный процесс
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 08.01.10 18:07
Оценка: 23 (4) +1
Здравствуйте, igna, Вы писали:

I>Как в процессе-родителе убедиться, что вызов execlp в процессе-потомке завершился успешно?


В большинстве случаев работает относительно примитивный метод: после exec*() сделать _exit(127). Код 127 по принятой практике означает именно проблему старта программы. Обычно целевая программа такой код не использует.

В стандартные соглашения по кодам возврата входят
— 0 — всё хорошо
— 1...63 — разные степени проблемности
— 64...78 — группа sysexits
— 126 — проблема подготовки окружения перед exec()
— 127 — проблема самого exec()
— 129...254 — слёт по сигналу (шелл транслирует сигналы в sig+128 для получения кода возврата)

Для более надёжного результата следует сделать так: породить пайп, в потомке оставить его пишущий конец и поставить на него FD_CLOEXEC. В случае успешного exec() этот дескриптор сам закроется. В случае неуспешного — в него можно отправить диагностику неудачи. Родитель должен следить за завершением потомка и информацией в этом пайпе:
— пайп закрылся без данных, потомок жив => exec() прошёл успешно
— пайп закрылся без данных, потомок скончался => анализировать случившееся по exitstatus'у
— пайп закрылся с данными => анализировать эти данные
The God is real, unless declared integer.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.