in reply to Re^2: IPC::Open3 woes
in thread IPC::Open3 woes
I am hopeing that somebody can add some clarity to this old thread. Can somebody tell me why the following coded hangs if the line which defines the @outlines array is commented out?
You have a deadlock.
- waitpid never returns because the child never exits.
- The child never exits because it's blocked trying to write a full pipe.
- The pipe is full because noone is emptying it.
If it doesn't happen for all your children, it's because they don't output enough data to fill the pipe.
use strict; use warnings; use IPC::Open3 qw( open3 ); for (my $size = 1024; ; $size += 1024) { print("$size\n"); my $pid = open3( local our $to_chld, local our $fr_chld, local our $fr_chld_err, perl => ( -e => 'print "x" x $ARGV[0]', $size ) ); waitpid($pid, 0); }
... 62464 63488 64512 65536 66560 [hangs]^C
The solution is to redirect the output to /dev/null
use strict; use warnings; use IPC::Open3 qw( open3 ); open(local *DEVNULL, '>', '/dev/null') or die; for (my $size = 1024; ; $size += 1024) { print("$size\n"); my $pid = open3( local our $to_chld, '>&DEVNULL', '>&DEVNULL', perl => ( -e => 'print "x" x $ARGV[0]', $size ) ); waitpid($pid, 0); }
... 365568 366592 367616 368640 369664 370688 371712 372736 373760 374784 ...
|
---|
In Section
Seekers of Perl Wisdom