Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

Re: Passing a File Descriptor to a New Process on Windows

by Corion (Patriarch)
on Apr 23, 2014 at 13:32 UTC ( [id://1083356]=note: print w/replies, xml ) Need Help??


in reply to Passing a File Descriptor to a New Process on Windows

There is IO::FDPass, which implements the appropriate Windows system calls.

  • Comment on Re: Passing a File Descriptor to a New Process on Windows

Replies are listed 'Best First'.
Re^2: Passing a File Descriptor to a New Process on Windows (Win32API::File)
by tye (Sage) on Apr 23, 2014 at 14:26 UTC

    For the sake of clarity, IO::FDPass doesn't implement letting a child process inherit an open file descriptor. It implements passing an open file descriptor through a Unix-domain socket (and similar functionality on Windows).

    It also doesn't work with cygwin Perl.

    To pass an open file descriptor to a child process in Windows Perl you actually have to pass an open low-level Windows file handle to the child and you have to create the child with something other than fork.

    The core module Win32API::File includes the required functionality for looking up the low-level handle so you can inform the child where to find it and for opening a Perl file handle so you can read from and/or write to it.

    There are several ways to spawn the child process, including: Win32::Process::Create(), system(1,...) (see perlport), system("start ...").

    Unfortunately, although I've done this successfully before and have helped others do it at PerlMonks, none of us has actually posted working examples of this as far as I can tell.

    But it wasn't particularly hard. You do the steps the same as on Unix except:

    • You set the "INHERIT" flag via Win32API::File::SetHandleInformation().
    • You get the low-level handle via FdGetOsFHandle().
    • You don't use fork() (see above).
    • You "open" the handle via OsFHandleOpen().

    - tye        

      Thanks, tye, have this all figured out now.

      fd_pass.pl

      #!/usr/bin/perl use v5.14; use warnings; use Win32API::File 'FdGetOsFHandle'; my $FILE = shift or die "Need file to read\n"; say "Opening file"; open( my $in, '<', $FILE ) or die "Can't open '$FILE': $!\n"; # Get the real FD from Windows my $fd = FdGetOsFHandle( fileno($in) ); say "Spawning child process"; my $pid = system(1, 'perl', './fd_get.pl', $fd ) or die "Could not spawn child process: $!\n"; wait;

      fd_get.pl

      #!/usr/bin/perl use v5.14; use warnings; use Win32API::File 'OsFHandleOpen'; my $FD = shift or die "Need file descriptor\n"; OsFHandleOpen( *IN, $FD, 'r' ) or die "Could not open file descriptor '$FD': $!\n"; while(<IN>) { chomp; say "Got in child: $_"; } close IN;

      "There is no shame in being self-taught, only in not trying to learn in the first place." -- Atrus, Myst: The Book of D'ni.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1083356]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others learning in the Monastery: (5)
As of 2024-04-24 03:15 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found