exit() _exit()
图 C程序的启动与终止
差别:
_exit()函数:直接使进程停止执行,清除其使用的内存空间,并销毁其在内核中的各种数据结构;
exit()函 数则在这些基础上作了一些包装,在运行退出之前加了若干道工序。
exit()函数与_exit()函数最大的差别就在于 exit()函数在调用 exit 系统调用之前要检查文件的打开情况,把文件缓冲区中的内容写回文件。
#include<unistd.h>
main()
{
printf("output begin\n");
printf("content in buffer");
//这里不能加\n,一旦加了换行,则printf会马上输出,行缓存模式
_exit(0);
}
//输出:output begin
在Linux的标准函数库中,有一套称作“高级I/O”的函数,我们熟知printf() fopen() fread() fwrite()都在此列,它们也被称作“缓冲I/O(buffered I/O)”,其特征是相应每个打开的文件,在内存中都有一片缓冲区,每次读文件时,会多读出若干条记录,这样下次读文件时就能够直接从内存的缓冲区中读取,每次写文件的时候,也不过写入内存中的缓冲区,等满足了一定的条件(达到一定数量,或遇到特定字符,如换行符\n和文件结束 EOF),再将缓冲区中的内容一次性写入文件,这样就大大添加了文件读写的速度,但也为我们编程带来了一点点麻烦。假设有一些数据,我们觉得已经写入了文件,实际上由于没有满足特定的条件,它们还不过保存在缓冲区内,这时我们用_exit()函数直接将进程关闭,缓冲区中的数据就会丢失,反之,假设想保证数据的完整性,就一定要使用exit()函数。
exit()在结束调用它的进程之前,要进行例如以下步骤:
1.cleanup();
2.在atexit()注冊的函数;
最后调用_exit()函数。。。
_exit()不运行I/O缓存的刷新动作
_exit终止调用进程,但不关闭文件(应该也关闭文件的),不清除输出缓存,也不调用出口函数。
exit函数将终止调用进程。在退出程序之前,全部文件关闭,缓冲输出内容
将刷新定义,并调用全部已刷新的“出口函数”(由atexit定义)。
_exit也会关闭文件的。
_exit做3件事(man):
1,Any open file descriptors belonging to the process are closed
2,any children of the process are inherited by process 1, init
3,the process's parent is sent a SIGCHLD signal
exit运行完清理工作后就调用_exit来终止进程。
exit() _exit()的更多相关文章
- return exit _exit
(1)进程终止: C程序的终止分为两种:正常终止和异常终止. 正常终止分为: return, exit, _exit, _Exit, pthreade_exit. 异常中指分为: abort, SIG ...
- return, exit, _exit的区别
return是返回的最常用的方式 _exit属于POSIX定义的系统调用 exit是GLIBC封装之后的函数 1 _exit和exit都会导致整个进程退出,清理进程所占用的资源,但是glibc封装ex ...
- fork-vfork -exit&_exit
昨天帮人查bug,发现了一个vfork fork exit _exit不分导致的问题. 使用vfork 后调用exit导致的问题. 主要需要弄清楚他们之间的区别: 1. fork ():子进程拷 ...
- linux fork函数与vfork函数,exit,_exit区别
man vfork: NAME vfork - create a child process and block parent SYNOPSIS #include <sys/types.h> ...
- exit() _exit() 函数区别
exit(): --stdlib.h (1) 所有使用atexit()注册的函数,将会被以注册相反的顺序调用: (2) 所有打开的输出流被刷新,并且关闭流: (3) 使用tmpfile()创建的文件将 ...
- linux之Deamon进程创建及其进程exit,_exit,return之间的区别
Dameon进程又被称做守护进程,一般来说他有以下2个特点: 1.生命周期非常长,一旦启动,一般不会终止,直到系统推出,不过dameon进程可以通过stop或者发送信号将其杀死 2.在后台执行,不跟任 ...
- abort exit _exit return的区别
exit()函数导致子进程的正常退出,并且参数status&这个值将被返回给父进程.exit()应该是库函数.exit()函数其实是对_exit()函数的一种封装(库函数就是对系统调用的一种封 ...
- Linux中exit与_exit的区别
在exit,_exit的区别 - exit()与_exit()函数的区别(Linux系统中)2012-03-20 15:19:53 分类: LINUX 注:exit()就是退出,传入的参数是程序退出时 ...
- exit()和_exit()
进程就好比人一样有其生命,我们通过fork()函数来创建一个进程,那么我们又是如何来中止进程呢. 进程退出 1.在Linux中任何让一个进程退出 进程退出表示进程即将结束.在Linux中进程退出分为了 ...
随机推荐
- Palindromes _easy version
Time Limit: 1Sec MemoryLimit: 64 MB Submit:165 Solved: 76 [Submit][Status][WebBoard] Description & ...
- js比量undefined种类
js比量undefined种类 if (reValue== undefined) { alert("undefined"); } 发现推断不出来.最后查了下资料要用type ...
- vmWare虚拟机下ubuntu配置代理上网
最终用上了linux,windows下用vmWare安装虚拟机,挂ubuntu 14.04,,认为非常不习惯,非常难侍候. 而且遇到的客观困难还不少,这两天着实费了不少功夫.主要是上班这里上网要配置代 ...
- Chrome 扩展 最近的历史 HistoryBar v1.1
说明 以前用过一段时间傲游浏览器,渐渐的习惯了它的鼠标手势和一些细微的人性化的功能.比方地址栏左边的"近期訪问的页面"button.能够方便的找到近期 20 条历史记录. wate ...
- webpack打包avalon
webpack打包avalon+oniui+jquery 随着avalon的发展壮大,我根据CSDN的统计数字,中国前端大概有1%的人在使用avalon了. avalon的最大优势是能兼容IE6,并且 ...
- 第十三章——表和索引分区(1)——使用Range Left进行表分区
原文:第十三章--表和索引分区(1)--使用Range Left进行表分区 前言: 如果数据表的数据持续增长,并且表中的数据量已经达到数十亿甚至更多,数据的查询和操作将非常困难,面对非常庞大的表,几时 ...
- ObjectStreamDemo
当你需要存储相同类型的数据时,使用固定长度的记录格式是一个不错的选择.但,在OOP中创建的对象很少全部都具有相同的类型. 例如,你可能有一个称为staff(见下面demo)的array,它名义上是一个 ...
- maple 教程
1 初识计算机代数系统Maple 1.1 Maple简说 1980年9月, 加拿大Waterloo大学的符号计算机研究小组成立, 開始了符号计算在计算机上实现的研究项目, 数学软件Maple是这个项目 ...
- 何时使用SET和SELECT为变量赋值
原文:何时使用SET和SELECT为变量赋值 我们经常使用SET和SELECT来为变量复制,但是有时候,只能选其一来使用,下面来看看这些例子,本例中使用AdventureWorks数据库来做演示. 通 ...
- 深入浅出java并发
http://www.blogjava.net/xylz/archive/2010/07/08/325587.html