Доброго времени суток!Есть вопрос, существует ли способ, узнать есть ли данные в pipe'e?
Есть скрипт, который создаёт группу child процессов, и получает от них данные через pipe.
Хочется, чтоб он продолжал работать, до тех пор, пока не посыпятся данные из pipe не останавливаясь на чтении из трубы.что типа:
pipe(READ,WRITE);
WRITE->autoflush(1);while(1) {
if(<READ>) {
do_smth($_);
} else {
do_other;
}
}Такая конструкция - не работает. На if(<READ>) скрипт останавливается и ждёт данных. ;(
perldoc -f select
perldoc IO::Select
>perldoc -f select
>perldoc IO::SelectСпасибо ;)
>perldoc -f select
>perldoc IO::SelectМда. Что то не выходит каменный цветок. Как не пытался, сколько вариантов не пробовал, всё не работает ;( Что я делаю не так?
#!/usr/bin/perl
use IO::Select;
pipe(READ,WRITE);
WRITE->autoflush(1);
$select = IO::Select->new();
$select->add(READ); #здесь были и *READ и \*READ, пробовал все варианты из примеров. Хотя шаманства этого так и не понял ;(
print WRITE "Ololo\n";if (@ready = $select->can_read(0)) {
$olo=<READ>;
print "$olo!!!!";
} else {
print "Nea\n";
}
Всегда выводит Nea
Основная ошибка - использование 0 в качестве таймаута. Есть разница между нулем и undef.
Учитывая что изначальный вопрос упоминал форки, даю пример для родителя и одного потомка#!/usr/bin/perl -w
use IO::Handle;
use IO::Select;
pipe(READ, WRITE) or die $!;
WRITE->autoflush(1);if (my $pid = fork) {
close WRITE;
my $s=IO::Select->new;
$s->add(\*READ);
while (1) {
if ($s->can_read(0.5)) {
my $line = <READ>;
print "Child sent:$line";
close READ;
waitpid($pid,0);
last;
} else {
print "doing something\n";
}
}
} else {
die "cannot fork: $!" unless defined $pid;
sleep (5);
print WRITE "Hello\n";
close WRITE;
exit;
}Успехов
>Успеховя хочу обработать текстовый файл, у меня есть скрипт!
куда мне его вставит?