Автор Тема: ActivePerl. fork? как словить PID под вынем?  (Прочитано 4095 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Skif

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 187
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Собственно сабж.
Написан набор скриптов для автообмена распределенных баз 1С. Все работает. За исключением "пустяка" - при запуске из скрипта 1С скрипт продолжает выполняться сразу же дальше, недожидаясь окончания работы запущенного процесса. Пускался system, обратными кавычками и т.д.. Насколько я понимаю все лежит в области fork, точнее того, что он не реализован на Win32.
Можно ли как-то по другому "схватить" PID процесса который стартует из скрипта, а потом просто проверять наличие этого процесса в системе? Средствами Perl, ессно.

Да, сейчас этот вопрос решен при помощи sleep, но ... Скажем так, это кривое решение...
Есть ли альтернатива?
Всё будет хорошо - я договорился!

Оффлайн Ivan Kolesnikov

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 39
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
ActivePerl. fork? как словить PID под вынем?
« Ответ #1 : 06 Июля 2005, 12:09:21 »
А код привести можно, где у тебя процессы запускаются.
Насчет fork ты прав в Винде его нет, но он реализован используя API.

Оффлайн Skif

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 187
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
ActivePerl. fork? как словить PID под вынем?
« Ответ #2 : 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;

}
Всё будет хорошо - я договорился!

Оффлайн cr4ck3r

  • Фанат Perl
  • Постоялец
  • ***
  • Сообщений: 146
  • +0/-0
  • 2
    • Просмотр профиля
    • http://perlmonks.org.ru
ActivePerl. fork? как словить PID под вынем?
« Ответ #3 : 06 Июля 2005, 12:45:15 »
Цитировать

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

Ну так у вас же exec идет, а чтобы ждал завершения нужен system вызов.
forkи нормально работают на виндах, у вас просто неверная реализация.
Ворота в perl - perlmonks.org.ru

Оффлайн Ivan Kolesnikov

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 39
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
ActivePerl. fork? как словить PID под вынем?
« Ответ #4 : 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!


Может быть все дело в вызываемой программе

Оффлайн Skif

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 187
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
ActivePerl. fork? как словить PID под вынем?
« Ответ #5 : 06 Июля 2005, 14:45:46 »
да? блин...
Всё будет хорошо - я договорился!

Оффлайн Skif

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 187
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
ActivePerl. fork? как словить PID под вынем?
« Ответ #6 : 06 Июля 2005, 14:56:20 »
Хорошо. тогда усложним вопос, а как можно выяснить отпачковывающиеся процессы от этого дочернего? Или никак?

cr4ck3r

Это уже пример с fork и exec. system вообще одну строчку занимает.
Всё будет хорошо - я договорился!

Оффлайн Skif

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 187
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
ActivePerl. fork? как словить PID под вынем?
« Ответ #7 : 06 Июля 2005, 14:58:24 »
или даже так, можно ли выяснить процессы которые былит запущены  вообще  и  во время N в частности?
Всё будет хорошо - я договорился!

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28