wait (Unix)
功能
多進程系統內的進程(或任務)有時需要等待其他進程以完成自己的執行過程,而在包含父-子進程機制的類UNIX系統中,父進程能創建可獨立運行的子進程,並在需要時調用wait(函數聲明為pid_t wait(int *stat_loc))以使自己在子進程執行過程中保持休眠狀態。當任一子進程結束後,該子進程會向操作系統返回一個退出狀態,而後系統即向休眠中的父進程發送一個SIGCHLD信號以提醒之,至此父進程「復甦」並從內核獲取子進程的退出狀態,而後內核釋放原有子進程所占用的資源,父進程也繼續執行。
衍生
對於帶有線程機制的類UNIX系統來說,對於線程調度也有對應wait的實現:pthread_join會讓當前進程強制休眠,等待指定線程執行完畢後再繼續執行。
類UNIX系統還提供多種wait的衍生調用(如waitpid和waitid)以擴展適用範圍。藉助於這些變種,父進程可以休眠至任一子進程結束,也可以等待滿足指定條件(如匹配給定的進程標識符)的子進程結束後再繼續執行。另外,若利用額外選項做參數,waitpid和waitid在指定進程繼續運行或暫停執行時也會返回。
殭屍進程
即使沒有提前調用wait,在任一進程終止後,系統內核都會向其父進程發送SIGCHLD,這時父進程可以選擇使用SIG_IGN作為處理函數,令內核知曉自己不需獲得狀態,並直接交由init進程處理;亦可調用wait,則立即返回子進程退出狀態。若兩者皆不做,則子進程在進程表中占用的資源就無法得到釋放,進而成為殭屍進程,持續浪費資源[1]。為解決這一問題,系統常以特殊進程reaper(「收割者」)定位殭屍進程,並獲取其狀態以使系統可以解除資源分配,從而「收割」之[2]。
參見
參考來源
- ^ M. Tim Jones. Gnu/Linux Application Programming. Cengage Learning. 2005: 178.
- ^ Scott Mann, Ellen L. Mitchell. Linux System Security: An Administrator's Guide to Open Source Security Tools. Prentice Hall Professional. 2000: 167.