Запустить параллельный процесс
От: igna Россия  
Дата: 08.01.10 10:10
Оценка:
Как в процессе-родителе убедиться, что вызов execlp в процессе-потомке завершился успешно?
Re: Запустить параллельный процесс
От: alexsy Россия  
Дата: 08.01.10 10:23
Оценка:
Здравствуйте, igna, Вы писали:

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

man wait
man waitpid
обработчик на сигнал SIGCHLD
Re[2]: Запустить параллельный процесс
От: igna Россия  
Дата: 08.01.10 10:41
Оценка:
Здравствуйте, alexsy, Вы писали:

A>man wait


А каким образом можно использовать wait? Нужно же не дождаться пока процесс-потомок закончится, а убедиться в том, что вызов execlp в нем завершился успешно.
Re[3]: Запустить параллельный процесс
От: alexsy Россия  
Дата: 08.01.10 13:06
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, alexsy, Вы писали:


A>>man wait


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

А не выйдет из вызова exec пака процесс запушенный не закончится
Re[4]: Запустить параллельный процесс
От: igna Россия  
Дата: 08.01.10 14:16
Оценка:
Здравствуйте, alexsy, Вы писали:

A>А не выйдет из вызова exec пака процесс запушенный не закончится


Ну так и я про то же, при чем тут wait? В смысле, какое отношение он имеет к моей задаче?
Re: Запустить параллельный процесс
От: Vamp Россия  
Дата: 08.01.10 15:12
Оценка: 5 (1)
I>Как в процессе-родителе убедиться, что вызов execlp в процессе-потомке завершился успешно?
Доподлинно — никак.
Можно организовать протокол, чтобы потомок, если exec обломился, послал ему сообщение об ошибке. И если такого сообщения нет разумное время (10 секунд, скажем) — то считать, что все ОК.
Да здравствует мыло душистое и веревка пушистая.
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.
Re[2]: Запустить параллельный процесс
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 08.01.10 18:08
Оценка:
Здравствуйте, Vamp, Вы писали:

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

V>Доподлинно — никак.
V>Можно организовать протокол, чтобы потомок, если exec обломился, послал ему сообщение об ошибке. И если такого сообщения нет разумное время (10 секунд, скажем) — то считать, что все ОК.

См. соседнее сообщение. Есть гарантированный метод без таймаутов.
The God is real, unless declared integer.
Re[3]: Запустить параллельный процесс
От: Vamp Россия  
Дата: 08.01.10 18:12
Оценка:
N>См. соседнее сообщение. Есть гарантированный метод без таймаутов.
Да, про FD_CLOEXEC не догадался.
Да здравствует мыло душистое и веревка пушистая.
Re: Запустить параллельный процесс
От: Pzz Россия https://github.com/alexpevzner
Дата: 08.01.10 21:09
Оценка:
Здравствуйте, igna, Вы писали:

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


Если эта функция не вернулась, значит завершилась успешно. Но на самом деле, это не то, что вы хотите. Новых процесс может успешно стартовать, и упасть через микросекунду после успешного старта. Поэтому родитель должен следить за его судьбой — man wait и т.п.
Re[5]: Запустить параллельный процесс
От: alexsy Россия  
Дата: 09.01.10 07:48
Оценка:
Здравствуйте, 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 у тебя образуется процесс зомби.
Re[3]: Запустить параллельный процесс
От: alexsy Россия  
Дата: 09.01.10 07:55
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, alexsy, Вы писали:


A>>man wait


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

если вызов execlp неудачен он возвратить -1
Re[6]: Запустить параллельный процесс
От: igna Россия  
Дата: 09.01.10 09:02
Оценка:
Здравствуйте, alexsy, Вы писали:

A>Указатель на int видно?? Вот через этот указатель и вернётся результат твоего дочернено процесса.


for (;;)
    Нужно не дождаться пока процесс-потомок закончится, а убедиться в том, что вызов execlp в нем завершился успешно.
Re[2]: Запустить параллельный процесс
От: igna Россия  
Дата: 09.01.10 09:06
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Если эта функция не вернулась, значит завершилась успешно. Но на самом деле, это не то, что вы хотите. Новых процесс может успешно стартовать, и упасть через микросекунду после успешного старта.


Не возражаю, но хотелось бы сразу и как-то специально отреагировать на неудачный вызов execlp.
Re[3]: Запустить параллельный процесс
От: Pzz Россия https://github.com/alexpevzner
Дата: 11.01.10 11:00
Оценка:
Здравствуйте, igna, Вы писали:

Pzz>>Если эта функция не вернулась, значит завершилась успешно. Но на самом деле, это не то, что вы хотите. Новых процесс может успешно стартовать, и упасть через микросекунду после успешного старта.


I>Не возражаю, но хотелось бы сразу и как-то специально отреагировать на неудачный вызов execlp.


Ну вот начиная со следующей строка после execlp() можно уже писать эту реакцию. Если execlp() успешен, управление туда никогда не попадет.
Re[4]: Запустить параллельный процесс
От: igna Россия  
Дата: 11.01.10 13:45
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Ну вот начиная со следующей строка после execlp() можно уже писать эту реакцию. Если execlp() успешен, управление туда никогда не попадет.


А как сообщить об этом процессу-родителю?
Re[5]: Запустить параллельный процесс
От: Pzz Россия https://github.com/alexpevzner
Дата: 11.01.10 18:10
Оценка:
Здравствуйте, igna, Вы писали:

Pzz>>Ну вот начиная со следующей строка после execlp() можно уже писать эту реакцию. Если execlp() успешен, управление туда никогда не попадет.


I>А как сообщить об этом процессу-родителю?


Организовать между ними какой-нибудь IPC. Например, через pipe
Re[6]: Запустить параллельный процесс
От: igna Россия  
Дата: 12.01.10 10:50
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Организовать между ними какой-нибудь IPC. Например, через pipe


Это
Автор: netch80
Дата: 08.01.10
?
Re[7]: Запустить параллельный процесс
От: Pzz Россия https://github.com/alexpevzner
Дата: 12.01.10 23:30
Оценка:
Здравствуйте, igna, Вы писали:

Pzz>>Организовать между ними какой-нибудь IPC. Например, через pipe


I>Это
Автор: netch80
Дата: 08.01.10
?


Ну, например.
Re[8]: Запустить параллельный процесс
От: igna Россия  
Дата: 13.01.10 08:13
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Ну, например.


А еще? Альтернатива у тебя есть?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.