自学内容网 自学内容网

【Linux】 exit 和 _exit 的区别




在这里插入图片描述



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



1. 头文件不同


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

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



2. 功能差异


exit()


  • 资源清理exit() 会执行一些必要的资源清理工作,包括但不限于:
    • 调用已注册的终止处理函数(atexit() 注册的函数):通过 atexit 函数注册一些清理函数将在 exit 被调用时被执行
    • 关闭所有已打开的流:包括标准输入 (stdin)、标准输出 (stdout) 和标准错误 (stderr)。
    • 刷新当前缓冲区:会冲洗标准输入/输出/错误流的缓冲区,确保所有未写入的数据都被写入相应的设备(如显示器或磁盘)
    • 调用 _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()
  • 示例:在某些低级的系统程序或者内核模块中,可能需要立即终止进程而不进行任何清理工作
  • 适用于性能敏感的场景,需要快速终止进程而不关心资源的清理。
  • 适用于已经有自己的资源管理机制,不需要默认的清理操作的情况。

原文地址:https://blog.csdn.net/2301_79499548/article/details/143071119

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!