当前位置: 首页 > article >正文

【Linux】 exit 和 _exit 的区别




在这里插入图片描述



在Linux系统中,exit(int status)_exit(int status) 都是用来终止进程的函数,都能通过参数 int status传递一个整型的退出状态码给父进程,但它们之间有一些重要的区别。



1. 头文件不同


exit() 函数定义在 <unistd.h>

_exit() 函数是一个直接的系统调用,定义在 <sys/exit.h> 中(实际使用时一般不需要显式包含这个头文件)



2. 功能差异


exit()


  • 资源清理exit() 会执行一些必要的资源清理工作,包括但不限于:
    • 调用已注册的终止处理函数(atexit() 注册的函数)。
    • 关闭所有已打开的流(如标准输入、输出和错误流)。
    • 刷新当前缓冲区:会冲洗标准输入/输出/错误流的缓冲区,确保所有未写入的数据都被写入相应的设备(如显示器或磁盘)
    • 调用 _exit() 终止进程。
  • 信号处理exit() 允许在进程终止前进行一些额外的信号处理。


_exit()


​ 和 exit函数 截然相反,该函数不会进行 这些清理工作,这个就是纯粹的进程退出



区别浓缩于一张图上

在这里插入图片描述



关于 exit函数 刷新缓冲区

知识储备:


exit 函数像 \n 一样,会进行缓冲区刷新

_exit 函数 不会进行缓冲区刷新

注:使用 printf 打印语句时,若没有 \n 强制刷新,则该语句会在缓冲区存放着,直至遇到一次缓冲区刷新程序才会打印出来(如程序结束会强制刷新一次缓冲区)


例子验证:


通过下面代码可以验证:这里解释现象过程

1、若 printf\n :会先打印 hello world,再 sleep 两秒(因为 \n 主动刷新缓冲区)

2、若 printf 没有 \n :会先 sleep 两秒,再打印 hello world(因为 exit 函数主动刷新缓冲区)


在这里插入图片描述



3. 使用场景

exit()

  • 推荐使用场景:在大多数情况下,应该使用 exit() 来终止进程,因为它会执行必要的资源清理操作,确保程序能够优雅地终止
  • 示例:在程序正常完成或者遇到错误需要提前终止时,使用 exit() 来终止进程。

_exit()

  • 特定使用场景:当不需要执行任何清理操作,并且希望立即终止进程时,可以使用 _exit()
  • 示例:在某些低级的系统程序或者内核模块中,可能需要立即终止进程而不进行任何清理工作
  • 适用于性能敏感的场景,需要快速终止进程而不关心资源的清理。
  • 适用于已经有自己的资源管理机制,不需要默认的清理操作的情况。

http://www.kler.cn/news/355984.html

相关文章:

  • 【RV1126】板子adb 调试流程
  • 【十】Hyperf最简单的使用rabbitMQ
  • 响应式轮播图 高级轮播
  • Python实现火柴人的设计与实现
  • select与poll模型
  • 2.登录业务
  • 安科瑞/ACREL能源管理软件能耗管理软件
  • 解决低版本pytorch和onnx组合时torch.atan2()不被onnx支持的问题
  • 适配器模式演示(C++)三分钟读懂
  • 前端工程启动工具
  • ozon测评安全攻略:自养号技巧
  • iptables规则
  • Git的原理和使用(二)
  • Python 代码使用 OpenCV 库实现了从摄像头获取视频流,并在视频中检测特定颜色区域的边缘线条
  • kaggle中如何更新上传自定义的数据集dataset?
  • 短视频矩阵源码搭建解析,支持OEM~
  • 编程实战:利用API接口轻松获取数据
  • 尚硅谷rabbitmq2024 第15-18节 springboot整合与可靠性答疑
  • 影响安装光伏电站的因素
  • 必看干货|等保测评(网络安全等级保护)五问五答