Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris

Re: open3 but for n file descriptors

by Loops (Curate)
on Jul 19, 2013 at 19:32 UTC ( #1045394=note: print w/replies, xml ) Need Help??

in reply to open3 but for n file descriptors

Are you sure you really need to have the PID of child processes when using IPC::Run? It allows you to send signals and kill children directly. If you really must have the PID, it's possible to use start/pump/finish instead of run:

use strict; use warnings; use IPC::Run qw( start ); # Initiate the child process my $data; my $s = start [ 'ls' ], '>', \$data; # Show its PID for my $kid ( @{$s->{KIDS}} ) { print $kid->{PID}; } # pump data in and out, then clean up $s->pump; $s->finish;

Replies are listed 'Best First'.
Re^2: open3 but for n file descriptors
by tange (Initiate) on Jul 20, 2013 at 07:42 UTC

    As mentioned I would prefer not to use IPC::Run because IPC::Run is not installed on many of the old distributions supported by GNU Parallel, whereas open3 is. There is typically a reason why people do not upgrade the old systems, and it is therefore unlikely that IPC::Run will be installed.

    The PID is currently the way I keep track of which process was started when, so when using --keep-order, I can make sure the output from the dead children is printed in the correct order. But with a bit of recoding this could probably be changed.

    I had hoped wrapping open3 with more filedescriptors would be as easy as this meta-code for fd3:

    # Record fd3 for later use open($orig_fd{3},">&=",3); for $id (1..10) { open($child{$id,3},">",$tmpfile{$i}); # make $child{$id,3} file descriptor 3 for me and all future childre +n connect_filedescriptor(3,$child{$id,3}); # start the child open3(...) } sub reaper { # When a child dies seek $child{$id,3},0,0; # Print the captured fd3 to the parent's original fd3 print $orig_fd{3} <$child{$id,3}>; close $child{$id,3}; }
    I know how to make most of the meta-code, but connect_filedescriptor I do not know how to make.

      Looking at the man page for open, it seems what I need is this:
      open(my $err, '>', "foo.out"); open(STDERR, ">&", $err);
      but in a generic version, so I can use other file descriptors than STDERR (fd2).

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1045394]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (7)
As of 2018-01-17 11:47 GMT
Find Nodes?
    Voting Booth?
    How did you see in the new year?

    Results (198 votes). Check out past polls.