Здравствуйте, 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'у
— пайп закрылся с данными => анализировать эти данные