2011-12-23 106 views
5

我在Linux下測試這個小程序:

// foo.c 
#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char* argv[]) 
{ 
    int n = system(argv[1]); 
    printf("%d\n", n); 
    return n; 
} 

無論什麼被送入命令行,一個echo $?始終打印0,如:

$ ./foo anything 
sh: anything: not found 
32512 
$ echo $? 
0 

我的問題是:爲什麼不是$?取值與n相同嗎?我也在Win32下測試了該程序,並且echo %errorlevel%給出了與n相同的值。謝謝!

+0

當'系統()參與'可以只複製行爲? (一個負值正在返回,不是嗎?這是在Linux中定義的嗎?) – 2011-12-23 07:49:25

+0

我只在'system()'中看到過這種行爲。如果我執行'./ anything'後跟'echo $?',輸出結果爲127. – wdscxsj

回答

6

如果您在八進制或十六進制打印n,你會發現,它的低字節始終爲0

如果return WEXITSTATUS(n);,你的程序將與您所期待的狀態退出。

仔細閱讀man systemman wait,你就會明白。

+0

您也可以將n傳遞給exit();即。 '退出(n);' –

+0

謝謝!現在我明白了。 – wdscxsj

+1

@MarkTurner不,你不能。 'main()'返回的'return n;'會在'main'返回後立即產生'exit(n)'(幾乎)。 * *仍然會導致'$?'爲'0'。 –

2

的返回值只有低8位是公認的退出狀態,因爲退出狀態是由WEXITSTATUS宏觀計算,見SUSv4

+0

我認爲你的意思是8到15位? – wdscxsj

+0

是什麼讓你覺得呢? – wRAR

+0

對不起,我錯了。謝謝。 – wdscxsj

相關問題