the same code fails with eof on $error. I have no idea why this fails and how to find more details on reasons for that. Please advise how to step forward to find root cause.

With IPC::Open3, I can see 2 possible options to see what is actually happening. one is to set the $error filehandle to 0, and redirect it to stdout. The other option to to add both $reader and $error to an IO::Select loop and collect them separately.

Here are 2 samples:

#!/usr/bin/perl use warnings; use strict; use IPC::Open3; use IO::Select; my $pid = open3(\*WRITE, \*READ,\*ERROR,"bc"); #if \*ERROR is false,0, STDERR is sent to STDOUT my $sel = new IO::Select(); $sel->add(\*READ); $sel->add(\*ERROR); my($error,$answer)=('',''); while(1){ print "Enter command\n"; chomp(my $query = <STDIN>); #send query to bash print WRITE "$query\n"; foreach my $h ($sel->can_read) { my $buf = ''; if ($h eq \*ERROR) { sysread(ERROR,$buf,4096); if($buf){print "ERROR-> $buf\n"} } else { sysread(READ,$buf,4096); if($buf){print "$query = $buf\n"} } } } waitpid($pid, 1); # It is important to waitpid on your child process, # otherwise zombies could be created.
or
#!/usr/bin/perl # by pg of perlmonks # This is for lazy people. Sometime # when you compile your c/c++ program, you may get # tons of errors, especially when you miss some # include files or just start a new program. In # this case the error messages just fly away # quickly, and you get totally lost. Well, you may # increase your buffer, you may redirect your # output but for people who are lazy like me, you # want a script. # This script starts your make process thru open3, # capturing all compiling errors, and dumping them # to both screen and a file called error_log. If # the error log is short, you can just view it on # screen, otherwise vi the error_log. use IPC::Open3; use strict; use warnings; my $pid = open3(\*WRITER, \*READER, \*ERROR,"make"); open(ERROR_LOG, ">", "error_log"); while (my $line = <ERROR>) { print $line; print ERROR_LOG $line; } close(ERROR_LOG); waitpid($pid, 0); ####################################################### #or # "man script" #or # command 2>&1 | tee ./myerror.log

I'm not really a human, but I play one on earth.
Old Perl Programmer Haiku ................... flash japh

In reply to Re: Problems with open3 by zentara
in thread Problems with open3 by stdietz

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.