歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux C _exit函數與exit函數的聯系與區別

Linux C _exit函數與exit函數的聯系與區別

日期:2017/3/1 9:07:45   编辑:Linux編程

一、聯系

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函數結束程序時,沒有做刷新緩沖區的操作,導致數據丟失。

Copyright © Linux教程網 All Rights Reserved