今天仔细看了一下exit和_exit这两个函数的区别,实际上exit也是调用了_exit退出函数的,只不过在调用_exit之前,exit还进行了一些多余的工作,也正是因为这样,相比起来exit就没有那么接近底层的系统调用,更应该说是包装过的标准C库函数。_exit包含在头文件unistd.h中,exit包含在头文件stdlib.h中,我们来查看一下他们的函数原型。

man _exit :

很显然,_exit函数做这三件事情:

1. 让调用的进程马上终止。

2.关闭所有由这个进程打开的文件描述符。

3.调用进程的所有子进程都被初始化init进程收养,调用进程将发送SIGCHLD给他的父进程(这都是因为他即将要退出了,当然要安顿好自己的孩子和告别父母啦)。

man exit:

exit则做了这几件事:

1.按axexit或者on_exit注册时相反的顺序调用所有由它注册的函数(出口函数),可以把on_exit看作atexit的扩展。(这使得我们可以指定在程序终止时执行自己的清理动作.例如,保存程序状态信息于某个文件,解开对共享数据库上的锁等。)如果有任意一个注册的函数不返回(比如这个函数call _exit或者用像SIGKILL这样的信号把自己干掉了),那么剩余的注册函数都不会得到执行,而且接下来更深层次的exit都不会被执行。如果一个函数被注册了多遍,那么也会按顺序执行多遍(这些是atexit的特性)。

2.所有打开的输入输出流都将被清空和关闭,换句话说就是把缓冲区的内容写回文件中。那些用tmpfile函数创建的临时文件都将被移除。

3.调用_exit。

所以,总的来说,exit就是对_exit进行了一些包装,使得整个退出的过程显得不那么粗暴,他们俩的共同点就是都会关闭文件描述符,都会清空内存,但是exit还会额外地清空输入输出流缓存,移除临时创建的文件,调用注册好的出口函数等等。

现在我们只需要用一个小例子来观察他们俩的区别就可以了:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> int main(int argc, char const *argv[])
{
printf("hello\n");
printf(" hi");
exit(0);
//_exit(0);
return 0;
}

对于上面这段代码,我们的执行结果为:

而我们把代码改一改:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> int main(int argc, char const *argv[])
{
printf("hello\n");
printf(" hi");
//exit(0);
_exit(0);
return 0;
}

结果就变成了:

这显然是因为_exit并没有进行缓冲区的清空等操作,而exit则会把缓冲的内容都清空。

参考博客:

http://blog.chinaunix.net/uid-12461657-id-3140887.html

linux exit 和 _exit的区别的更多相关文章

  1. exit和_exit的区别

    参考 http://www.cnblogs.com/hnrainll/archive/2011/08/17/2142001.html p.p1 { margin: 0.0px 0.0px 0.0px ...

  2. Linux中exit与_exit的区别

    在exit,_exit的区别 - exit()与_exit()函数的区别(Linux系统中)2012-03-20 15:19:53 分类: LINUX 注:exit()就是退出,传入的参数是程序退出时 ...

  3. 转:exit()与_exit()的区别

    版权声明:本文为博主原创文章,未经博主允许不得转载. 从图中可以看出,_exit 函数的作用是:直接使进程停止运行,清除其使用的内存空间,并清除其在内核的各种数据结构:exit 函数则在这些基础上做了 ...

  4. exit()与_exit()的区别

    从图中可以看出,_exit 函数的作用是:直接使进程停止运行,清除其使用的内存空间,并清除其在内核的各种数据结构:exit 函数则在这些基础上做了一些小动作,在执行退出之前还加了若干道工序.exit( ...

  5. exit()与_exit()的区别(转)

    http://blog.csdn.net/lwj103862095/article/details/8640037 从图中可以看出,_exit 函数的作用是:直接使进程停止运行,清除其使用的内存空间, ...

  6. exit()和_exit()的区别

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/HAHAandHEHE/article/de ...

  7. exit()和_exit()函数

    进程就好比人一样有其生命,我们通过fork()函数来创建一个进程,那么我们又是如何来中止进程呢. 进程退出 1.在Linux中任何让一个进程退出 进程退出表示进程即将结束.在Linux中进程退出分为了 ...

  8. 进程退出exit、_exit、abort

    分为正常退出,异常退出 正常退出的方法: 1.在main函数中执行return 2.调用exit函数 3.调用_exit  函数 ----------------------------------- ...

  9. exit()与_exit()函数的区别(Linux系统中)

    注:exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出,一般都用-1或者1,标准C里有EXIT_SUCCESS和EXIT_FAILURE两个宏,用exit(EXI ...

随机推荐

  1. c++ 打包函数教程

    c++当要重复运行一些代码时可以打包一个函数 当没有返回值时用void打包函数: #include <iostream> #include <stdio.h> using na ...

  2. HCNP Routing&Switching之路由过滤工具Filter-Policy

    前文我们了解了路由控制技术中路由策略和路由匹配工具IP-Prefix相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15314262.html:今天我们 ...

  3. php curl下载文件由于空格导致下载文件失败

    <?php //$result=httpcopy('http://www.phpernote.com/image/logo.gif'); echo '<pre>';print_r($ ...

  4. Java面向对象系列(3)- 回顾方法的调用

    方法的调用 静态方法 非静态方法 形参和实参 值传递和引用传递 this关键字(继承篇讲解) 静态方法 非静态方法 形参和实参 package oop.demo01; public class Dem ...

  5. Jmeter系列(36)- Access Log Sampler

    简介 Access Log Sampler 是个非常有用的工具,可以收集和分析真实用户操作的数据,并可用于流量分析.常见的就是我们的nginx的access.log 日志 使用 access.log ...

  6. Linux系列(22) - 用户登录查看命令

    需求 查看当前在线用户情况:历史用户登录情况 W 格式 [root@localhost ~]# w:查看所有登录用户信息 [root@localhost ~]# w [用户名]:查看指定登录用户信息 ...

  7. js原型和原型链理解 constructor 构造函数

    一.对象:普通对象   函数对象 二.构造函数特点:1.需要new实例化,内部使用this对象指向即将要生成的实例对象  2.首字母大写,用于区分普通函数 function Person(name){ ...

  8. YbtOJ#893-带权的图【高斯消元,结论】

    正题 题目链接:https://www.ybtoj.com.cn/problem/893 题目大意 给出一张\(n\)个点\(m\)条边的无向联通图,每条边正反向各有\(A,B,C\)三种边权. 保证 ...

  9. YbtOJ#853-平面标记【整体二分,凸壳】

    正题 题目链接:http://www.ybtoj.com.cn/contest/119/problem/3 题目大意 给出\(n\)个点\((x_i,y_i)\),\(m\)次给出\((k_i,a_i ...

  10. truncate表时报“唯一/主键被启用的外部关键字引用”解决办法

    前言:清空表时提示"唯一/主键被启用的外部关键字引用"这一警告信息 原因:是因为主键被子表引用,所以对主键进行更改就好了 解决: 使用 alter table table_name ...