извиняюсь опечатка следует читать
"как уведомить потомка о смерти родителя или почему при убиении родителя потомки не получают SIGHUP как написано в мане???"
не уверен, что это именно то, что вам нужно, но в linux
есть возможность указать сигнал, который будет послан
потомкам завершившегося процесса:
prctl(PR_SET_PDEATHSIG, SIGXXX);
switch(rules_arr[i]->pid=fork()){
case -1:syslog(LOG_ERR, "MONITOR:Can't fork worker (%m) - aborted");exit(1);break;/* failed to spawn son */
case 0://дочерний процесс
prctl(PR_SET_PDEATHSIG, SIGHUP);//просим присылать SIGHUP при неожиданном умирании MONITOR-a
catch_signals_child();
execute_worker(rules_arr[i]);
exit(0);break;
default:close(rules_arr[i]->socket);
syslog(LOG_INFO,"MONITOR:start worker with pid=%d SUCCESS",rules_arr[i]->pid);
}
Черт его знает... попробовал с sigaction() - тоже работает.
А если ты этому процессу-потомку руками (kill) посылаешь
сигнал - он его ловит?
Может попробуй запустить мой примерчик, чтобы уж наверняка
исключить возможные глюки твоей (большой) программы.
P.S. Я бы все равно этот prctl() не использовал - во-первых
непортабельно, во-вторых - разве он настолько необходим?
> > P.S. Я бы все равно этот prctl() не использовал - во-первых непортабельно, во-вторых - разве он настолько необходим?
> один из немногих способов не оставить в системе массу работающих но неуправляемых процессов
Странно... есть куча Unix-программ, которые так или иначе используют
сопроцессы. Да взять хоть бы apache. Или (AFAIK) oracle. Или sendmail.
И еще вагон и тележка. И живут они без prctl, и не оставляют "массу
работающих но неуправляемых процессов".
идея простая: есть некоторый монитор(типа opmn in oracle) который следит за дочерними процессами решающими основную задачу. так вот я хочу дабы при непроизвольном исчезновении монитора все запущенные им процессы сами свернулись. в оракле такое не реализовано.
> идея простая: есть некоторый монитор(типа opmn in oracle) который
> следит за дочерними процессами решающими основную задачу. так вот я
> хочу дабы при непроизвольном исчезновении монитора все запущенные им
> процессы сами свернулись. в оракле такое не реализовано.
>
Ну ты подумай сам - что значит "непроизвольное исчезновение монитора"?
Это значит, что у тебя _баг_, раз он "непроизвольно" исчез. Причем
это очень исключительный, грубый баг - типа SIGSEGV или почему-то
SIGKILL. Обрабатывать эту ситуацию это примерно то же самое, что
перехватывать SIGSEGV и пытаться делать recovery.
Да, и не надо говорить - "вдруг админ сделает мой программе kill -9".
Ну, сделает. Не твое дело. Если админ это делает, он очевидно отдает
себе отчет и знает семантику SIGKILL.
Если же у тебя задача _перезапуска_ сдохшего (по каким-то причинам)
процесса, то это дело шелл-скрипта из пары строчек:
killall ...
<программа>
Все это дело завернуть в цикл (ну или прописать в inittab).
Альтернативно вместо killall можно встроить "зачистку" остатков
прямо к себе в программу.
И что? Это вне твоего контроля. Если у твоей программы действительно
какие-то особые, большие потребности в памяти, запиши это в INSTALL
или куда там еще. У тебя же все равно где-то описаны "System
Requirements" для твоей программы, ведь правда? ;-)
Там же ты можешь дать админу/пользователю инструкции по отключению
oom-killer или просто предупредить, что памяти надо столько-то.
Можешь еще при запуске посмотреть в /proc/где-это-там и если там стоит
стратегия с oom-killer записать warning в лог.
Это нормально. Например программы, активно использующие SysV IPC
(который регулируется system-wide ограничениями) в описание
инсталляции включают требования по настройке SysV IPC (AFAIK то же
oracle). Не надо делать из админа/пользователя дебила, неспособного
прочитать документацию.
более подробное изучение показало что поведение потомка зависит от того какой смертью умирает parent. тоесть при kill -9 потомки умирают так как я описал выше а при убиении SIGINT всё происходит как ожидалось
> более подробное изучение показало что поведение потомка
> зависит от того какой смертью умирает parent.
да быть того не может. ну, разве что, вас нашел kernel
bug, в чем я сильно сомневаюсь :)