Здравствуйте, igna, Вы писали:
I>Как в процессе-родителе убедиться, что вызов execlp в процессе-потомке завершился успешно?
man wait
man waitpid
обработчик на сигнал SIGCHLD
А каким образом можно использовать wait? Нужно же не дождаться пока процесс-потомок закончится, а убедиться в том, что вызов execlp в нем завершился успешно.
Здравствуйте, igna, Вы писали:
I>Здравствуйте, alexsy, Вы писали:
A>>man wait
I>А каким образом можно использовать wait? Нужно же не дождаться пока процесс-потомок закончится, а убедиться в том, что вызов execlp в нем завершился успешно.
А не выйдет из вызова exec пака процесс запушенный не закончится
I>Как в процессе-родителе убедиться, что вызов execlp в процессе-потомке завершился успешно?
Доподлинно — никак.
Можно организовать протокол, чтобы потомок, если exec обломился, послал ему сообщение об ошибке. И если такого сообщения нет разумное время (10 секунд, скажем) — то считать, что все ОК.
Здравствуйте, 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'у
— пайп закрылся с данными => анализировать эти данные
Здравствуйте, Vamp, Вы писали:
I>>Как в процессе-родителе убедиться, что вызов execlp в процессе-потомке завершился успешно? V>Доподлинно — никак. V>Можно организовать протокол, чтобы потомок, если exec обломился, послал ему сообщение об ошибке. И если такого сообщения нет разумное время (10 секунд, скажем) — то считать, что все ОК.
См. соседнее сообщение. Есть гарантированный метод без таймаутов.
Здравствуйте, igna, Вы писали:
I>Как в процессе-родителе убедиться, что вызов execlp в процессе-потомке завершился успешно?
Если эта функция не вернулась, значит завершилась успешно. Но на самом деле, это не то, что вы хотите. Новых процесс может успешно стартовать, и упасть через микросекунду после успешного старта. Поэтому родитель должен следить за его судьбой — man wait и т.п.
Здравствуйте, igna, Вы писали:
I>Здравствуйте, alexsy, Вы писали:
A>>А не выйдет из вызова exec пака процесс запушенный не закончится
I>Ну так и я про то же, при чем тут wait? В смысле, какое отношение он имеет к моей задаче?
WAIT
Section: Linux Programmer's Manual (2 )
NAME
wait, waitpid, waitid — wait for process to change state
SYNOPSIS
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);
int waitid(idtype_t idtype, id_t idinfop, int options);
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
waitid(): _SVID_SOURCE || _XOPEN_SOURCE
Указатель на int видно?? Вот через этот указатель и вернётся результат твоего дочернено процесса.
Мало того. если не вызывеш wait у тебя образуется процесс зомби.
Здравствуйте, igna, Вы писали:
I>Здравствуйте, alexsy, Вы писали:
A>>man wait
I>А каким образом можно использовать wait? Нужно же не дождаться пока процесс-потомок закончится, а убедиться в том, что вызов execlp в нем завершился успешно.
если вызов execlp неудачен он возвратить -1
Здравствуйте, Pzz, Вы писали:
Pzz>Если эта функция не вернулась, значит завершилась успешно. Но на самом деле, это не то, что вы хотите. Новых процесс может успешно стартовать, и упасть через микросекунду после успешного старта.
Не возражаю, но хотелось бы сразу и как-то специально отреагировать на неудачный вызов execlp.
Здравствуйте, igna, Вы писали:
Pzz>>Если эта функция не вернулась, значит завершилась успешно. Но на самом деле, это не то, что вы хотите. Новых процесс может успешно стартовать, и упасть через микросекунду после успешного старта.
I>Не возражаю, но хотелось бы сразу и как-то специально отреагировать на неудачный вызов execlp.
Ну вот начиная со следующей строка после execlp() можно уже писать эту реакцию. Если execlp() успешен, управление туда никогда не попадет.
Здравствуйте, Pzz, Вы писали:
Pzz>Ну вот начиная со следующей строка после execlp() можно уже писать эту реакцию. Если execlp() успешен, управление туда никогда не попадет.
Здравствуйте, igna, Вы писали:
Pzz>>Ну вот начиная со следующей строка после execlp() можно уже писать эту реакцию. Если execlp() успешен, управление туда никогда не попадет.
I>А как сообщить об этом процессу-родителю?
Организовать между ними какой-нибудь IPC. Например, через pipe