System函數:
是由fork、execve和waitpid三個系統調用實現的。
例如執行:system("ls /tm") --返回值爲256
所以如果execve出錯,則直接調用_exit(256),所以變量ret的值等於256.
在system函數執行時,會啓動一個子進程運行shell,然後通過將ls /tm作爲參數傳給shell,如果shell命令運行有錯,就調用exit XXX作爲system的返回值返回,而XXX是system函數的返回值,而不是shell運行ls /tm後的返回值。
Exit函數:
exit時,退出狀態碼只能是一個字節,超過部分被截取.
在父進程獲取其狀態時,把這個字節的數據放在了低地址第二個字節位置了.這些都是對補碼操作的.
因此,exit (-1) 和exit (255)時,父進程取的狀態碼是一樣的,你無法區分
因此,我們一般只根據退出狀態爲0或則非0來判斷成功或失敗,而不做進一步的區分.
注意:
如果把system的返回值除以256就可以得到真正的返回值了,因爲system()返回的結果分兩個部分,前面是命令的返回值,後面是運行因爲信號終止時的信號值。所以要/256就是這個原因。