[Moscow.pm] $SIG{CHLD}

Ruslan Zakirov ruz на bestpractical.com
Пт Май 18 06:26:06 PDT 2012


2012/5/18 Alexey Shrub <worldmind на mail.ru>:
> Привет всем,
>
> заметил что в доках неполные примеры для обработки сигнала CHLD, тут
> http://perldoc.perl.org/perlipc.html#Signals
> дано три примера,, первый блокирующий - неактуально для меня, второй якобы
> не учитывает CHLD от внешних команд, третий типо учитывает, но он уже не
> содержит цикла while и поэтому не обработает несколько одновременных
> сигналов (если сразу несколько потомков померло) т.е. второй нужно
> скрещивать с третьим.
> Мало того, там не описано что CHLD может приходить и в случаях отличных от
> смерти дитя, это написано тут
> http://docstore.mik.ua/orelly/perl/cookbook/ch16_20.htm
> попробовал скрестить всё рекомендации и получил
> https://gist.github.com/2724846
>
> Вроде всё работает верно, но вдруг чего-то упустил, есть у кого замечания?

Пример:

perl -Mstrict -MPOSIX -E '$| = 1; if ( my $child = fork ) { say
"child: $child"; local $SIG{CHLD} = sub { say "wait: ".
waitpid($child,POSIX::WNOHANG); printf "status: %d; signal: %d\n",
$?>>8, $?&127; }; while (1) { sleep 5; print "*" } } else { while(1) {
sleep 5; print "." } }'

Делаем: kill -TERM 37429

child: 37429
.*.*wait: 37429
status: 0; signal: 15
***^C

Видим, что жахнули сигналом.

Повторяем попытку, но делаем kill -STOP ... а затем kill -CONT ... и получаем:

child: 37425
*..*status: 72057594037927935; signal: 127
**************.*.^C

Помимо WIFEXITED нужно еще проверять WIFSIGNALED (он возвращает true,
если убили сигналом, но это была не остановка).

> --
> Alexey Shrub
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org

-- 
Best regards, Ruslan.


Подробная информация о списке рассылки Moscow-pm