ipc - Passing data from child to parent after exec in Perl -
i call perl program child.pl in perl program parent.pl, , hope pass data child.pl parent.pl , print these data parent.pl. system("perl child.pl") may not work, since parent.pl nothing until child.pl completes. read the online doc of perlipc, seems pipe() , fork() match of needs, failed find method pass data child process parent after exec. here's code of parent.pl:
#!/usr/bin/perl -w pipe(from_child, to_parent); $pid = fork(); if ($pid == 0) { # we're in child process. close(from_child); # send data parent. print to_parent "hello, parent\n"; # can pass data parent before exec exec("perl child.pl"); # how should after exec, in child.pl? exit(0); # terminate child. } elsif (undef $pid) { print "not defined: means error."; } else { # parent process. close(to_parent); $data = <from_child>; print "from child: $data\n"; $id = wait(); print "child $id dead.\n";
this might helpful:
#!/usr/bin/perl open (my $child, "-|","./child.pl") or die("$!"); while (<$child>) { print "p: $_"; } close($child); open function, from perldoc:
for 3 or more arguments if mode |- , filename interpreted command output piped, , if mode -| , filename interpreted command pipes output us.
if don't want touch stdout need cooperation child , can use named pipes:
parent.pl
#!/usr/bin/perl use strict; use warnings; use fcntl; use posix; $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; $fpath = '.named.pipe'; sysopen(my $fifo, $fpath, o_wronly) or die "sysopen: $!"; print "screen hello\n"; print $fifo "parent hello\n"; close($fifo);
Comments
Post a Comment