У меня есть процесс демона, написанный на Perl, который использует Inotify2 для просмотра каталогов для входящих файлов. По прибытии каждого файла демон запускает дочерний процесс. Теперь кажется, что слишком много файлов поступает одновременно (следовательно, слишком много разветвлений), потому что я получил эту ошибку в своем файле журнала:
Cannot allocate memory at notifyd.pl line ...
который является результатом fork().
В основном у меня есть следующий код:
my $inotify = new Linux::Inotify2() or die($!);
foreach my $k (@PATHS) {
$inotify->watch($k,
IN_MOVE_SELF|IN_DELETE_SELF|IN_CLOSE_WRITE, \&watcher) or die($!);
}
$inotify->blocking(1) or die($!);
for(;;) {
$inotify->poll() or die($!);
}
с функцией наблюдателя, выполняющей fork, а затем execv:
sub watcher {
my $e = shift;
my $pid = fork();
if(!defined $pid) {
print "[ERROR]", $!;
}
elsif($pid == 0) {
my @args = ($e->fullname, $e->mask);
exec($childprocess, @args) or die($!);
}
}
Я не могу позволить себе пропустить события, не разветвляя процесс.
Есть ли у кого-нибудь предложения, как я могу улучшить это и убедиться, что вилка не выйдет из строя?
Изменить: похоже, что дочерние процессы становились зомби после выхода, поскольку демон не отвечал на SIGCHLD. Таким образом, причиной сбоя fork() могло быть множество дочерних процессов-зомби. Теперь демон выполняет $SIG{CHLD} = 'IGNORE';
перед разветвлением.
die
илиwarn
, но код, который вы показываете, не выдаст этот вывод, если вилка не удалась (то есть, если$pid
не определено). - person pilcrow   schedule 22.03.2012$!
, ниprint
обычно не добавляются к строке script независимо. Ошибка, которую вы показываете, в той форме, в которой вы ее показываете, возникла не из этой строки кода. - person pilcrow   schedule 22.03.2012