exit与_exit的区别
来源:互联网 发布:电子厂erp软件 编辑:程序博客网 时间:2024/05/16 18:29
#include<unistd.h>main(){printf("output begin\n");printf("content in buffer");_exit(0);}输出:output begin//////////////////////////////////////////////////#include<stdlib.h>main(){printf("output begin\n");printf("content in buffer");exit(0);}输出:output begincontent in buffer
exit 和_exit 函数用于正常终止一个程序:_exit 立即进入内核,exit 则先执行一些清除处理(包括调用执行各终止处理程序,关闭所有标准I / O 流等),然后进入内核。
看出区别来了吗
_exit()立即进入,printf输出的内部可能还在缓冲区里,未作清理,就进入内核,执行进程退出,这样你后面一个输出就可能未能输出到屏幕
补充:第一行被正常输出是因为有'\n','\n'会刷新缓冲区;
exit与_exit的区别
在讨论exit与_exit之前,先来讨论文件内存缓存区的问题。
在linux中,标准输入输出(I/O)函数都是作为文件来处理。对应于打开的每个文件,在内存中都有对应的缓存,每次读取文件时,会多读一些记录到缓存中,这样在下次读文件时,就在缓存中读取;同样,在写文件时也是写在文件对应的缓存中,并不是直接写入硬盘的文件中,等满足了一定条件(如达到一定数量,遇到换行符/n或文件结束标志EOF)才将数据真正的写入文件。
这样做的好处就是加快了文件读写的速度!但这样也带来了一些问题:比如有一些数据,我们认为已经写入了文件,但实际上没有满足一定条件而任然驻留在内存的缓存中,这样,如果我们直接用_exit()函数直接终止进程,将导致数据丢失!!
也许细心地读者已经发现前面使用的是_exit而不是exit,如果改成exit,就不会有数据丢失的问题出现了,这就是我要说的它们之间的区别了!
要解释这个问题,就要涉及它们的工作步骤了。 exit():在执行该函数时,进程会检查文件打开情况,清理I/O缓存,如果缓存中有数据,就会将它们写入相应的文件,这样就防止了文件数据的丢失!然后终止进程。
_exit():在执行该函数时,并不清理标准输入输出缓存,而是直接清除内存空间,当然也就把文件缓存中尚未写入文件的数据给销毁了。由此可见,使用exit()函数更加安全。
此外,对于它们两者的区别还有各自的头文件不同:exit()--stdlib.h _exit()--unistd.h
最后提一下,一般情况下exit(0)表示正常退出,exit(1),exit(-1)为异常退出,0、1、-1是返回值,具体含义可以自定。
- 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()的区别
- exit,_exit,_Exit的区别
- exit与_exit区别
- exit与_exit区别
- 合唱队形-最长递增子序列变种
- chrome利用NPAPI开发扩展
- (beginner problems) ural 1209 1, 10, 100, 1000...
- 共用体应用实例(2)
- Oracle 起步日记(18)——表空间调整
- exit与_exit的区别
- 忙于事业疏于情感老婆网上找情人
- 拦截器的使用
- 了解Objective-C中Selector基本概念和操作
- (第一天)S3C6410点亮一个LED
- 虚拟机 VMware 关于安装 VMware Tools和文件共享的补充
- HDU 4153 Grey Area
- Pull解析Xml方式
- 用cvCreateFileCapture读取视频返回NULL的几种问题原因