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.