О взаимодействии родственных процессов

Все о программировании под *nix
Anonymous

О взаимодействии родственных процессов

Сообщение Anonymous »

Ситуация следующая: есть два процесса - ребенок и родитель. Родитель передает ребенку данные, синхронизация между ними сделана с помощью сигналов, т.е. родитель ждет от ребенка сигнала готовности принять новую порцию, а ребенок, просигналив о готовности, ждет сигнала окончания передачи.

Вопрос: Родитель получает сигнал от ребенка и, не отправив сигнала о конце передачи, трагически погибает. Естественно, ребенок при этом остается в состоянии ожидания навечно.
Может ли как-нибудь процесс-ребенок проверить, жив ли его родитель, или получить сигнал связанный с его смертью?

Vizor
Заглянувший
Сообщения: 22
Зарегистрирован: 02 сен 2004, 19:43
Контактная информация:

Сообщение Vizor »

Вообще как я думаю можно тупо перед порождением потомка узнать свой id и потом из
потомка по таймауту запустить ps с перенаправленным выводом и посмотреть есть
ли нужный id в системе правда за время таймаута кто-то может занять этот id но
тогда просто таймаут не большой.
Или ещё вариант можно послать ему сигнал (какойнить USER1) а в нём обработчик
который шлёт ответный сигнал.
А стандартно по моему никак низя.:(

Аватара пользователя
Llama
Неотъемлемая часть форума
Сообщения: 9749
Зарегистрирован: 06 фев 2002, 11:40
Откуда: Менск

Сообщение Llama »

Антон, если я курю правильную траву, после смерти родителя дитяко должно умереть, вернее стать зомби, весьма скоро init усыновит труппик и дожмет его до конца. Иначе это уже назависимый демон, у которого родитель - опять же init.
Опыт растет прямо пропорционально выведенному из строя оборудованию

Anonymous

Сообщение Anonymous »

правда за время таймаута кто-то может занять этот id но
тогда просто таймаут не большой.
Вот в этом суть проблемы. Таймаут небольшой не поможет, потому что ребенок может надолго заснуть, т.к., например, процессор занят более важными задачами. Тогда возможна такая ситуация: ребенок посмотрел, что да, родитель еще жив, потом процессор передали другому, потом умирает родитель, а ребенок думает(он же уже проверил), что родитель жив и тупо ждет сигнала о начале передачи.
после смерти родителя дитяко должно умереть, вернее стать зомби
К сожалению, кто-то подсунул вам непрабильную ганжу. Дитятко станет зомби, но только когда само завершит исполнение. А оно этого сделать не может, т.к. ждет сигнала от своего родителя, который давно отправилься в софтверный рай.
Иначе это уже назависимый демон, у которого родитель - опять же init
А проверить, кто наш родитель, мы уже не можем, т.к. находимся в ожидании сигнала.(см. выше)

Нет ли какого-нибудь механизма, чтобы при смерти процесса его потомкам отправлялся какой-нибудь сигнал? Может можно как-то заставить процесс перед смертью выполнить какую-нибудь функцию, которая отправит сигнал?

Аватара пользователя
Llama
Неотъемлемая часть форума
Сообщения: 9749
Зарегистрирован: 06 фев 2002, 11:40
Откуда: Менск

Сообщение Llama »

Антон, по поводу PID - ИМХО где-то в глубинах /proc можно найти один-два параметра, которые будут гарантировано уникальными для данного процесса. Я бы сделал наверное просто "кукушку" - поток, который скажем каждые N милисекунд рассылает SIGUSR1 - типа "я живой"
Опыт растет прямо пропорционально выведенному из строя оборудованию

Anonymous

Сообщение Anonymous »

А что происходит, когда процесс ждет сигнала от init?
Просто добавил такую проверку:

for (i=0; i<8; i++) {
status = kill(ppid, SIGUSR1); //сигнал готовности к приему
fprintf(stderr, "status - %d\n", status);
sleep(60); //чтобы успеть убить родителя после удачной посылки сигнала

if (status < 0) {
fprintf(stderr, "Abort!");
exit(-1);
}

sigsuspend(&set); //ждем передачи
//полезные действия
}

При этом как и положено сначала выводит status - 0. Уходит ждать. Я убиваю родителя.
А через минуту ребенок выводит status - -1, и завершает исполнение.
Похоже init как-то будит приемных детей. Так ли это?

Аватара пользователя
exe
Неотъемлемая часть форума
Сообщения: 860
Зарегистрирован: 28 ноя 2003, 21:08
Откуда: Минск

Сообщение exe »

Открой в родителе файл в /tmp
Не закрывая его - удали (unlink, remove)
Как только родитель исчезнет, система удалит файл
В потомке проверяй файл на существование

Anonymous

Сообщение Anonymous »

открой пайп от родителя к потомку
когда родитель умрет - пайп закроется....

2 exe:
файл перестанет быть виден в файловой системе сразу же как родитель сделает unlink

Anonymous

Сообщение Anonymous »

Можно попробовать сделать отца лидером сессии, тогда при его смерти дети должны получать SIGTERM.

Anonymous

Сообщение Anonymous »

Всем спасибо.
Проблема решилась проще: добавлен alarm(1) до вызова sigsuspend. А на SIGALARM - проверка pid родителя.

Ответить