Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на языке Perl


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Perl / Перл

Выпуск № 92
от 05.06.2007, 20:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 184, Экспертов: 20
В номере:Вопросов: 1, Ответов: 2


Вопрос № 89484: Здравствуйте доргие эксперты! Я не так давно изучаю Perl, доконца еще не разобрался в его возможностях. Помогите пожалуйста решить такуж задачу: Требуется запустить параллельный процесс, подождав несколько секунд убить его (в принципе `killal...

Вопрос № 89.484
Здравствуйте доргие эксперты!
Я не так давно изучаю Perl, доконца еще не разобрался в его возможностях. Помогите пожалуйста решить такуж задачу:
Требуется запустить параллельный процесс, подождав несколько секунд убить его (в принципе `killall` подойдет, хотя может и кроссплатформенная реализация тоже будет интересна), получить от него вывод, желательно напрямую в переменную.
Заранее благодарю всех ответивших!!!!
Отправлен: 31.05.2007, 19:36
Вопрос задал: Казаков М.А. / gnom (статус: 4-ый класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: dianacode
Доброе время суток, Казаков М.А. / gnom

предлагаю вариант для никсов - fork:
1) родитель создаёт потомка
2) пока потомок выполняется, родитель слушает сигналы от потомка
3) когда потомок завершит выполнение кода он посылает родителю сигнал CHLD
4) родитель, зная, что потомков запущено $countch, и, подсчитав все сигналы от них (в данном случае один) говорит, что все процессы являются defunct, т.е. зомбаками и завершает цикл ожидания while
5) запускается функция на уничтожение зомби

немного теории :: зомби будет висеть до тех пор, пока к нему не обратятся с waitpid или не завершится срипт

со всеми вопросами на форум ^_^

пример кода с комментариями ниже

our $zCounter = 0;

$SIG{CHLD} = sub{ $zCounter++ }; # приём родителя сигналов от потомков и увеличение счётчика принятых сигналов


my $countch = 1;


unless(my $ch = fork){ # старт потомка



print "[c] child is started... ";



my $i = 0;

for(1..5){

print '[c] child ', ++$i, " ";

sleep 1;

}



print "[c] zomb... ";

exit;

}


while(1){

select(undef, undef, undef, 0.5); # пауза в 500 миллисекунд



if($zCounter >= $countch){ # выходим если все потомки отправили предку сигналы CHLD

print "all child is zomb... ";

}

}


&killer; # обязательный вызов киллера для ждущих мёртвых процессов

print "all finished... ";


 


sub killer{

print "garbage collector is active with $zCounter zomb... ";

$zCounter = 0;

while((my $zomb = waitpid(-1, &WNOHANG)) != -1){

print "zomb $zomb killed with status '$?'... ";

}

}


с уважением, удачи

Приложение:

---------
there is more than one way to do it

Ответ отправила: dianacode (статус: Студент)
Ответ отправлен: 31.05.2007, 21:50

Отвечает: lupus campestris
Здравствуйте, Казаков М.А. / gnom!
Я использую такой вариант (под Windows): дочерний скрипт при запуске записывает свой pid в файл, и при необходимости родительский скрипт считывает его pid и убивает его, после чего удаляет файл с pid'ом дочернего процесса, уже убитого. Если нет необходимости убивать дочерний процесс, то нужно удалять файл с pid'ом после выполнения дочернего процесса.
Используется утилита kill из Support Tools, которые есть на диске с дистрибутивом Windows, но можно и на сайте microsoft.com их скачать.
Для работы в никсовых системах можно использовать стандартную утилиту kill с параметром -9.
Что касается вывода, то я в дочернем процессе делаю просто print, а в родительском при запуске направляю вывод дочернего скрипта в файл.
См. приложение.
Удачи!

Приложение:

---------
«С кем тяжело молчать, с тем не о чем говорить» (Метерлинк)

Ответ отправила: lupus campestris (статус: Профессор)
Россия, Москва
Тел.: +79060429689
Организация: http://www.orange-business.ru
WWW: http://lupus-campestris.blogspot.com/
ICQ: 193918889
----
Ответ отправлен: 05.06.2007, 14:01


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Email: support@rusfaq.ru, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.52 от 02.05.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное