system系統呼叫返回值判斷命令是否執行成功

2022-07-17 11:24:09 字數 1285 閱讀 5391

system函式對返回值的處理,涉及3個階段:

階段1:建立子程序等準備工作。如果失敗,返回-1。

階段2:呼叫/bin/sh拉起shell指令碼,如果拉起失敗或者shell未正常執行結束(參見備註1),原因值被寫入到status的低8~15位元位中。system的man中只說明了會寫了127這個值,但實測發現還會寫126等值。

階段3:如果shell指令碼正常執行結束,將shell返回值填到status的低8~15位元位中。

備註1:

只要能夠呼叫到/bin/sh,並且執行shell過程中沒有被其他訊號異常中斷,都算正常結束。

比如:不管shell指令碼中返回什麼原因值,是0還是非0,都算正常執行結束。即使shell指令碼不存在或沒有執行許可權,也都算正常執行結束。

如果shell指令碼執行過程中被強制kill掉等情況則算異常結束。

如何判斷階段2中,shell指令碼是否正常執行結束呢?系統提供了巨集:wifexited(status)。如果wifexited(status)為真,則說明正常結束。

如何取得階段3中的shell返回值?你可以直接通過右移8bit來實現,但安全的做法是使用系統提供的巨集:wexitstatus(status)。

由於我們一般在shell指令碼中會通過返回值判斷本指令碼是否正常執行,如果成功返回0,失敗返回正數。

所以綜上,判斷乙個system函式呼叫shell指令碼是否正常結束的方法應該是如下3個條件同時成立:

(1)-1 != status

(2)wifexited(status)為真

(3)0 == wexitstatus(status)

因此,我們可以由下面**判斷命令是否正常執行並返回:

1

bool mysystem(const

char *command)2

11else

12

19 printf("

mysystem: run shell script fail, script exit code: %d\n

", wexitstatus(status));

20return

false

;

21}

22 printf("

mysystem: exit status = [%d]\n

", wexitstatus(status));

23return

false;24

} 25

}26

view code

system函式返回值

剛用到system函式,要根據其返回值來做進一步操作,可是system的返回值並不等於其呼叫的程式的返回值,man了沒看懂,後來在網上搜尋了一下,終於看到了乙個dx的理解,記錄之。引自 原文 要分成兩部分來說 1,在程式中,用exit來設定程序的退出值時,雖然該函式的引數型別為int型,但再父程序中...

Unix系統中system函式的返回值

網上關於system函式的返回值說明很多很詳細但卻不直觀,這裡搬出apue 3rd editon中實現system函式的 來說明其返回值。include include include int system const char cmdstring else if pid 0 else return...

windows下system函式返回值

在dos下,system 只是做乙個呼叫其他程式的工作,只要呼叫成功就返回0,不成功就返回 1。它不能得到被呼叫的程式的執行結果。要得到其他程式的執行的結果,要用spawn 這個家族的函式。linux和windows中system的不同之處在於 如果子程式呼叫成功,但執行失敗時,linux下的sys...