當一個進程正?;蛞粓鼋K止時,內核就向其父進程發送SIGCHLD信號。因為子進程終止是個異步時間,所以這種信號也是內核向父進程發的異步通知。父進程可以選擇忽略該信號,或者提供一個該信號發生時既被調用執行的函數。對于這種信號的系統默認是忽略它。
wait
如果其所有子進程都還在運行,則阻塞。
如果一個子進程已終止,則立即出錯返回。
如果他沒有子進程,則立即出錯返回。
waitpid
pid == -1 等待任一子進程。此種情況下,waitpid與wait等效。
pid > 0 等待進程ID與pid相等的子進程
pid ==0 等待組ID等于進程組ID的任一子進程
pid < -1等待組ID等于pid絕對值的任一子進程。
waitpid函數反悔終止子進程的進程ID,并將該子進程的終止狀態放在由statloc指向的存儲單元中。
對于wait,其唯一的出錯是調用進程沒有子進程。但是對于wiatpid,如果指定的進程或進程組不存在,或者參數pid之地鞥的進程不是調用進程的子進程,都可能出錯。
waitpid通過WUNTRACKCED和WCONTINUED選項支持作業控制。
waitid
P_PID 等待一特定進程。id包含要等待子進程的進程ID
P_PGID 等待一特定進程組的任一子進程,id包含要等待子進程的進程組id
P_ALL 等待任一子進程。忽略id
exec
當進程調用一總exec函數時,該進程執行的程序完全替換位新程序,而心程序則從其main函數開始執行。因為exec并不創建心進程,所以前后的進程ID并未改變。exec只是用磁盤上的一個心程序替換當前進程的正文段、數據段、堆段和棧段。
一般而言,在設計應用時,我們總是試圖使用最小特權模型。
1 若進程具有超級用戶特權,則setuid函數將實際用戶id、有效用戶id以及保存的設置用戶id設置為uid。
2 若進程沒有超級用戶特權,但是uid等于實際用戶id或者保存的設置用戶id,則setuid只將有效用戶id設置位uid。不更改實際用戶id何保存的設置用戶id。
3 如果上面兩個條件都不滿足,則errno設置位EPERM,并返回-1。
在此嘉定_POSIX_SAVED_IDS為真。如果沒有提供這種功能,則上面所說的關于保存的設置用戶id部分都無效。
僅當對程序文件設置了設置用戶id位時,exec函數才設置又小用戶id。如果設置用戶id位沒有設置,exec函數不會改變有效用戶id,而將維持其現有值。任何時候都可以調用setuid,將有效用戶id設置為實際用戶id或保存的設置用戶id。自然地,不能將有效用戶id設置位任一隨機值。
保存的設置用戶id是由exec復制有效用戶id而得到的。如果設置了文件的設置用戶id位,則在exec根據文件的用戶id設置了進程的又小用戶id以后,這個副本就被保存起來了。
進程會計 process accounting
大多數unix系統提供了一個選項進行進程會計處理。啟用該選項后,當進程借宿時內核就寫一個會計記錄。
在會計文件中記錄的順序對應于進程終止的順序,而不是他們的啟動順序。
為了確定啟動順序,需要讀全部會計文件,并按啟動日歷時間進行排序。
會計記錄對應于進程而不是程序。
UNIX系統歷史上對進程提供的知識基于調度優先級的粗粒度的控制。調度策略和調度優先級是由內核確定的。進程可以通過調整nice值選擇以更低優先級運行。只有特權進程允許提高調度權限。nice值越小,優先級越高。