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()的更多相关文章

  1. return exit _exit

    (1)进程终止: C程序的终止分为两种:正常终止和异常终止. 正常终止分为: return, exit, _exit, _Exit, pthreade_exit. 异常中指分为: abort, SIG ...

  2. return, exit, _exit的区别

    return是返回的最常用的方式 _exit属于POSIX定义的系统调用 exit是GLIBC封装之后的函数 1 _exit和exit都会导致整个进程退出,清理进程所占用的资源,但是glibc封装ex ...

  3. fork-vfork -exit&_exit

    昨天帮人查bug,发现了一个vfork fork exit  _exit不分导致的问题. 使用vfork 后调用exit导致的问题. 主要需要弄清楚他们之间的区别: 1.  fork  ():子进程拷 ...

  4. linux fork函数与vfork函数,exit,_exit区别

    man vfork: NAME vfork - create a child process and block parent SYNOPSIS #include <sys/types.h> ...

  5. exit() _exit() 函数区别

    exit(): --stdlib.h (1) 所有使用atexit()注册的函数,将会被以注册相反的顺序调用: (2) 所有打开的输出流被刷新,并且关闭流: (3) 使用tmpfile()创建的文件将 ...

  6. linux之Deamon进程创建及其进程exit,_exit,return之间的区别

    Dameon进程又被称做守护进程,一般来说他有以下2个特点: 1.生命周期非常长,一旦启动,一般不会终止,直到系统推出,不过dameon进程可以通过stop或者发送信号将其杀死 2.在后台执行,不跟任 ...

  7. abort exit _exit return的区别

    exit()函数导致子进程的正常退出,并且参数status&这个值将被返回给父进程.exit()应该是库函数.exit()函数其实是对_exit()函数的一种封装(库函数就是对系统调用的一种封 ...

  8. Linux中exit与_exit的区别

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

  9. exit()和_exit()

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

随机推荐

  1. 谷歌上不去,长期的解决方案。在稳定高速Google和Gmail

    对稳定Google神器 国内Google很不稳定,缓慢并经常上不去,由"我想去Google",安全和稳定的使用Google.Gmail.Google+所以通常需要特殊的手段岗位胜任 ...

  2. Kotlin

    关于Kotlin,网上已有一些介绍的文章,包括Antonio Leiva的这组blog翻译稿.不过,我还是想跟进它们.翻译它们,以锻炼自己的英文翻译.各位高手发现问题,请及时“拍砖”. 原文题目:Ko ...

  3. 自己主动机串标:Directed Acyclic Word Graph

    trie -- suffix tree -- suffix automa 有这么几个情况: 用户输入即时响应AJAX搜索框, 显示候选名单. 搜索引擎keyword统计数量. 后缀树(Suffix T ...

  4. Tomcat通过配置一个虚拟路径管理web工程

    关于虚拟路径.学问javaweb训练课程,如今,鉴于这种情况下老师. 当我们的项目,当在不同的文件夹项目.我们如何使用tomcat去管理web工程. 教师提出的解决方案是 使用虚拟路径方式,并按照实施 ...

  5. 存储数据键和项目对的类(Dictionary对象)

    存储数据键和项目对的类(Dictionary对象) <% Class Dictionary Public Copyright, Developer, Name, Version, Web Pri ...

  6. 详谈socket请求Web服务器过程(转)

    最开始我们需要明白一件事情,因为这是这篇文章的前提: HTTP协议只是一个应用层协议,它底层是通过TCP进行传输数据的.因此,浏览器访问Web服务器的过程必须先有“连接建立”的发生. 而有人或许会问: ...

  7. HDU 5012 Dice (BFS)

    事实上是非常水的一道bfs,用字符串表示每一个状态,map判重就ok了. 题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=5012 #include&l ...

  8. JQuery EasyUI学习框架

    前言 前端技术,新项目的开发拟使用EasyUI框架(基于EasyUI丰富UI组件库),项目负责人的提示EasyUI分配给我这个任务.发展前,我需要这对于一个新手EasyUI框架学习一些基本的入门.记录 ...

  9. C# 抽象类其中创建一个静态方法

    </pre><pre name="code" class="csharp"><span style="font-size ...

  10. oracle_控制用户权限

     oracle_控制用户权限 ①对 限制     数据库安全:     系统安全     数据安全性     系统权限: 对于数据库的权限     对象权限: 操作数据库对象的权限 1.系统权限 ...