zoukankan      html  css  js  c++  java
  • Linux C _exit函数与exit函数的联系与区别

    一、联系

      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
    ");   //函数遇到“
    ”时会刷新缓冲区
     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
    ");
     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
    ");
     8     printf("second_line
    ");
     9     _exit(0);
    10     return 0;
    11 }

      运行结果如下图所示:结合demo2和demo3,可以得出demo2没打印出第二行,是因为_exit函数结束程序时,没有做刷新缓冲区的操作,导致数据丢失。

      

  • 相关阅读:
    android 发短信
    如何判断一个Div是否可视区域,判断div是否可见
    java arrayCopy
    Java 正则表达式 向前、向后匹配
    postgres 正则表达式
    java 分析方法调用过程
    chrome 模拟点击
    Java获取NTP网络时间
    Android对话框与Activity共存时的异常
    Android代码混淆
  • 原文地址:https://www.cnblogs.com/yongqiang/p/6129623.html
Copyright © 2011-2022 走看看