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)
因此,我們可以由下面**判斷命令是否正常執行並返回:
1view codebool 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
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...