進程老是處於下面三種狀態之一:函數
運行。進程要麼在CPU上執行,要麼在等待被執行且最終會被內核調度。
中止。進程的執行被掛起(suspended),且不會被調度。
終止。進程永遠的中止了。進程會由於三種緣由終止:1)收到一個信號,該信號的默認行爲是終止進程,2)從主程序返回,3)調用exit函數。
父進程經過調用fork函數建立一個新的運行的子進程。
fork函數的特色:
調用一次,返回兩次。fork函數被父進程調用一次,可是卻返回兩次-----一次是返回到父進程,一次是返回到新建立的子進程。
當一個進程因爲某種緣由終止時,內核並非當即把它從系統中清除。相反,進程被保持在一種已終止的狀態中,直到被它的父進程回收(reaped)。當父進程回收已終止的子進程時,內核將子進程的退出狀態傳遞給父進程,而後拋棄已終止的進程,今後時開始,該進程就不存在了。一個終止了但還未被回收的進程稱爲僵死進程(zombie)。
一個進程能夠經過調用waitpid函數來等待它的子進程終止或者中止。
waitpid函數默認狀況下(當options=0時),掛起調用進程的執行,直到它的等待集合(wait set)中的一個子進程終止。若是等待集合中的一個進程在剛調用的時刻就已經終止了,那麼waitpid就當即返回。在這兩種狀況下,waitpid返回致使waitpid返回的已終止子進程的PID。此時,已終止的子進程已經被回收,內核會從系統中刪除掉它的全部痕跡。
傳送一個信號到目的進程是由兩個不一樣步驟組成的:
發送信號。內核經過更新目的進程上下文中的某個狀態,發送(遞送)一個信號給目的進程。發送信號能夠有以下兩種緣由:1)內核檢測到一個系統事件,好比除零錯誤或者子進程終止。2)一個進程調用了kill函數,顯式的要求內核發送一個信號給目的進程。一個進程能夠發送信號給它本身。
接收信號。當目的進程被內核強迫以某種方式對信號的發送作出反應時,它就接收了信號。進程能夠忽略這個信號,終止或者經過執行一個稱爲信號處理程序(signal handler)的用戶層函數捕獲這個信號。