linux下exit()与_exit()的区别
来源:互联网 发布:中国好声音网络直播 编辑:程序博客网 时间:2024/05/01 06:46
void exit(int staus) 函数, 在头文件 #include <stdlib.h>
void _exit(int status) 函数,在头文件 #include <unistd.h>中
在Linux & C中描述两者区别是:_exit返回后直接返回内核,而exit要进行清除工作,那么两者到底有什么不同呢。编写个小程序就很容易看出来:
int main(void){ printf("hello linux c!"); printf("i love u~"); //exit(0); _exit(0); return 0;}
对于这个程序对exit()和_exit两次调用结果是不想同的:
exit():
hello linux c!i love u~
_exit()则什么也没有输出,如果给第一个printf加上'\n'的话,那就只会输出第一句话。
那么我们简单谈一谈exit比_exit多做了些什么,其实exit结束进程也是调用了_exit函数,但是它在之前做了两点:
1.调用atexit()注册的函数(出口函数);按ATEXIT注册时相反的顺序调用所有由它注册的函数,这使得我们可以指定在程序终止时执行自己的清理动作.例如,保存程序状态信息于某个文件,解开对共享数据库上的锁等.
2.cleanup();关闭所有打开的流,这将导致写所有被缓冲的输出,删除用TMPFILE函数建立的所有临时文件。
这个的意思就是第一步将程序的信息保存,解开设的锁,第二步清空缓存,这个清空缓存就是写入文件。我们知道对于printf,为了输出的效率提高,计算机会将输入的信息存入缓存。最后写入标准输出文件输出。所以这就能解释为什么_exit什么都没有输出,因为它没有将缓存写入文件就已经退出。至于为什么加入'\n'后可以输出一句话这同样与缓存写入文件有关,printf函数在遇到“\n”换行符时自动的从缓冲区中将记录读出。
从这一点我们也可以看出一些问题,那就是如果fork一个子进程在退出该子进程的时候调用的是exit函数的话,那么它会刷新缓存,虽然是子进程执行的但是因为子进程与父进程共享地址,所以会出现的问题是标准输出文件被关掉,printf什么也没输出。但是这个问题对于linux是不会出现的,因为其exit时只是减少了一个对输出的文件的引用计数,并没有影响父进程。
综上所述,exit函数将终止调用进程。在退出程序之前,所有文件关闭,缓冲输出内容将刷新定义,_exit终止调用进程,但不关闭文件,不清除输出缓存。
- linux下exit与_exit的区别
- linux下exit()与_exit()的区别
- linux下exit()和_exit()的区别
- [linux]exit()与_exit()区别
- exit与_exit的区别
- exit()与_exit()的区别
- exit()与_exit()的区别
- _exit 与 exit 的区别
- exit 与 _exit的区别
- exit()与_exit()的区别
- exit() 与 _exit() 的区别
- exit()与_exit()的区别
- exit()与_exit()的区别
- exit()与_exit()的区别
- exit 与 _exit的区别
- exit()与_exit()的区别
- exit()与_exit()的区别
- exit与_exit的区别
- Leetcode 9 Palindrome Number
- C# 发送邮件
- 一个nginx_reuseport 简单补丁实现
- 学艺不精而羞愧--论C++模板类的使用
- HTML--Note3--link
- linux下exit()与_exit()的区别
- 黑马程序员-ios学习笔记 c语言 结构体
- Permutations
- ThinkPHP 3.2 行为扩展以及插件机制介绍
- Java ServiceLoader(SPI)学习
- 使用UltraISO制作启动盘装Windows系统详细教程
- POJ 2002 Squares(二分)
- ZOJ 3626 Treasure Hunt I(树形dp)
- 22_Android中的本地音乐播放器和网络音乐播放器的编写,本地视频播放器和网络视频播放器,照相机案例,偷拍案例实现