2010-04-01 2 views
3

Может ли кто-нибудь объяснить, как я могу успешно передать свои процессы? Я считаю, что perldoc на IPC запутывает.Как я могу использовать `pipe` для облегчения межпроцессного взаимодействия в Perl?

То, что я до сих пор:

$| = 1; 
$SIG{CHLD} = {wait}; 
my $parentPid = $$; 

if ($pid = fork();)) { 
    if ($pid == 0) { 
     pipe($parentPid, $$); 
     open PARENT, "<$parentPid"; 
     while (<PARENT>) { 
      print $_; 
     } 
     close PARENT; 
     exit(); 
    } else { 

     pipe($parentPid, $pid); 
     open CHILD, ">$pid"; 
      or error("\nError opening: childPid\nRef: $!\n"); 
     open (FH, "<list") 
      or error("\nError opening: list\nRef: $!\n"); 

     while(<FH>) { 
      print CHILD, $_; 
     } 

     close FH 
      or error("\nError closing: list\nRef: $!\n"); 
     close CHILD 
      or error("\nError closing: childPid\nRef: $!\n); 
    } else { 
    error("\nError forking\nRef: $!\n"); 
} 
  • Первое: Что perldoc pipe подразумевает под READHANDLE, WRITEHANDLE?

  • Во-вторых: Могу ли я реализовать решение, не полагаясь на CPAN или другие модули?

alt text http://www.wellho.net/slideshow/plx8.jpg

ответ

5

Вот упрощенный пример, основанный на коде найден в perldoc perlipc:

#!/usr/bin/perl 

use strict; use warnings; 

$SIG{CHLD} = sub { wait }; 

pipe my $reader, my $writer; 

my $pid = fork; 
defined $pid or die "fork failed: $!"; 

if ($pid) { # parent 
    close $reader; 
    for my $n (1 .. 5) { 
     select $writer; 
     $| = 1; 
     print $writer "Message $n\n" 
      or die "Failed to pass message to child: $!"; 
     sleep 1; 
    } 
    close $writer; 
    exit; 
} 
else { # child 
    close $writer; 
    while (my $msg = <$reader>) { 
     print "Child received: $msg"; 
     last if rand > 0.5; # to check error handling in parent 
    } 
    close $reader; 
    exit; 
} 
+0

СПАСИБО !!! Это действительно простое решение. Еще один вопрос, как «выбрать $ writer» знать, чтобы написать родительский процесс? – 2010-04-01 04:43:59

+0

В вызове 'pipe' подключен' $ reader' к '$ writer'. После 'fork' оба дескриптора файлов дублируются. 'select $ writer' существует, так что последующий' $ | = 1' работает с правильным дескриптором файла (а не с каким-либо соединением STDOUT). –

+0

это имеет смысл. Я наткнулся на изображение, исследуя решение, описывающее то, о чем вы говорили, но не было никакого кода для ссылки. Отличный ответ! – 2010-04-01 04:51:14

Смежные вопросы