一、联系

  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函数结束程序

 #include <unistd.h>
#include <stdio.h>
#include <stdlib.h> //exit() int main(int argc, char *argv[])
{
printf("first_line\n"); //函数遇到“\n”时会刷新缓冲区
printf("second_line");
exit();
return ;
}

  运行结果如下图所示:两行都打印出来了

  

  2、调用_exit函数结束程序

 #include <unistd.h>
#include <stdio.h>
#include <stdlib.h> int main(int argc, char *argv[])
{
printf("first_line\n");
printf("second_line");
_exit();
return ;
}

  运行结果如下图所示:仅仅打印出第一行

  

  3、先刷新缓冲区,再调用_exit函数结束程序

 #include <unistd.h>
#include <stdio.h>
#include <stdlib.h> int main(int argc, char *argv[])
{
printf("first_line\n");
printf("second_line\n");
_exit();
return ;
}

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

  

Linux C _exit函数与exit函数的联系与区别的更多相关文章

  1. Linux多任务编程之四:exit()函数及其基础实验(转)

    来源:CSDN  作者:王文松   转自Linux公社 exit()和_exit()函数 函数说明 创建进程使用fork()函数,执行进程使用exec函数族,终止进程则使用exit()和_exit() ...

  2. atexit函数和exit函数的理解

    按照ISO C的规定,一个进程可以登记多达32个函数,这些函数将由exit自动调用,通常这32个函数被称为终止处理程序,并调用atexit函数来登记这些函数. 我们通常认为C语言的起始函数是main函 ...

  3. absort函数和exit函数

    1. exit()函数会结束并退出程序. 1. abosrt()函数会触发程序的异常,然后程序后面的语句就不会执行了.用来提示错误.会出现:  

  4. 引用 exit、return、_exit、_Exit这几个函数的区别

    引用 exit.return._exit._Exit这几个函数的区别 一.exit函数和return函数的主要区别是: exit用于在程序运行的过程中随时结束程序,其参数是返回给OS的.也可以这么讲: ...

  5. 回收进程用户空间资源 exit()函数 _exit()函数 atexit()函数 on_exit()函数

    摘要:本文主要讲述进程的终止方式,以及怎样使用exit()函数来终止进程.回收进程用户空间资源:分析了exit()函数与_exit()函数,returnkeyword的差异.同一时候具体解读了怎样使用 ...

  6. linux fork函数与vfork函数,exit,_exit区别

    man vfork: NAME vfork - create a child process and block parent SYNOPSIS #include <sys/types.h> ...

  7. Linux多任务编程之五:exit()和_exit()函数(转)

    来源:CSDN  作者:王文松   转自:Linux公社 ----------------------------------------------------------------------- ...

  8. 【Linux编程】进程终止和exit函数

    内核要运行一个应用程序,唯一的途径是通过系统调用.exec函数.exec又会调用启动程序,启动程序(一般是汇编语言)以类似以下的方式调用main函数: void exit(main(argc, arg ...

  9. Exit函数

    1函数: exit() 函数名: exit() 所在头文件:stdlib.h 功 能: 关闭所有文件,终止正在执行的进程. exit(1)表示异常退出.这个1是返回给操作系统的. exit(x)(x不 ...

随机推荐

  1. Android分享中,如何过滤指定的应用,并且对不同的分享方式发送不同的内容?

    网上找到的一篇关于: 针对不同的应用,使用不同的方式的文章.原文地址 String contentDetails = ""; String contentBrief = " ...

  2. C# 给某个方法设定执行超时时间 C#如何控制方法的执行时间,超时则强制退出方法执行 C#函数运行超时则终止执行(任意参数类型及参数个数通用版)

    我自己写的 /// <summary> /// 函数运行超时则终止执行(超时则返回true,否则返回false) /// </summary> /// <typepara ...

  3. SQL2005:SQL Server 2005还原数据库时出现“不能选择文件或文件组XXX_log用于此操作的解决办法

    SQL2005 还原数据库失败,提示如下: SQL Server 2005还原数据库时出现“不能选择文件或文件组XXX_log用于此操作的解决办法 出现错误时操作步骤为:右击数据库--->任务- ...

  4. -include和sinclude 作用

    -include和sinclude   如果有文件没有找到的话,make会生成一条警告信息,但不会马上出现致命错误.它 会继续载入其它的文件,一旦完成makefile的读取,make会再重试这些没有找 ...

  5. Android总结篇系列:Activity Intent Flags及Task相关属性

    同上文一样,本文主要引用自网上现有博文,并加上一些自己的理解,在此感谢原作者. 原文地址: http://blog.csdn.net/liuhe688/article/details/6761337 ...

  6. java io流 对文件操作

    检查文件是否存在 获取文件路径 获取文件大小 ...... 更多参考手册 //对文件的操作 //检查文件是否存在 //获取文件路径 //获取文件大小 //文件是否可读 //文件是否可写 //.... ...

  7. java io流(字节流)复制文件

    java io流(字节流) 复制文件 //复制文件 //使用字节流 //复制文本文件用字符流,复制其它格式文件用字节流 import java.io.*; public class Index{ pu ...

  8. JavaScript 数据验证类

    JavaScript 数据验证类 /* JavaScript:验证类 author:杨波 date:20160323 1.用户名验证 2.密码验证 3.重复密码验证 4.邮箱验证 5.手机号验证 6. ...

  9. 【javascript基础】8、闭包

    前言 函数和作用域啥的我们前面已经了解了,现在就要学习闭包了,这是一个挺晦涩的知识点,初学者可能会感觉不好理解,但是高手都不不以为然了,高手就给我提点意见吧,我和新手一起来学习什么是闭包. 例子 先不 ...

  10. UITapGestureRecognizer响应顺序是怎么样的

    一个scrollview上有几个按钮在scrollview上add 了一个单击事件 singletap = [[UITapGestureRecognizer alloc] initWithTarget ...