in reply to Re^2: delayed die and open3
in thread delayed die and open3
OK, try this:
You'll see that the child's error message is being printed by the parent. Now replace the die with warn. You'll see that if the open3 call fails, the child goes on and tries to execute the parent's code. In other words, if the open3 call succeeds, you have a successful fork+exec: the child is off on its merry way executing your pipe. When you give the program a bogus argument like 'nosuch', the fork succeeds (hence no $@), but the exec fails. The IPC::Open3 docs talk about exec failures; to trap them you need to handle the SIGPIPE yourself.use strict; use warnings; use IPC::Open3; $|=1; print "parent pid: $$\n"; my($in, $out, $err, $pid); # duplicate stderr and stdout open( $out, ">&STDOUT" ) or die "Can't dup STDOUT to OUTPUT: $!\n"; open( $err, ">&STDERR" ) or die "Can't dup STDERR to OUTERR: $!\n"; eval { $pid = open3($in, $out, $err, @ARGV) }; die "$$ open3 gave trouble: $@\n" if $@; print "$$ It is running\n"; close $in; print "$$ stderr:\n"; print "[ $$ $_ ]" while <$err>; close $err; __END__
the lowliest monk
|
|---|