Ответ 1
От perlfaq8 ответ на Как мне начать процесс в фоновом режиме?
Несколько модулей могут запускать другие процессы, которые не блокируют ваш Perl программа. Вы можете использовать IPC:: Open3, Parallel:: Jobs, IPC:: Run и некоторые из модули POE. Подробнее см. CPAN.
Вы также можете использовать
system("cmd &")
или вы можете использовать fork, как описано в "fork" в perlfunc, с дальнейшим примеры в perlipc. Некоторые вещи, о которых нужно знать, если вы используете Unix- как система:
STDIN, STDOUT и STDERR являются общедоступными
Как основной процесс, так и фоновый ( "ребенок" ) процесс) используют одни и те же дескрипторы файлов STDIN, STDOUT и STDERR. Если оба пытаются получить к ним доступ сразу, могут произойти странные вещи. Вы может захотеть закрыть или вновь открыть их для ребенка. Вы можете получить вокруг этого "открыть" трубу (см. "открыть" в perlfunc), но на в некоторых системах это означает, что детский процесс не может пережить предок.
Сигналы
Вам придется поймать сигнал SIGCHLD и, возможно, SIGPIPE. SIGCHLD отправляется при завершении фонового процесса. SIGPIPE - отправляется, когда вы пишете файл-дескриптор, чей дочерний процесс закрыт (незафиксированный SIGPIPE может заставить вашу программу тихо умирать). Это не проблема с "system (" cmd & ")".
Zombies
Вы должны быть готовы "пожинать" дочерний процесс, когда он отделки.
$SIG{CHLD} = sub { wait };
$SIG{CHLD} = 'IGNORE';
Вы также можете использовать двойную вилку. Вы сразу же ждете() для своего первый ребенок, а демон init будет ждать() для вашего внука как только он выйдет.
unless ($pid = fork) {
unless (fork) {
exec "what you really wanna do";
die "exec failed!";
}
exit 0;
}
waitpid($pid, 0);
См. "Сигналы" в perlipc для других примеров кода для этого. Зомби не являются проблемой с "системой (" prog & ")".