linux的exit和_exit
进程退出
退出一个进程有多种方式:
正常退出:
在main函数里return
在进程里面调用exit、_exit
在进程的最后一个子线程调用pthread_exit
异常退出:
- 被信号(9、15)终止
下面讲一下exit和_exit这两个函数的特点和区别
exit、_exit
这两个函数都可以用来退出进程,释放当前进程的系统资源,并返回进程退出时的状态。
函数原型如下:
#include <unistd.h>
void _exit(int status);
#include <stdlib.h>
void exit(int status);
返回值:它们都不会返回
形参:它们都可以指定退出时的状态,放到status里
差异
exit和_exit的差异可以概括成下面这张图:
在讲述差异之前需要先引入一个函数:atexit。
atexit是一个注册退出处理函数,他有什么用呢?
我们在退出一个进程之前,需要做一些善后工作,比如关闭信号量、取消共享内存的映射、关闭已打开的管道文件等等;atexit就可以帮我们做(处理)这个事情。
从上图可以看出,exit函数在调用exit系统调用退出进程之前会调用退出处理函数,但_exit函数并不会调用,直接退出;这就是第一个差异。
这里需要注意使用atexit注册退出处理函数是按照栈的结构注册的,先进后出。(下面示例会展示效果)
第二个差异就是exit会清理IO缓存,如果缓冲区有数据,他会把数据刷新回设备;而_exit函数不会这么做,缓存数据会直接丢失。
代码示例
下面举例说明exit和_exit的作用。
exit示例如下:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>void fun1(void)
{printf("[%s] is calling...\n", __FUNCTION__);
}void fun2(void)
{printf("[%s] is calling...\n", __FUNCTION__);
}int main(void)
{atexit(fun1);atexit(fun2);printf("hello, kugou");exit(0);
}
运行结果如下:
zzc@zzc-virtual-machine:~/share/example$ ./exit
hello, kugou[fun2] is calling...
[fun1] is calling...
上述结果分析:
- 这个程序注册了两个退出处理函数fun1、fun2,由于先进后出,所以退出进程时先调用fun2,再调fun1
- 上面的printf函数用来打印一个字符串,并且是全缓冲;你会发现退出进程时,IO缓冲区的数据会被刷新到标准输出设备(显示器)
_exit示例如下:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>void fun1(void)
{printf("[%s] is calling...\n", __FUNCTION__);
}void fun2(void)
{printf("[%s] is calling...\n", __FUNCTION__);
}int main(void)
{atexit(fun1);atexit(fun2);printf("hello, kugou");_exit(0);
}
运行结果如下:
zzc@zzc-virtual-machine:~/share/example$ ./exit
zzc@zzc-virtual-machine:~/share/example$
结果分析:
退出进程时并没有调用退出处理函数,也不会清理IO缓冲区的数据。
总结
本文简单介绍了exit和_exit的特点和差异,并举例展示了他们的效果。
好记性不如烂笔头。
linux的exit和_exit相关推荐
- linux中exit()和 _exit()说明
exit和_exit函数都是用来终止进程的.当程序执行到exit或_exit时,系统无条件的停止剩下所有操作,清除包括PCB在内的各种数据结构,并终止本进程的运行.但是,这两个函数是有区别的. ...
- Linux中exit与_exit的区别
在exit,_exit的区别 - exit()与_exit()函数的区别(Linux系统中)2012-03-20 15:19:53 分类: LINUX 注:exit()就是退出,传入的参数是程序退出时 ...
- Linux下Exit和_exit函数说明
exit和_exit函数都是用来终止进程的.当程序执行到exit或_exit时,系统无条件的停止剩下所有操作,清除包括PCB(进程控制块)在内的各种数据结构,并终止本进程的运行.但是,这两个函数是有区 ...
- linux下exit()与_exit()的区别
void exit(int staus) 函数, 在头文件 #include <stdlib.h> void _exit(int status) 函数,在头文件 #include < ...
- Linux环境编程--linux中的perror、exit、_exit、wait 和 waitpid
perror: #include<stdio.h> #include<stdlib.h> 定义函数 void perror(const char *s); pe ...
- linux中进程退出函数:exit()和_exit()的区别
linux中进程退出函数:exit()和_exit()的区别 (1)_exit()执行后立即返回给内核,而exit()要先执行一些清除操作,然后将控制权交给内核. (2)调用_exit函数时,其会关闭 ...
- exit()与_exit()函数的区别(Linux系统中)
注:exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出,一般都用-1或者1,标准C里有EXIT_SUCCESS和EXIT_FAILURE两个宏,用exit(EXI ...
- linux系统调用:exit()与_exit()函数详解【转】
(转自:https://blog.csdn.net/drdairen/article/details/51896141) exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示 ...
- linux系统调用:exit()与_exit()函数详解
exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出,一般都用-1或者1,标准C里有EXIT_SUCCESS和EXIT_FAILURE两个宏,用exit(EXIT_ ...
最新文章
- 特斯拉再裁员3000多人,马斯克称别无选择
- django 入门,快速搭建一个后端接口
- datatable修改csv的最后一列
- python实验八分支语句_python语句(分支,循环)
- javascript学习笔记之document对象、表单及表单元素、脚本化cookie
- Size Balanced Tree(节点大小平衡树)
- 《软件方法》读书笔记2
- 中国2017 Google 开发者大会第二天简单回顾
- covar of lognormal variables
- Android使用蓝牙录音和播放
- 软件系统质量属性可用性-稳定性-可靠性-连续性辨析-架构权衡分析方法
- 一个exe可执行程序的生与死
- 读书笔记-反省使人成长
- 1.3亿元战略投资落地,有赞的盈利拐点到了吗?
- [转载] 晓说——第17期:揭秘战争秘闻 朝鲜战争62年祭(下)
- 2020微信对话截图生成器,各种截图一键制作!
- 如何注册腾讯云个人账号(图文教程)
- 怎么样减肥又快又好 达人推荐最有效的减肥方法
- WebView-WebView简介
- ABB智能定位器TZID-C说明书(中文版)
热门文章
- 数据结构单链表的基础操作(C语言)
- 快速入门Matlab——求取一元函数最小值和零点
- matlab敏感性分析代码,sobol敏感性分析 matlab代码
- 胡歌12年后首谈车祸:既然活下来了,就不能白白活着
- 计算机在我们的生活中应用,计算机在我们生活中的应用
- 在win7安装theano
- JavaWeb - SSO单点登录原理之基于CAS(一)
- 混合硬盘计算机,解决方法:混合硬盘分区技巧[图形教程]
- android手机系统怎么刷机包,安卓手机系统怎么重装刷机
- list申请java,java把一个list中的内容添加到另一个list中 FPGA编程问题:有多个.v文件与module,把他们加到......