一、聯系
1、功能上,_exit和exit函數都是讓進程正常退出,即關閉進程所打開的文件描述符,釋放已占用內存和其他資源。
二、區別
1、_exit函數在頭文件unistd.h中聲明,而exit在頭文件stdlib.h中聲明。
2、執行_exit函數後,控制權立即返回給內核,而exit函數要先執行一些清除操作,然後才將控制權交給內核。
3、_exit函數不會刷新I/O緩沖區,可能造成數據丟失,而exit函數是在_exit函數之上的一個封裝,它在調用_exit函數之前,會先刷新I/O緩沖區,保證了數據的完整性。
注:知識背景:I/O緩沖區
在Linux C標准函數庫中,運用了一種名為“I/O緩沖區”的技術,即對於每一個打開的文件,在內存中都開辟了讀寫緩沖區。在讀文件的時候,會連續的從硬盤中讀出若干條數據到緩沖區,下次再讀文件的時候直接從緩沖區中獲取數據;同樣,在寫文件的時候,先把數據寫到緩沖區,等到緩沖區中的數據量到達一定程度或者接收到特殊的指令,再將緩沖區中的數據一次性寫到硬盤中。通過這種技術,減少了程序訪問硬盤的次數,提高了運行效率。
三、結論
exit()函數與_exit()函數最大區別就在於exit()函數在調用_exit函數之前要檢查文件的打開情況,把文件緩沖區的內容寫回文件。
下面通過兩個demo程序來驗證這個結論。
1、調用exit函數結束程序
1 #include <unistd.h> 2 #include <stdio.h> 3 #include <stdlib.h> //exit() 4 5 int main(int argc, char *argv[]) 6 { 7 printf("first_line\n"); //函數遇到“\n”時會刷新緩沖區 8 printf("second_line"); 9 exit(0); 10 return 0; 11 }
運行結果如下圖所示:兩行都打印出來了
2、調用_exit函數結束程序
1 #include <unistd.h> 2 #include <stdio.h> 3 #include <stdlib.h> 4 5 int main(int argc, char *argv[]) 6 { 7 printf("first_line\n"); 8 printf("second_line"); 9 _exit(0); 10 return 0; 11 }
運行結果如下圖所示:僅僅打印出第一行
3、先刷新緩沖區,再調用_exit函數結束程序
1 #include <unistd.h> 2 #include <stdio.h> 3 #include <stdlib.h> 4 5 int main(int argc, char *argv[]) 6 { 7 printf("first_line\n"); 8 printf("second_line\n"); 9 _exit(0); 10 return 0; 11 }
運行結果如下圖所示:結合demo2和demo3,可以得出demo2沒打印出第二行,是因為_exit函數結束程序時,沒有做刷新緩沖區的操作,導致數據丟失。