C++ wait捕捉的信號處理WIFEXITED/WEXITSTATUS/WIFSIGNALED


當一個進程正常或異常終止的時候,內核就像其父進程發送SIGCHLD信號,因為子進程是個異步事件,所以這種信號也是內核給那個父進程發的異步通知。父進程可以選擇忽略該信號,或者提供一個該信號發生時即被調用執行的函數。對於這種信號的系統默認動作是忽略它。

調用wait或waitpid的進程可能會發生什么情況:

 

  •  如果其所有子進程都在運行,則阻塞。
  • 如果一個子進程已經終止,正在等待的父進程獲取到終止狀態,則取得該子進程的終止狀態立即返回。
  • 如果他沒有任何子進程,則立即出錯返回。

WIFEXITED(status)如果子進程正常結束則為非0值。
  WEXITSTATUS(status)取得子進程exit()返回的結束代碼,一般會先用WIFEXITED 來判斷是否正常結束才能使用此宏。
WIFSIGNALED(status)如果子進程是因為信號而結束則此宏值為真。
  WTERMSIG(status)取得子進程因信號而中止的信號代碼,一般會先用WIFSIGNALED 來判斷后才使用此宏。
WIFSTOPPED(status)如果子進程處於暫停執行情況則此宏值為真。一般只有使用WUNTRACED 時才會有此情況。
  WSTOPSIG(status)取得引發子進程暫停的信號代碼。

1     if (WIFEXITED(status))
2         cout << "normal termination, exitstatus = " << WEXITSTATUS(status) << endl;
3     else if (WIFSIGNALED(status))
4         cout << "abnormal termination, signalstatus = " << WTERMSIG(status) << endl;
5     else if (WIFSTOPPED(status))
6         cout << "child stopped ,signal number = " << WSTOPSIG(status) << endl;
7     else 
8         cout << "unknown status :" << status << endl;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM