Alex Riesen <raa.lkml@xxxxxxxxx> wrote: > On 2/21/06, Sam Vilain <sam@xxxxxxxxxx> wrote: > > Alex Riesen wrote: > > >>>Does not work here (ActiveState Build 811, Perl 5.8.6): > > >>>$ perl -e 'open(F, "-|")' > > >>>'-' is not recognized as an internal or external command, > > >>>operable program or batch file. > > >>Portability, Ease of Coding, Few CPAN Module Dependencies. Pick any two. > > > Sometimes an upgrade is just out of question. Besides, that'd mean an > > > upgrade to another operating system, because very important scripts > > > over here a just not portable to anything else but > > > "ActiveState Perl on Windows (TM)" > > > I just have no choice. > > > > Sure, but perhaps IPC::Open2 or some other CPAN module has solved this > > problem already. > > IPC::Open2 works! Well "kind of": there are still strange segfaults regarding > stack sometimes. And I don't know yet whether and how the arguments are escaped > (Windows has no argument array. It has that bloody stupid one-line command line) It seems that ActiveState has more problems with pipes than it does with fork. If it supports redirects reasonably well, this avoids pipes entirely and may be more stable as a result (but possibly slower): # IO::File is standard in Perl 5.x, new_tmpfile # returns an open filehandle to an already unlinked file use IO::File; my $out = IO::File->new_tmpfile; file my $pid = fork; defined $pid or die $!; if (!$pid) { # redirects STDOUT to $out file open STDOUT, '>&', $out or die $!; exec('foo','bar'); } waitpid $pid, 0; seek $out, 0, 0; while (<$out>) { ... } Writing and reading from a tempfile are very fast for me in Linux, and probably not much slower than pipes. Of course I'm still assuming file descriptors stay shared after a 'fork', which may be asking too much on Windows. Using something from File::Temp to get a temp filename would still work. -- Eric Wong - : send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html