Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid
 
PerlMonks  

perl / embperl -- IPC::Open3;

by djlerman (Beadle)
on May 16, 2014 at 21:29 UTC ( [id://1086395]=perlquestion: print w/replies, xml ) Need Help??

djlerman has asked for the wisdom of the Perl Monks concerning the following question:

I have come here to ask for your guidance.

I tried searches on line and even tried joining the mailing list for emperl embperl-subscribe@perl.apache.org I don't think it is available anymore.

I have a sample program in 2 formats perl & embperl

The perl version works as a CGI but the embperl version does not work.

Any suggestions or pointers to solutions would be appreciated

OS: Linux version 2.6.35.6-48.fc14.i686.PAE (...) (gcc version 4.5.1 20100924 (Red Hat 4.5.1-4) (GCC) ) #1 SMP Fri Oct 22 15:27:53 UTC 2010

perl working script

#!/usr/bin/perl use warnings; use strict; use IPC::Open3; use Symbol 'gensym'; print "Content-type: text/plain\n\n"; my $cmd = 'ls'; my $pid = open3(*HIS_IN, *HIS_OUT, *HIS_ERR, $cmd); close(HIS_IN); # give end of file to kid, or feed him my @outlines = <HIS_OUT>; # read till EOF my @errlines = <HIS_ERR>; # XXX: block potential if massi +ve print "STDOUT: ", @outlines, "\n"; print "STDERR: ", @errlines, "\n"; waitpid( $pid, 0 ); my $child_exit_status = $? >> 8; print "child_exit_status: $child_exit_status\n";

embperl non-working script

Here is the output I receive.
STDERR: ls: write error: Bad file descriptor

child_exit_status: 2

[- use warnings; use strict; use IPC::Open3; use Symbol 'gensym'; $escmode = 0; $http_headers_out{'Content-Type'} = "text/plain"; my $cmd = 'ls'; my $pid = open3(*HIS_IN, *HIS_OUT, *HIS_ERR, $cmd); close(HIS_IN); # give end of file to kid, or feed him my @outlines = <HIS_OUT>; # read till EOF my @errlines = <HIS_ERR>; # XXX: block potential if massi +ve print OUT "STDOUT: ", @outlines, "\n"; print OUT "STDERR: ", @errlines, "\n"; waitpid( $pid, 0 ); my $child_exit_status = $? >> 8; print OUT "child_exit_status: $child_exit_status\n"; -]

Replies are listed 'Best First'.
Re: perl / embperl -- IPC::Open3;
by zentara (Cardinal) on May 17, 2014 at 14:09 UTC
    Just looking at your embperl script, and assuming you copy&pasted it properly, it should fail because you have use strict enabled, but have a few variables without scope.
    Global symbol "$escmode" requires explicit package name at ./1086395.p +l line 7. Global symbol "%http_headers_out" requires explicit package name at ./ +1086395.pl line 8.

    It's conceivable that the cgi is trying to print this error, but it gives your bad filedescriptor error instead. Sometimes error reporting can be deceiving.


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

      $escmode and %http_headers_out are a part of and used in embperl. I don't think they need to be defined separately.

      Either way I removed them both from the script and I still get the same error

        With the help of user ikegami over at stackoverflow. The following solutions works.

        [- use warnings; use strict; use IPC::Open3; use POSIX; $http_headers_out{'Content-Type'} = "text/plain"; my $cmd = 'ls'; open(my $fh, '>', '/dev/null') or die $!; dup2(fileno($fh), 1) or die $! if fileno($fh) != 1; local *STDOUT; open(STDOUT, '>&=', 1) or die $!; my $pid = open3(*HIS_IN, *HIS_OUT, *HIS_ERR, $cmd); close(HIS_IN); # give end of file to kid, or feed him my @outlines = <HIS_OUT>; # read till EOF my @errlines = <HIS_ERR>; # XXX: block potential if mas +sive print OUT "STDOUT: ", @outlines, "\n"; print OUT "STDERR: ", @errlines, "\n"; waitpid( $pid, 0 ); my $child_exit_status = $? >> 8; print OUT "child_exit_status: $child_exit_status\n"; -]

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others chilling in the Monastery: (6)
As of 2025-06-16 09:23 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found

    Notices?
    erzuuliAnonymous Monks are no longer allowed to use Super Search, due to an excessive use of this resource by robots.