2012-01-20 25 views
2

我應該如何檢查系統命令是否成功運行並且沒有返回錯誤? 根據MSDN Library,有多種情況。我無法確定下列代碼段是否正確。如何檢查系統()結果

char buffer[100]; 
int ret_val; 
strcpy(buffer, "copy *.txt "); 
strcat(buffer, path); 
ret_val = system(buffer); 
if(0 != ret_val) 
{ 
    perror("There was an error"); 
} 
else 
{ 
    printf("The command was run successfully."); 
} 

返回值

如果命令是NULL和命令解釋被發現,返回一個非零值。如果未找到命令解釋程序,則返回0並將errno設置爲ENOENT。如果command不是NULL,則系統返回由命令解釋器返回的值。僅當命令解釋程序返回值0時,纔會返回值0.返回值-1表示錯誤,且errno設置爲以下值之一:

+0

[如何獲取系統運行的命令的狀態()]的可能的重複(http://stackoverflow.com/questions/8941691/how-to-get-the-status-of-command-run-by -system) –

+0

切勿使用'system'。使用它編寫安全,可靠的代碼幾乎是不可能的。 –

回答

1

要捕獲所有情況,還需要檢查errno,如文檔狀態:

if (ret_val == 0 && errno == 0) 
{ 
    printf("success!\n"); 
} 

請確保您還明確errno只是打電話system()之前。

+0

這不是真的有效。我把一個文件,它不能刪除,並按照你的建議運行。在Visual Studio 2008的Autos窗口中,我看到「_errno返回0x00400808」。但它也是如此陳述。 :( – mustafa

+0

** man 3系統表示:**返回值 返回的值在錯誤時爲-1(例如,fork()失敗),並且返回 否則爲返回狀態,後者的返回狀態爲 格式因此,該命令的退出代碼將爲 爲WEXITSTATUS(狀態)。如果/ bin/sh不能執行, 退出狀態將是退出命令的狀態(127) 。 –

+0

@Pete Wilson and for Windows? – mustafa

0

由於system的參數不爲NULL,因此您將注意力集中在一個非常簡單的情況:-1system函數失敗,否則返回實際命令的代碼。

+0

我發現在某些情況下,'system'正在返回'1' – mustafa

+0

@ mustafa然後這是實際的命令(在你的情況下是'copy'),退出時返回代碼 –

+0

是的,它可能是。編輯一個它無法刪除的文件。在控制檯輸出「進程無法訪問文件,因爲它正在被另一個進程使用。」但'system'仍然返回'0' – mustafa