- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
sub child_handler {
#wait end of the child process
my $waitedpid = wait;
delete $my_childs{$waitedpid};
$SIG{CHLD} = \&child_handler;
LOG ("ripped $waitedpid" . ($? ? " with exit $?" : '')) if ($main::DEBUG>0);
}
$SIG{CHLD} = \&child_handler;
Dummy00001 13.01.2011 01:59 # 0
подскажите учебники где такому учат?
я как бы по профилю системщик, мне после пары зомби эта фишка почти сразу ясна стала. но вот коллеги они в лучшем случае прикладники - я им задолбался такие вещи разжевывать. вот уже третий раз им объяснял давече что TCP и UDP порты это разные порты и на том же самом порту можно и TCP и UDP сервер держать. а они все сомневаются, даже не смотря на то что работает, покаж им дескать мануал.
SanityIO 13.01.2011 07:09 # 0
Да даже в кэмелбуке или в кукбуке для перла - я уверен есть.
guest 13.01.2011 04:12 # 0
Процесс при завершении освобождает все свои ресурсы (за исключением PID — идентификатора процесса) и становится «зомби» — пустой записью в таблице процессов, хранящей код завершения для родительского процесса.
Система уведомляет родительский процесс о завершении дочернего с помощью сигнала SIGCHLD. Предполагается, что после получения SIGCHLD он считает код возврата с помощью системного вызова wait(), после чего запись зомби будет удалена из списка процессов.
Если родительский процесс игнорирует SIGCHLD (а он игнорируется по умолчанию), то зомби остаются до его завершения.
SanityIO 13.01.2011 07:11 # +1
Dummy00001 13.01.2011 14:13 # 0
так как очередь/буффер для сигналов процесса (signal queueing) весьма короткая (Линух может буфферить до 3х сигналов одного типа).
и по POSIX, ОСь вообще и не обязана реализовывать очередь сигналов.
поэтому цикл внутри обработчика SIGCHLD вокруг waitpid(WNOHANG) обязателен, т.к. SIGCHLDы могут быть потеряны из-за переполнения очереди сигналов.