The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Вопрос по сигналу SIGCHID, !*! myshonkov, 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".

  • Вопрос по сигналу SIGCHID, !*! NuINu, 17:21 , 13-Июл-11 (1)
    следите за руками:
    -------------------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----------------------------------------




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

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