Реферат: Процессы и IPC

filter();

for ($i = 0; $i < 20; $i ++)

{ print "Output line $i\n"; }

sub filter

{

die "Cannot fork" unless defined($fpid = open(STDOUT,"|-"));

return if ($fpid != 0);

num = 0;

while (<STDIN>) { print "$num:\t$_"; $num ++; }

exit;

}

Не вздумайте запускать. Что, уже запустили? Тогда жмите Ctrl+C. За то, теперь навсегда запомните – нужно закрывать дескрипторы (желательно все :). В чем же дело? Почему программа зависла? Все порожденные процессы являются процессами единой задачи. Потоки ввода вывода автоматически закрываются, когда завершается последний процесс. Конструкция open(STDOUT, "|-") неявно вызывает fork. Вспомните документацию по файловым операциям:

open(HANDLE, "| $cmd"); # направить информацию на вход программы

Так вот, здесь аналогичная ситуация, только в качестве программы здесь создается дочерний процесс. А так как в качестве дескриптора мы указываем STDOUT, то в настоящем процессе он переопределяется. Как и в случае с fork, относительно данных – дублируется их состояние на момент перед вызовом fork. Таким образом, в дочерний процесс попадает нормальный не переопределенный STDOUT. Замечу, что open с указанными аргументами в качестве результата возвращает те же самые значения, что и fork. Далее, программа определяет в каком она потоке – если не в порожденном ($fpid != 0), тогда возвращается и эмулирует вывод строк. Сам фильтр читает STDIN пока не закончатся данные. А данные закончатся, когда поток ввода будет закрыт (для родительского процесcа, это поток вывода). Родительский процесc уже завершил свою работу, а система ждет когда завершится последний процесс, что бы закрыть потоки. И так далее, и так далее. Чувствуете, где собака зарыта? После того, как вывод строк завершен, необходимо закрыть поток вывода, что бы фильтр, принимающий выходные данные через поток ввода вышел из цикла

while (<STDIN>) { print "$num:\t$_"; $num ++; }

Вот так то, берем и правим

#!/usr/bin/perl –w

# nfilter.pl

filter();

for ($i = 0; $i < 20; $i ++)

{ print "Output line\n"; }

close(STDOUT);

sub filter

{

die "Cannot fork" unless defined($fpid = open(STDOUT,"|-"));

return if ($fpid != 0);

num = 0;

while (<STDIN>) { print "$num:\t$_"; $num ++; }

exit;

К-во Просмотров: 606
Бесплатно скачать Реферат: Процессы и IPC