Ошибка команды Perl system () после разветвления - PullRequest
1 голос
/ 26 августа 2011

У меня есть Perl-скрипт, который несколько раз вызывает fork () для создания 4 дочерних процессов.Затем родительский процесс использует waitpid (), чтобы дождаться завершения всех дочерних процессов.

Проблема возникает, когда я пытаюсь вызвать system () из дочерних процессов (я использую его для создания каталогов),Даже что-то столь простое, как system ("dir"), выходит из строя (да, я на Windows).

Под "неудачей" я подразумеваю, что один из дочерних потоков проходит без проблем, но другие дочерние процессы, насколько я могу сказать, просто перестают существовать.

trace INFO, "Thread $thread_id still alive at 2.62";
system("dir");
trace INFO, "Thread $thread_id still alive at 2.65";

Я получаю сообщения типа «Поток 3 все еще жив на 2.62», но только 1 из дочерних потоков когда-либо достигает 2.65.

В нижней части журнала я вижу «Команда завершена с ненулевым статусом127 ", что, я думаю, может быть как-то связано с этим.

Я рассмотрел возможность использования какой-либо блокировки мьютекса, чтобы убедиться, что только 1 процесс за раз проходит через системные вызовы, но как это сделать?Я делаю это с помощью fork ()?Кроме того, эта проблема на самом деле не имеет никакого смысла, во-первых, почему нескольким независимым процессам было бы трудно делать систему («dir») одновременно?

1 Ответ

2 голосов
/ 26 августа 2011

Проблема в том, что fork() эмулируется под окнами с использованием потоков.Таким образом, реальные процессы не создаются.

Если вы только используете системный вызов для создания папок, тогда вам лучше использовать функцию perl mkdir или File :: Path вместо make_path.

...