(предоставлено Брайаном Д. Фой)
Нет единого способа запуска кода в фоновом режиме, поэтому вам не нужно ждать его завершения, прежде чем ваша программа перейдет к другим задачам. Управление процессами зависит от вашей конкретной операционной системы, и многие из методов находятся в perlipc.
Может помочь несколько модулей CPAN, включая IPC :: Open2 или IPC :: Open3 , IPC :: Run , Parallel :: Jobs , Parallel :: ForkManager , POE , Proc :: Background и Win32 :: Process . Вы можете использовать множество других модулей, поэтому проверьте эти пространства имен и для других опций.
Если вы работаете в Unix-подобной системе, вам, возможно, удастся избежать системного вызова, когда вы ставите & в конце команды:
system("cmd &")
Вы также можете попробовать использовать fork, как описано в perlfunc (хотя это то же самое, что многие модули сделают для вас).
STDIN, STDOUT и STDERR совместно используются
И основной, и фоновый процессы ("дочерний" процесс) используют одни и те же файловые дескрипторы STDIN, STDOUT и STDERR. Если оба пытаются получить к ним доступ сразу, могут произойти странные вещи. Вы можете закрыть или снова открыть их для ребенка. Вы можете обойти это, открыв канал (см. Open в perlfunc), но в некоторых системах это означает, что дочерний процесс не может пережить родительский.
сигналы
Вам придется поймать сигнал SIGCHLD и, возможно, SIGPIPE. SIGCHLD отправляется после завершения фонового процесса. SIGPIPE отправляется, когда вы пишете в файловый дескриптор, чей дочерний процесс был закрыт (нераскрытый SIGPIPE может привести к молчаливой смерти вашей программы). Это не проблема с системой ("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 &").