1. 程式人生 > >進程的wait函數

進程的wait函數

操作系統 option inf 執行 就是 接管 沒有 ppi wait函數

1.wait函數的作用

  多進程程序中,父進程需要跟蹤子進程的退出狀態。因此當子進程退出時,內核不會立刻釋放該進程的進程表項,而是需要父進程讀取一下子進程的狀態,子進程才能終止。

  因此子進程運行結束之後,父進程讀取其退出狀態之前,稱該進程處於僵屍態。另外一種是父進程終止或者異常退出,子進程繼續執行(此時子進程的PPID被操作系統設置為1,即init進程接管了該子進程並等待它結束),則在子進程退出之前,該子進程處於僵屍態。

  因此只要是父進程沒有讀取子進程的返回信息,子進程就會停在僵屍態。

  所以wait、waitpid函數就是用來讀取子進程的返回信息,使子進程完全終止。

2.wait、waitpid函數的使用方法

  pid_t wait(int *status);    //wait函數會在父進程中阻塞,等待子進程結束,如果子進程結束,則返回子進程的PID。如果沒有子進程則立刻返回-1。

  pid_t waitpid(pid_t pid, int *status, int options);  //waitpid函數等待子進程結束(options設置為WNOHANG時為非阻塞),如果子進程結束,則返回子進程的PID。如果沒有子進程則立刻返回-1,如果是非阻塞的並且子進程還沒有結束,則返回0。

  由於這兩個函數會阻塞等待(非阻塞時也需要輪詢執行),所以常規使用方式為:當子進程退出時會給父進程發送SIGCHID信號,因此父進程捕獲SIGCHID信號,並在信號處理函數中調用waitpid函數來結束一個子進程。如下:

  技術分享圖片

3.問題

  問題1:如果有多個子進程,則任意一個子進程結束時,wait函數就會返回,所以此時可以循環判斷wait返回-1時(另外返回-1時,errno 等於EINTR時表示中斷,所以此時需要繼續循環等待),才表示所有子進程都退出了。

    

  

進程的wait函數