fork()
не поддерживается Windows, поэтому Perl (плохо) эмулирует его с помощью потоков. Эти виртуальные процессы имеют отрицательные идентификаторы PID. Вам следует избегать fork()
на Windows, если вы можете, используя потоки вместо этого, если ничего больше.
Хотя это не относится к вашему вопросу. Хотя PID, возвращаемый fork
, является отрицательным, PID, возвращаемый open
, не является.
Обычно следует избегать двух аргументов open
, поэтому
open my $cmd, "foo bar |"
эквивалентно
open my $cmd, "-|", "foo bar"
И это эквивалентно
open my $cmd, "-|", "cmd", "/x", "/c", "foo bar"
Вы запускаете оболочку для выполнения команды оболочки, и это PID оболочки, которую возвращает open
.
То же самое относится и к system 1, $shell_cmd
.
Это означает, что сигнал Ctrl-Break отправляется в оболочку. (Это то, что Perl посылает вместо несуществующего SIGKILL.)
Теперь у меня нет mimperf
, поэтому я использовал альтернативную программу вместо mimperf
(perl
), и он получил сигнал Ctrl-Break, а также оболочку. Так что если mimperf
не завершился, может быть, это потому, что он не реагирует на Ctrl-Break?
Если вы хотите избежать оболочки, вам нужно будет выполнить перенаправление вывода самостоятельно. Для этого я рекомендую IP C :: Run . Он также обрабатывает таймауты.
use IPC::Run qw( run );
run [ "mimperf", "-C", $db ]
">", "results/mimperf/mimperf.log",
timeout(10);