The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Вопрос по сигналу SIGCHID"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Perl)
Изначальное сообщение [ Отслеживать ]

"Вопрос по сигналу SIGCHID"  +/
Сообщение от myshonkov email(ok) on 11-Июл-11, 12:36 
Господа профессионалы!
Помогите разобраться! Пытаюсь отловить гибель потомка и перезапустить скрипт, вот простенький пример.

#!/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".

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Вопрос по сигналу SIGCHID"  +/
Сообщение от NuINu (??) on 13-Июл-11, 17:21 
следите за руками:
-------------------controller.pl---------------
#!/usr/bin/perl -w

use 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----------------------------------------

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру