#!/usr/bin/perluse strict;
use warnings;
use Storable;
use IO::Pipe;
use IO::Handle;
use Data::Dumper;
# создаем трубу
my $pipe = IO::Pipe->new();
# делаем fork
my $pid = fork();
# дочка
if( $pid == 0 ) {
# тут мы пишем в трубу
$pipe->writer();
$pipe->autoflush( 1 );
foreach( 1..10 ) {
# создаем ссылку на хэш
my $data = { pid => $$, data => $_ };
# пересылаем в трубу закодированный в строку хэш
print $pipe join( '_', unpack( "C*", Storable::freeze( $data ) ) ) . "\n";
# sleep на 0.3 секунды
select undef, undef, undef, 0.3;
}
}
# родитель
else {
unless( defined $pid ) {
die 'Cannot fork';
}
# тут мы читаем из трубы
$pipe->reader();
while( <$pipe> ) {
# преобразуем строку в данные
my $data = Storable::thaw( pack( "C*", split( '_', $_ ) ) );
# выводим то, что пришло от дочки
print Dumper $data;
}
}