exit(),_exit()的区别
Linux的源碼
#define __NR_exit???????????????? 1
#define __NR__exit __NR_exit /* 摘自文件include/asm-i386/unistd.h*/
"__NR_"是在Linux的源碼中為每個系統調用加上的前綴,請注意第一個exit前有2條下劃線,第二個exit前只有1條下劃線。
Linux核心還提供了一些C語言函數庫,這些庫對系統調用進行了一些包裝和擴展,因為這些庫函數與系統調用的關系非常緊密,所以習慣上把這些函數也稱為系統-調用。#define這句只能說明內核里的兩個系統調用_exit和exit相同,但其封裝后對應的C庫函數_exit()和exit()是不同的。
exit()函數定義在stdlib.h中,而_exit()定義在unistd.h中;
exit()函數的作用最為簡單:直接使進程停止運行,清除其使用的內存空間,并銷毀其在內核中的各種數據結構;exit()函數則在這些基礎上作了一些包裝-,在執行退出之前加了若干道工序,也是因為這個原因,有些人認為exit已經不能算是純粹的系統調用。
exit()函數與_exit()函數最大的區別就在于exit()函數在調用exit系統調用之前要檢查文件的打開情況,把文件緩沖區中的內容寫回文件,即所謂的"清理I/O緩沖"。
‘exit()’與‘_exit()’有不少區別在使用‘fork()’,特別是‘vfork()’時變得很 突出。
‘exit()’與‘_exit()’的基本區別在于前一個調用與實施庫里用戶狀態結構 (user-mode constructs)有關的清除工作(clean-up),而且調用用戶自定義的清除程序 (譯者注:自定義清除程序由atexit函數定義,可定義多次,并以倒序執行),相對 應,后一個函數只為進程實施內核清除工作。
在由‘fork()’創建的子進程分支里,正常情況下使用‘exit()’是不正確的,這是 因為使用它會導致標準輸入輸出(譯者注:stdio: Standard Input Output)的緩沖區被 清空兩次,而且臨時文件被出乎意料的刪除(譯者注:臨時文件由tmpfile函數創建 在系統臨時目錄下,文件名由系統隨機生成)。在C++程序中情況會更糟,因為靜 態目標(static objects)的析構函數(destructors)可以被錯誤地執行。(還有一些特殊情況,比如守護程序,它們的父進程需要調用‘_exit()’而不是子進程;適用于絕大多數情況的基本規則是,‘exit()’在每一次進入‘main’函數后只調用一次。)
在由‘vfork()’創建的子進程分支里,‘exit()’的使用將更加危險,因為它將影響 父進程的狀態
總結
以上是生活随笔為你收集整理的exit(),_exit()的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库读写分离 - MyBatis
- 下一篇: 高斯数学