Страница 1 из 1

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

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

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

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

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

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

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

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

Добавлено: 18 окт 2004, 12:31
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 как-то будит приемных детей. Так ли это?

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

Добавлено: 18 окт 2004, 14:50
Anonymous
открой пайп от родителя к потомку
когда родитель умрет - пайп закроется....

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

Добавлено: 18 окт 2004, 16:05
Anonymous
Можно попробовать сделать отца лидером сессии, тогда при его смерти дети должны получать SIGTERM.

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