[Perl] Обработчик SIGCHLD и interrupted syscall
От: Аноним  
Дата: 11.10.13 12:58
Оценка:
Есть перловый скприпт, мониторящий появление файлов в некоторой директории через inotify.
При появлении нового файла форкается дочерний процесс, который и обрабатывает новый файл.
Если навесить свой обработчик на SIGCHLD, inotify->read в родительском процессе вываливается с ошибкой 'Interrupted system call'.
Если установить обрабочкик в 'IGNORE', все работает без проблем. Товарищи эксперты, объясните, почему так происходит, и что с этим делать? Свой обработчик мне нужен чтобы освобождать в нем семафор, регулирующий максимальное число дочерних процессов. Вот код:


while( $keep_going )
{
    my @events = $inotify->read;
    unless( @events > 0 )
    {
        dieNice( "Inotify read error: $!" ) if $keep_going;
        last ;
    }
    
    foreach( @events )
    {
        $log->notice( "New file appeared: $$_{name}" );
        next if $$_{name} !~ /.+\.(xml|XML)$/;
        my $pid = fork();
        dieNice( "Can't fork, err. $!" ) unless defined $pid;
        processIncoming( $$_{name} ) unless $pid;
    }
}

sub processIncoming($)
{
    #TODO:
    exit( 0 );
}

sub REAPER
{
    my $stiff;
    while( $stiff = waitpid( -1, &WNOHANG ) > 0 )
    {
        # TODO: 
        # 1) release semaphore
        # 2) process $stiff, write retcode to LOG
    }
    $SIG{CHLD} = \&REAPER;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.