exit和_exit函数都是用来终止进程的。当程序执行到exit或_exit时,系统无条件的停止剩下所有操作,清除包括PCB(进程控制块)在内的各种数据结构,并终止本进程的运行。但是,这两个函数是有区别的。

exit()函数的作用是:直接使用进程停止运行,清除其使用的内存空间,并清除其在内核中的各种数据结构;_exit()函数则在这一基础上做了一些包装。在执行退出之前加了若干道工序。exit()函数与_exit()函数最大区别就在于exit()函数在调用exit系统之前要检查文件的打开情况,把文件缓冲区的内容写回文件。

由于Linux的标准函数库中,有一种被称作“缓冲I/O”的操作,其特征就是对应每一个打开的文件,在内存中都有一片缓冲区。每次读文件时,会连续的读出若干条记录,这样在下次读文件时就可以直接从内存的缓冲区读取;同样,每次写文件的时候也仅仅是写入内存的缓冲区,等满足了一定的条件(如达到了一定数量或遇到特定字符等),再将缓冲区中的内容一次性写入文件。

这种技术大大增加了文件读写的速度,但也给编程代来了一点儿麻烦。比如有一些数据,认为已经写入了文件,实际上因为没有满足特定的条件,它们还只是保存在缓冲区内,这时用_exit()函数直接将进程关闭,缓冲区的数据就会丢失。因此,要想保证数据的完整性,就一定要使用exit()函数。

Exit的函数声明在stdlib.h头文件中。

_exit的函数声明在unistd.h头文件当中。

下面的实例比较了这两个函数的区别。printf函数就是使用缓冲I/O的方式,该函数在遇到“\n”换行符时自动的从缓冲区中将记录读出。实例就是利用这个性质进行比较的。

exit.c源码

#include <stdlib.h>
#include <stdio.h>

int main(void)
{
    printf("Using exit...\n");
    printf("This is the content in buffer");
    exit(0);
}

输出信息:

Using exit...

This is the content in buffer

#include <unistd.h>
#include <stdio.h>

int main(void)
{
    printf("Using exit...\n");
    printf("This is the content in buffer");
    _exit(0);
}

则只输出:

Using exit...

说明:在一个进程调用了exit之后,该进程并不会马上完全消失,而是留下一个称为僵尸进程(Zombie)的数据结构。僵尸进程是一种非常特殊的进程,它几乎已经放弃了所有的内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其它进程收集,除此之外,僵尸进程不再占有任何内存空间。

Linux下Exit和_exit函数说明相关推荐

  1. linux下exit()与_exit()的区别

    void exit(int staus) 函数, 在头文件 #include <stdlib.h> void _exit(int status) 函数,在头文件 #include < ...

  2. Linux中exit与_exit的区别

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

  3. Linux系统常用函数,浅谈linux下的一些常用函数的总结(必看篇)

    1.exit()函数 exit(int n)  其实就是直接退出程序, 因为默认的标准程序入口为int main(int argc, char** argv),返回值是int型的. 一般在shell下 ...

  4. linux中exit()和 _exit()说明

        exit和_exit函数都是用来终止进程的.当程序执行到exit或_exit时,系统无条件的停止剩下所有操作,清除包括PCB在内的各种数据结构,并终止本进程的运行.但是,这两个函数是有区别的. ...

  5. exit()和_exit()函数

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

  6. Linux系统怎么编译sin,linux下gcc编译sin函数出错的问题

    linux下gcc编译sin函数出错的问题 收藏 Q: I keep getting errors due to library functions being undefined, but I'm ...

  7. Linux下的内存对齐函数

    在Linux下内存对齐的函数包括posix_memalign, aligned_alloc, memalign, valloc, pvalloc,其各个函数的声明如下: int posix_memal ...

  8. linux uname内核,Linux下confstr与uname函数_获取C库与内核信息

    Linux下confstr与uname函数_获取C库与内核信息 #include #include  //uname int main(int argc, char **argv[]) { struc ...

  9. exit和_exit函数

    1.exit函数 1 #include <stdlib.h> 2 void exit(int status); 3 功能:退出当前进程 4 参数: 5 status:退出状态,由父进程通过 ...

最新文章

  1. 出远门需要检查的物件
  2. 第十二届蓝桥杯C++赛后感
  3. P4849 寻找宝藏(模板:四维偏序)
  4. diff算法_传统Diff算法为什么时间复杂度要O(n ^3)
  5. 最小生成树(克鲁斯卡尔算法)
  6. Node.js:一个路由2次 request
  7. PLSQL触发器随笔
  8. OpenShift 4 Hands-on Lab (13) 使用持久化存储
  9. 详解: Spark 相对于MapReduce的优势(为什么MapReduce性能不理想)
  10. 黄聪:演示 Rect、Bounds 生成 TRect 的区别
  11. Project Euler problem 61
  12. Eview操作步骤——数据导入及数据建模
  13. Rasa课程、Rasa培训、Rasa面试系列之: Rasa客户案例nib Group 保险公司
  14. html 还原键盘默认事件,js阻止默认事件 (两种方法)及键盘事件onkeydown 、 onkeypress 、onkeyup实例讲解...
  15. 全球网络安全行业全景图与中国网络安全行业全景图-2022
  16. 【python学习笔记】关于python Flask前后端分离跨域问题
  17. 软件设计之“信雅达”
  18. (夏季)你不得不注意的一种比蚊子还可怕的东西!
  19. 使用简单的编程为您的网站构建具有自定义知识的类似 ChatGPT 的聊天机器人
  20. 词法分析器的构成(含源代码)

热门文章

  1. 解决python在pycharm中可以import本地文件,但命令行运行时报错:no model named xxxx本地文件
  2. 搜狗输入法自定义短语(克制名词解释、背诵类问题)
  3. docker安装ping命令
  4. 金蝶记账王登录显示连接金蝶云服务器异常,金蝶KIS记账王系统初始化常见问题...
  5. java appium_Android应用开发之AS+Appium+Java+Win自动化测试之Appium的Java测试脚本封装(Android测试)...
  6. Django登录验证——原生表单验证
  7. poj2793 素数和
  8. c语言 枚举类型 uint32_最全面C语言数据基本数据类型解析
  9. 防火墙高可用性(HA)
  10. CentOS 内核升级的总结