2

I want to system() to print pstack info in my application, but it failed and return 256.But I pick up these codes as below to one new main function,that's ok. why?

char cmd[256] ;
string pstackCmd;
struct timeval tv;
struct tm lt;(&tv, NULL);

localtime_r(&tv.tv_sec, &lt);
sprintf(cmd, "pstack `pgrep app` > pstack_%04d%02d%02d%02d%02d%02d%03d",
                            lt.tm_year+1900,
                            lt.tm_mon+1,
                            lt.tm_mday,
                            lt.tm_hour,
                            lt.tm_min,
                            lt.tm_sec,
                            (int)(tv.tv_usec/1000));
pstackCmd = string(cmd);
int retValue = system(pstackCmd.c_str());
if ( retValue != 0)
{
    printf("pstack `pgrep app`,retValue:%d",retValue);
}
Chris Hayes
  • 11,471
  • 4
  • 32
  • 47
cathrine
  • 49
  • 1
  • 1
  • 4
  • possible duplicate of [Executing shell script with system() returns 256. What does that mean?](http://stackoverflow.com/questions/3736320/executing-shell-script-with-system-returns-256-what-does-that-mean) – Barmar Oct 15 '14 at 06:08
  • seems not, I build one new binary with these code, and run it in same directory.it can work fine. – cathrine Oct 15 '14 at 06:17
  • possible duplicate of [Any benefit in using WEXITSTATUS macro in C over division by 256 on exit() status?](http://stackoverflow.com/questions/808541/any-benefit-in-using-wexitstatus-macro-in-c-over-division-by-256-on-exit-statu) – glglgl Oct 15 '14 at 06:59

2 Answers2

5

Instead of this:

if (retValue != 0)

You need this:

if (retValue == -1 || WEXITSTATUS(retValue) != 0)

That is, you check for failure first by seeing if system() returned -1; if it did not then the exit status of the command (with zero meaning success, traditionally).

John Zwinck
  • 239,568
  • 38
  • 324
  • 436
3

This mean that something went wrong and the command was not successfully executed. The return value 256 actually means 1.

For more info check these link:

System Return Code (was: 256)

system()

If you'd like to manually inspect system's failure, you can check all possible failure modes by inspecting `$?` like this:

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;
}

Where $? >> 8 is bitshifting by 8, which is essentially dividing by 256.

ani627
  • 5,578
  • 8
  • 39
  • 45
  • `>> 8` works perfect...I have a script that returns 1 and kept getting 256 in my c code that uses `system` to run the script. Now I receive what I expect.. – GoinOff Aug 30 '19 at 18:07