Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number
 
PerlMonks  

perl / embperl -- IPC::Open3;

by djlerman (Sexton)
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 (Archbishop) 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 musing on the Monastery: (3)
As of 2024-07-14 13:20 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found

    Notices?
    erzuuli‥ 🛈The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.