Forum Webscript.Ru
Программирование => Perl => Тема начата: Skif от 06 Июля 2005, 10:46:03
-
Собственно сабж.
Написан набор скриптов для автообмена распределенных баз 1С. Все работает. За исключением "пустяка" - при запуске из скрипта 1С скрипт продолжает выполняться сразу же дальше, недожидаясь окончания работы запущенного процесса. Пускался system, обратными кавычками и т.д.. Насколько я понимаю все лежит в области fork, точнее того, что он не реализован на Win32.
Можно ли как-то по другому "схватить" PID процесса который стартует из скрипта, а потом просто проверять наличие этого процесса в системе? Средствами Perl, ессно.
Да, сейчас этот вопрос решен при помощи sleep, но ... Скажем так, это кривое решение...
Есть ли альтернатива?
-
А код привести можно, где у тебя процессы запускаются.
Насчет fork ты прав в Винде его нет, но он реализован используя API.
-
sub forking_prog {
my $logfile = shift @_;
my $prog = shift @_ ;
my ($pid,$kid);
$pid = fork;
if (defined $pid) {
if ($pid == 0){
print "Starting 1C in configure mode!\\n";
exec "$prog" or my_die($logfile, "Cannot execute 1C! ");
exit;
}
}
else {
print "Fatal error forking!\\n";
my_die($logfile,"Fatal error forking!")
}
do {
$kid = waitpid $pid,0;
if ($kid == -1) {
print "System have not chidren process!\\n";
my_die($logfile, "System have not chidren process!");
}
elsif ($kid == 0) {
print "Non blocked calling!\\n";
&logfile($logfile, "Non blocked calling!");
}
} until $kid=$pid;
print "External program finished!\\n";
&logfile($logfile, "External program finished!\\n");
undef $pid;
}
-
exec "$prog" or my_die($logfile, "Cannot execute 1C! ");
Ну так у вас же exec идет, а чтобы ждал завершения нужен system вызов.
forkи нормально работают на виндах, у вас просто неверная реализация.
-
Ну так у вас же exec идет, а чтобы ждал завершения нужен system вызов.
В принципе здесь не имеет значения что использовать exec или system все равно после него идет exit;
Skif я попробовал выполнить твой скрипт (в качестве команды использовал ping -n 10 localhost) все отработало на ура.
Вот вывод:
Starting 1C in configure mode!
Pinging имя ПК [127.0.0.1] with 32 bytes of data:
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
...
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Ping statistics for 127.0.0.1:
Packets: Sent = 10, Received = 10, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms
External program finished!
Может быть все дело в вызываемой программе
-
да? блин...
-
Хорошо. тогда усложним вопос, а как можно выяснить отпачковывающиеся процессы от этого дочернего? Или никак?
cr4ck3r
Это уже пример с fork и exec. system вообще одну строчку занимает.
-
или даже так, можно ли выяснить процессы которые былит запущены вообще и во время N в частности?