О взаимодействии родственных процессов
О взаимодействии родственных процессов
Ситуация следующая: есть два процесса - ребенок и родитель. Родитель передает ребенку данные, синхронизация между ними сделана с помощью сигналов, т.е. родитель ждет от ребенка сигнала готовности принять новую порцию, а ребенок, просигналив о готовности, ждет сигнала окончания передачи.
Вопрос: Родитель получает сигнал от ребенка и, не отправив сигнала о конце передачи, трагически погибает. Естественно, ребенок при этом остается в состоянии ожидания навечно.
Может ли как-нибудь процесс-ребенок проверить, жив ли его родитель, или получить сигнал связанный с его смертью?
Вопрос: Родитель получает сигнал от ребенка и, не отправив сигнала о конце передачи, трагически погибает. Естественно, ребенок при этом остается в состоянии ожидания навечно.
Может ли как-нибудь процесс-ребенок проверить, жив ли его родитель, или получить сигнал связанный с его смертью?
Вообще как я думаю можно тупо перед порождением потомка узнать свой id и потом из
потомка по таймауту запустить ps с перенаправленным выводом и посмотреть есть
ли нужный id в системе правда за время таймаута кто-то может занять этот id но
тогда просто таймаут не большой.
Или ещё вариант можно послать ему сигнал (какойнить USER1) а в нём обработчик
который шлёт ответный сигнал.
А стандартно по моему никак низя.
потомка по таймауту запустить ps с перенаправленным выводом и посмотреть есть
ли нужный id в системе правда за время таймаута кто-то может занять этот id но
тогда просто таймаут не большой.
Или ещё вариант можно послать ему сигнал (какойнить USER1) а в нём обработчик
который шлёт ответный сигнал.
А стандартно по моему никак низя.
Вот в этом суть проблемы. Таймаут небольшой не поможет, потому что ребенок может надолго заснуть, т.к., например, процессор занят более важными задачами. Тогда возможна такая ситуация: ребенок посмотрел, что да, родитель еще жив, потом процессор передали другому, потом умирает родитель, а ребенок думает(он же уже проверил), что родитель жив и тупо ждет сигнала о начале передачи.правда за время таймаута кто-то может занять этот id но
тогда просто таймаут не большой.
К сожалению, кто-то подсунул вам непрабильную ганжу. Дитятко станет зомби, но только когда само завершит исполнение. А оно этого сделать не может, т.к. ждет сигнала от своего родителя, который давно отправилься в софтверный рай.после смерти родителя дитяко должно умереть, вернее стать зомби
А проверить, кто наш родитель, мы уже не можем, т.к. находимся в ожидании сигнала.(см. выше)Иначе это уже назависимый демон, у которого родитель - опять же init
Нет ли какого-нибудь механизма, чтобы при смерти процесса его потомкам отправлялся какой-нибудь сигнал? Может можно как-то заставить процесс перед смертью выполнить какую-нибудь функцию, которая отправит сигнал?
Антон, по поводу PID - ИМХО где-то в глубинах /proc можно найти один-два параметра, которые будут гарантировано уникальными для данного процесса. Я бы сделал наверное просто "кукушку" - поток, который скажем каждые N милисекунд рассылает SIGUSR1 - типа "я живой"
Опыт растет прямо пропорционально выведенному из строя оборудованию
А что происходит, когда процесс ждет сигнала от 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 как-то будит приемных детей. Так ли это?
Просто добавил такую проверку:
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 как-то будит приемных детей. Так ли это?