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

I am running a perl script (on Win) which calls C++ exe file, I would like to print out the return value of the C++ exe file

I used -

system("a.exe") print $?
either
$retVal = system("a.exe"); print "$retVal\n";
but both prints:
% C++ retVal : 3 % 256
Any idea why i get 256 and not 3 ? any solution

___________________________________

C++ code looks -
int main() { cout << "C++ retVal: 3" << endl; return 3; }
Thanks azaria

Replies are listed 'Best First'.
Re: Returned Code
by jettero (Monsignor) on Jun 15, 2008 at 10:33 UTC
    Check out IPC::System::Simple. It's brand new, but it simplifies stuff like this (and much more).

    If you check the system page, you'll see that you (probably) need to use the $?...

    if ($? == -1) { print "failed to execute: $!\n"; } elsif ($? & 127) { printf "child died with signal %d, %s coredump\n", ($? & 127), ($? & 128) ? 'with' : 'without'; } else { printf "child exited with value %d\n", $? >> 8; }

    ... I'm no expert on the topic, and you apparently need to be one, but I think you'll looking for $? >> 8.

    UPDATE: I definitely did think the retval from system() was the same as $?, but the example in the docs showed $?, so that's what I quoted. Really, I was trying to plug IPC::System::Simple and that was my main thesis. I'd like to see that module get really popular. It's neat. If I recall correctly, he (the ISS author) says you do need to check $? for some reason. Maybe I read it on perlbuzz. Maybe I made it up.

    -Paul

      If you check the system page, you'll see that you (probably) need to use the $?...

      $? is set to the return value of system are the same thing. I don't see the point of using a global variable when not needed.

      I think you'll looking for $? >> 8.

      Yes, or $retVal >> 8.

      I don't know why he's getting 256 (Error code 1) instead of 768 (Error code 3), but that's not a Perl issue.

        I don't see the point of using a global variable when not needed.

        Later in the day, I began to wonder. If it's the same as the return value from system, when is it ever needed?

        -Paul

      [nobody@nowhere]$ cat t.cpp #include <iostream> using namespace std; int main() { cout << "C++ retVal: 3" << endl; return 3; } [nobody@nowhere]$ cat t.pl #!/usr/bin/perl system("./a.out"); printf "Got retval: %d\n", $?>>8; [nobody@nowhere]$ ./t.pl C++ retVal: 3 Got retval: 3 [nobody@nowhere]$
Re: Returned Code
by hilitai (Monk) on Jun 15, 2008 at 13:42 UTC
    Could you please add some <code> tags to make your script readable? For example,

    <code>
    script goes here
    </code>

    UPDATE: I think the reason you're getting the '256' return is because your system("a.exe"); line is returning an error, not the bit-shifted '3' you are expecting. And I think it's returning an error because system() can't find a.exe, because it's not in your path. Does the return change if you specify system("./a.exe"); , or otherwise explicitly add in the path to the exe?

    I'm not on a Windows system, so I can't test your script any more directly.

      "." is always in the front of the PATH in Windows (implicitly), so if system("a.exe"); fails, so would system(".\a.exe");. (system("./a.exe"); just plain won't work.)

      But, that's a good thoery

      >perl -e"print system 'nonexistant'" 'nonexistant' is not recognized as an internal or external command, operable program or batch file. 256
      As others have said, the exit value is shifted within the $? variable. This is for historical reasons and compatibility with UNIX. 256 will be returned on an exit code of 1 (one). Incidently, this also means that Perl on Windows places an artificial limit of 0-255 on the exit code.

      The current directory is the second place searched for executables, the first being the directory from which the calling application was loaded.