Модераторы: ginnie, korob2001
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> system and wait, ожидание процесса 
:(
    Опции темы
deber
Дата 26.5.2007, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 28.2.2006

Репутация: нет
Всего: нет



Привет!

Есть такой кусок скрипта:

Код

system("/usr/bin/perl $script > log.txt &");
while (1) {
        DoOneEvent();
        $text->delete("1.0", "end");
        my $textlog = `cat log.txt`;
        $text->insert('end', $textlog);
        $text->update;
}


Запускаю дочерний процесс в фоне и содержимое файла log.txt вывожу на экран (если подробнее, то в виджет Tk::Text).
При этом содержимое файла меняется и на экране я онлайн вижу, как заполняется файл.

Хочу, чтобы когда отработает system, мой цикл завершался.
Бьюсь уже полдня...  smile 

Пробовал wait, но он как-то не так отрабатывает.

Помогите плз.

PM MAIL   Вверх
Anarki
Дата 10.7.2007, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 14.3.2005

Репутация: нет
Всего: 11



В коде не вижу wait никакого.

Вообще лучше использовать тогда waitpid(-1,&WNOHANG)
Повесить на $SIG{CHLD} обработчик свой, в нём вызывать waitpid, который возвратит pid потомка если он завершился(или остановлен) и затем установить значение какое-то глобальное скажем $quit, его поставить в условии цикла

Код

use POSIX ":sys_wait_h";
use warnings;
use strict;
my $quit = 0;
# обработчик
$SIG{CHLD} = \&REAPER;
sub REAPER {
    my $stiff;
    while ($stiff = waitpid(-1,&WNOHANG) > 0) {
        $quit = 1; # завершился или остановлен _какой-то_ дочерний процесс
    }
    $SIG{CHLD} = \&REAPER; # если ненадежные сигналы
}

#цикл
while(!$quit) {
    # что-то делаем
}

p.s. код не проверял на работоспособность, оставляю это вам.


--------------------
PM WWW   Вверх
amg
Дата 11.7.2007, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 9
Всего: 50



Цитата(deber @  26.5.2007,  23:06 Найти цитируемый пост)
Запускаю дочерний процесс в фоне

Может, проблема в том, что после запуска с & в конце процесс лишается родителя (и подхватывается init-ом)? Таким образом, запускаемый через system процесс больше уже не потомок, и, кажется мне, wait здесь не поможет.

Рещение Anarki вроде, должно сработать, хотя я слишком плохо разбираюсь в IPC, чтобы что-либо утверждать.

А почему бы не поступить так: сделать flock на log.txt, и когда файл будет незалочен, тогда и скрипт прекратил работу.
Код

system("flock log.txt '/usr/bin/perl $script > log.txt &'");

Или совсем тупо:
Код

system("touch /tmp/file.lock; '/usr/bin/perl $script > log.txt' && rm /tmp/file.lock &");
while (-f '/tmp/file.lock') {
  ...
}

PM MAIL   Вверх
Anarki
Дата 14.7.2007, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 14.3.2005

Репутация: нет
Всего: 11



Цитата(amg @  11.7.2007,  15:36 Найти цитируемый пост)
Может, проблема в том, что после запуска с & в конце процесс лишается родителя (и подхватывается init-ом)? Таким образом, запускаемый через system процесс больше уже не потомок, и, кажется мне, wait здесь не поможет.

Кстати, да. Но только если указан '&'
Проверил сейчас на FreeBSD 6.2

Цитата

[amiga@amiga ~/perlbot]$ perl -we "system('perl -w main.pl &'); while(1) {  }" &
[1] 78287

[amiga@amiga ~/perlbot]$ ps lax
  UID   PID  PPID CPU PRI NI   VSZ   RSS MWCHAN STAT  TT       TIME COMMAND
1000 78287 78233   1  96  0  2616  2008 -      RJ    p9    0:00.71 perl -we system('perl -w main.pl &'); while(1) {  } (perl5.8.8)
 1000 78289     1   0  96  0  8912  8464 -      RJ    p9    0:00.21 perl -w main.pl (perl5.8.8)

Родительский процесс с pid 1, а не 78287

Если пускать в консоли с &, то родитель -bash smile

Вообщем, придумал, как это решается нужно форкнуть процесс там заменить его через вызов exec

Код

use POSIX ":sys_wait_h";
use warnings;
use strict;
my $quit = 0;
# обработчик
$SIG{CHLD} = \&REAPER;
sub REAPER {
    my $stiff;
    while ($stiff = waitpid(-1,&WNOHANG) > 0) {
        $quit = 1; # завершился или остановлен _какой-то_ дочерний процесс
    }
    $SIG{CHLD} = \&REAPER; # если ненадежные сигналы
}

my $pid = fork();
unless ( defined $pid ) {
    print "Nevozmojno sozdat process!\n";
} else {
    if ($pid != 0) {
        print "V roditelskom procese. PID potomka: $pid\n";
    } else {
        print "V procese potomke\n";
        exec("perl -w main.pl");
        exit;
    }
}

#цикл
while(!$quit) {
    # что-то делаем
}
print "Roditel' vishel\n";


Цитата

[amiga@amiga ~/perlbot]$ perl -w ./fork.pl &
[1] 86296
[amiga@amiga ~/perlbot]$ ps l
  UID   PID  PPID CPU PRI NI   VSZ   RSS MWCHAN STAT  TT       TIME COMMAND
 1000 86296 78233   1  96  0  3252   980 -      RJ    p9    0:02.67 perl -w ./fork.pl (perl5.8.8)
 1000 86298 86296   0  96  0  9380  7876 select SJ    p9    0:00.22 perl -w main.pl (perl5.8.8)
[amiga@amiga ~/perlbot]$ kill 86298
Roditel' vishel
[1]+  Done                    perl -w ./fork.pl
[amiga@amiga ~/perlbot]$ ps l | grep perl
[amiga@amiga ~/perlbot]$


Это сообщение отредактировал(а) Anarki - 14.7.2007, 13:54


--------------------
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0992 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.