談談對*NIX中對system()函數的理解

如在《Programming Perl》中對system()函數的說明,本函數執行任何系統中的程序並返回該程序的退出狀態---而不是它的輸出。
要捕獲命令行上的輸出,應該用反引號或者qx//。因爲system和反引號阻塞SIGINT及SIGQUIT,
所以向那些正在這樣運行的程序發送這些信號之一(比如通過Control-C)時不會中斷主程序。
但是你運行的另一個程序的確會受到這個信號。請檢查的返回值,判斷你運行的程序是否正常退出。
要獲取實際的退出值,要除以256或者右移8位。因爲最低7位標識殺死該進程的信號號碼,
而第八位標識該進程是否轉儲了核心。可以通過$?($CHILD_ERROR)來檢查所有失敗的可能性,如:
$exit_value = $? >> 8;
$exit_signal = $? & 127;
$dump_core = $? & 128;

《UNIX環境高級編程》中有對system()函數實現的詳細說明,它有3種返回值:
1)如果fork失敗或者waitpid返回除EINTR之外的出錯,則system返回-1,而且errno中設置了錯誤類型值;
2)如果exec失敗(表示不能執行shell),則其返回值如同shell執行了exit(127)一樣;
3)否則所有三個函數(fork,exec和waitpid)都執行成功,並且system的返回值是shell的終止狀態,其格式已在waitpid中說明。

《UNIX環境高級編程》這本書相當經典,有時間常常查閱總會得到新的理解體會,感謝Stevens和Rago給我們的寶貴經驗。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章