Forum Webscript.Ru

Программирование => Perl => Тема начата: Skif от 06 Июля 2005, 10:46:03

Название: ActivePerl. fork? как словить PID под вынем?
Отправлено: Skif от 06 Июля 2005, 10:46:03
Собственно сабж.
Написан набор скриптов для автообмена распределенных баз 1С. Все работает. За исключением "пустяка" - при запуске из скрипта 1С скрипт продолжает выполняться сразу же дальше, недожидаясь окончания работы запущенного процесса. Пускался system, обратными кавычками и т.д.. Насколько я понимаю все лежит в области fork, точнее того, что он не реализован на Win32.
Можно ли как-то по другому "схватить" PID процесса который стартует из скрипта, а потом просто проверять наличие этого процесса в системе? Средствами Perl, ессно.

Да, сейчас этот вопрос решен при помощи sleep, но ... Скажем так, это кривое решение...
Есть ли альтернатива?
Название: ActivePerl. fork? как словить PID под вынем?
Отправлено: Ivan Kolesnikov от 06 Июля 2005, 12:09:21
А код привести можно, где у тебя процессы запускаются.
Насчет fork ты прав в Винде его нет, но он реализован используя API.
Название: ActivePerl. fork? как словить PID под вынем?
Отправлено: Skif от 06 Июля 2005, 12:19:44


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;

}
Название: ActivePerl. fork? как словить PID под вынем?
Отправлено: cr4ck3r от 06 Июля 2005, 12:45:15
Цитировать

exec "$prog"  or my_die($logfile, "Cannot execute 1C! ");

Ну так у вас же exec идет, а чтобы ждал завершения нужен system вызов.
forkи нормально работают на виндах, у вас просто неверная реализация.
Название: ActivePerl. fork? как словить PID под вынем?
Отправлено: Ivan Kolesnikov от 06 Июля 2005, 13:17:20
Цитировать

Ну так у вас же 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!


Может быть все дело в вызываемой программе
Название: ActivePerl. fork? как словить PID под вынем?
Отправлено: Skif от 06 Июля 2005, 14:45:46
да? блин...
Название: ActivePerl. fork? как словить PID под вынем?
Отправлено: Skif от 06 Июля 2005, 14:56:20
Хорошо. тогда усложним вопос, а как можно выяснить отпачковывающиеся процессы от этого дочернего? Или никак?

cr4ck3r

Это уже пример с fork и exec. system вообще одну строчку занимает.
Название: ActivePerl. fork? как словить PID под вынем?
Отправлено: Skif от 06 Июля 2005, 14:58:24
или даже так, можно ли выяснить процессы которые былит запущены  вообще  и  во время N в частности?