进程的退出
文章目錄
- 1 進程的退出
1 進程的退出
在Linux系統中,進程終止(或者稱為進程退出,為了統一,下文均使用”終止”一詞)的常見方式有5種,可以分為正常終止與異常終止:
正常終止:
- 從main函數返回。
- 調用exit()函數終止。
- 調用_exit()函數終止。
異常終止:
- 調用abort()函數異常終止。
- 由系統信號終止。
在Linux系統中,exit()函數定義在stdlib.h中,而_exit()定義在unistd.h中,exit()和_exit()函數都是用來終止進程的,當程序執行到exit()或_exit()函數時,進程會無條件地停止剩下的所有操作,清除包括 PCB在內的各種數據結構,并終止當前進程的運行。不過這兩個函數還是有區別的。
從圖中可以看出,_exit()函數的作用最為簡單:直接通過系統調用使進程終止運行,當然,在終止進程的時候會清除這個進程使用的內存空間,并銷毀它在內核中的各種數據結構;而exit()函數則在這些基礎上做了一些包裝,在執行退出之前加了若干道工序:比如exit()函數在調用exit系統調用之前要檢查文件的打開情況,把文件緩沖區中的內容寫回文件,這就是”清除I/O緩沖”。
由于在 Linux 的標準函數庫中,有一種被稱作”緩沖 I/O(buffered I/O)”操作,其特征就是對應每一個打開的文件,在內存中都有一片緩沖區。每次讀文件時,會連續讀出若干條記錄,這樣在下次讀文件時就可以直接從內存的緩沖區中讀取;同樣,每次寫文件的時候,也僅僅是寫入內存中的緩沖區,等滿足了一定的條件(如達到一定數量或遇到特定字符等),再將緩沖區中的內容一次性寫入文件。這種技術大大增加了文件讀寫的速度,但也為編程帶來了一些麻煩。比如有些數據,認為已經被寫入文件中,實際上因為沒有滿足特定的條件,它們還只是被保存在緩沖區內,這時用_exit()函數直接將進程關閉,緩沖區中的數據就會丟失。因此,若想保證數據的完整性,就一定要使用 exit()函數。
不管是那種退出方式,系統最終都會執行內核中的同一代碼,這段代碼用來關閉進程所用已打開的文件描述符,釋放它所占用的內存和其他資源。
下面一起看看_exit()與exit()函數的使用方法:
頭文件:
#include <unistd.h> #include <stdlib.h>函數原型:
void _exit(int status); void exit(int status);這兩個函數都會傳入一個參數status,這個參數表示的是進程終止時的狀態碼,0表示正常終止,其他非0值表示異常終止,一般都可以使用-1或者1表示,標準C里有EXIT_SUCCESS和EXIT_FAILURE兩個宏,表示正常與異常終止。
參考資料:
總結
- 上一篇: bios模式有密码忘记了怎么办 bios
- 下一篇: 进程间通信概述