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
...
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.