Есть перловый скприпт, мониторящий появление файлов в некоторой директории через 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;
}