一、联系

  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. 解决IE6下JS动态插入iframe不显示的方法

    function myshowBox(titles, urls, objWidth, objHeight, flags) {     var _title = titles;     var _url ...

  2. Ubuntu Gnome16.04下安装cuda、theano和opencv

    1. 安装显卡驱动 ~$ lspci | grep controller00:02.0 VGA compatible controller: Intel Corporation Sky Lake In ...

  3. VB6对象与地址相互转换

    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _ (lpDest As ...

  4. jquery选择器之子元素

    HTML代码: :first-child 匹配第一个子元素,每个父元素的第一个子元素 :last-child 匹配最后一个子元素,每个父元素的最后一个子元素 <!DOCTYPE html> ...

  5. jquery datatables双击,获取行号。

    function dbClickDatatables(rows) { $("#@(Perfix)tbData tbody tr").dblclick(function(e){ de ...

  6. S7-1200 与 S7-200 的对比PPT

  7. 【AT91SAM3S】英倍特串口示例工程05-UART中,串口是怎样初始化的

    在这个示例工程的main.c文件中,进入main之后,没有发现串口功能的任何配置.直接使用了printf这个东西进行输出.将软件下载到开发板上之后,在电脑端使用串口软件,可以看板子有数据发来.说明这个 ...

  8. access remote libvirtd

    访问远程libvirtd服务因为是在一个可信环境中运行,所以可以忽略安全方面的操作,步骤如下:(1)更改libvirtd配置    1.1 更改/ect/sysconfig/libvirtd文件,打开 ...

  9. NserviceBus+rabbitmq

    Ok so I figured this out after looking a bit at the code and the requirements for amqp URI and it sh ...

  10. Raising Modulo Numbers

    Description People are different. Some secretly read magazines full of interesting girls' pictures, ...