2013-11-25 60 views
4

例如,計劃的a.out如何獲取系統調用調用的程序退出代碼?

int main() 
{ 
    return 0x10; 
} 

計劃B.OUT

int main() 
{ 
    if(system("./a.out") == 0x10) 
     return 0; 
    else 
     return -1; 
} 

根據cppreferencesystem()返回值是實現依賴。因此,程序b.out的嘗試顯然是錯誤的。

在上面的情況下,我怎樣才能得到0x10而不是一個未確定的值? 如果系統調用不是正確的工具,那麼執行此操作的正確方法是什麼?

+3

這是實現定義的,這意味着你需要查找的* UNIX或UNIX例如文檔般的環境*'男人system'會告訴你你需要的細節。 –

+1

請參閱http://stackoverflow.com/questions/2667095/c-how-can-i-get-return-value-of-command-passed-to-execl – usr2564301

+1

「系統」對此有點沉重。你真的想爲此啓動一個shell嗎?如果調用代碼每次都以root身份運行,或者在奇怪的環境中運行,那麼這就是安全禁止。 –

回答

6

報價man system

The value returned is -1 on error (e.g. fork(2) failed), and the 
    return status of the command otherwise. This latter return status is 
    in the format specified in wait(2). Thus, the exit code of the command 
    will be WEXITSTATUS(status). In case /bin/sh could not be executed, 
    the exit status will be that of a command that does exit(127). 

您需要使用WEXITSTATUS確定命令的退出代碼。你b.c需要看起來像:

#include <stdio.h> 
#include <sys/wait.h> 
int main() 
{ 
    int ret = system("./a.out"); 
    if (WEXITSTATUS(ret) == 0x10) 
     return 0; 
    else 
     return 1; 
} 
+3

也許更便攜,'if(WIFEXITED(ret)&& WEXITSTATUS(ret)== ...)'? –

+0

如果你使用Visual C++,你會怎麼做?我們不會使用'' –

2

如果你在unix系統上,你應該使用fork execve並等待。

這裏你的情況的一個示例代碼:

Program b.out: 

int main() 
{ 
    return 0x10; 
} 

pRogram a.out: 

int main() 
{ 
int pbPid = 0; 
int returnValue; 
if ((pbPid = fork()) == 0) 
{ 
    char* arg[]; //argument to program b 
    execv("pathto program b", arg); 
} 
else 
{ 
    waitpid(pbPid, &returnValue, 0); 
} 
returnValue = WEXITSTATUS(returnValue); 
return 0; 
}