Господа профессионалы!
Помогите разобраться! Пытаюсь отловить гибель потомка и перезапустить скрипт, вот простенький пример.#!/usr/bin/perl
use strict;
# если умирает потомок рестартуем систему
sub restart {
print "РЕСТАРТ\n";
#Ниже закомментировал, иначе зацикливаемся
#my $stiff;
#while ($stiff = waitpid(-1,&WNOHANG)>0) {}
#$SIG{CHLD} = \&restart();
#exec ('/home/my.pl');
}$|=1;
my $child=fork();#my $s = POSIX::SigSet->new;
#my $t = POSIX::SigSet->new(SIGCHLD);
#sigprocmask (SIG_UNBLOCK, $t, $s);if ($child) {
$SIG{CHLD} = \&restart();
while (1) {
sleep 1;
print "Я родитель\n";
}
} else {
while(1) {
sleep 1;
print "Я потомок\n";
}
}Почему при запуске скрипта, получаем "РЕСТАРТ" т. е. приходит сигнал SIGCHLD? Как правильно сделать, что бы не ловить это при запуске. Если пытаюсь убить потомка умирает и родитель! Где сигнал? "Not a subroutine reference at ./esme_temp.pl line 64".
следите за руками:
-------------------controller.pl---------------
#!/usr/bin/perl -wuse strict;
use POSIX 'WNOHANG';my $child;
my $need_start = 1;
# если умирает потомок рестартуем его
sub kill_child {
my $stiff;
while (($stiff = waitpid(-1,WNOHANG))>0) {
if($stiff == $child) {
print "Killed child $child\n";
$need_start = 1;
} else {
print "Killed unknown child $stiff\n";
}
}
}sub start_child {
my $name = shift;
$child=fork();
if (!$child) {
print "Я потомок\n";
exec($name);
}
}
$|=1;
$SIG{CHLD} = 'kill_child';while (1) {
sleep 1;
print "Я родитель\n";
if($need_start) {
$need_start = 0;
start_child("./worker.pl");
}
}
---------------------end----------------------------------------
--------------------worker.pl-----------------------------------
#!/usr/bin/perl -w
use strict;my $quit = 0;
sub sig_worker {
my $sig = shift;
$quit++;
print "I get signal = $sig\n";
return;
}$SIG{TERM} = $SIG{INT} = \&sig_worker;
print "---------------- Start Worker Programm------------------\n";
while(!$quit){
print "I work, don't wory!!!\n";
sleep 1;
}
#Определим причину по которой завершилась программа
if($quit) {
print "Exit by quit = $quit\n";
}print "---------------- End Worker Programm---------------------\n";
exit(0);
---------------------end----------------------------------------