问题
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, <);
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);
}
回答1:
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).
回答2:
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.
来源:https://stackoverflow.com/questions/26375514/call-system-return-256