6

child.pl別のperlプログラムでperlプログラムを呼び出し、からにparent.plデータを渡し、によってこれらのデータを出力したいと思います。 parent.plは完了するまで何もしないため、機能しない可能性があります。perlipcのオンラインドキュメントを読みましたが、私のニーズの一部に一致するようですが、後に子プロセスから親にデータを渡す方法を見つけることができませんでした。これがのコードです:child.plparent.plparent.plsystem("perl child.pl")child.plpipe()fork()execparent.pl

#!/usr/bin/perl -w

pipe(FROM_CHILD, TO_PARENT);  

$pid = fork();  

if ($pid == 0) {  
    # We're in the child process.  
    close(FROM_CHILD);  
    # Send data to parent.  
    print TO_PARENT "Hello, parent\n"; #  I can pass data to parent before exec
    exec("perl child.pl");             #  But how what should I do after exec, in child.pl?
    exit(0);  # Terminate child.  
} 
elsif (undef $pid) {  
    print "Not defined: means an error.";  
} 
else {  
    # Parent process.  
    close(TO_PARENT);  
    $data = <FROM_CHILD>;  
    print "From child: $data\n";  
    $id = wait();  
    print "Child $id is dead.\n"; 
4

1 に答える 1

7

これは役立つかもしれません:

#!/usr/bin/perl
open (my $child, "-|","./child.pl") or die("$!");
while (<$child>) {
  print "P: $_";
}
close($child);

open 関数、perldoc から:

引数が 3 つ以上の場合、MODE が |- の場合、ファイル名は出力のパイプ先のコマンドとして解釈され、MODE が -| の場合はファイル名が解釈されます。、ファイル名は、出力をパイプするコマンドとして解釈されます。

stdout に触れたくない場合は、子からの協力が必要であり、名前付きパイプを使用できます。

親.pl

#!/usr/bin/perl
use strict;
use warnings;
use Fcntl;
use POSIX;
my $fpath = '.named.pipe';

mkfifo($fpath, 0666) or die "mknod $!";
system("perl child.pl &");
sysopen(my $fifo, $fpath, O_RDONLY) or die "sysopen: $!";

while (<$fifo>) {
  print "P: $_";
}
close($fifo);
unlink($fifo);

child.pl

#!/usr/bin/perl
use strict;
use warnings;
use Fcntl;
use POSIX;

my $fpath = '.named.pipe';
sysopen(my $fifo, $fpath, O_WRONLY) or die "sysopen: $!";
print "screen hello\n";
print $fifo "parent hello\n";
close($fifo);
于 2013-03-13T06:47:37.687 に答える