Linux进程终止——退出码、exit与_exit

目录

[1. 引言](#1. 引言)

[2. 进程终止的本质](#2. 进程终止的本质)

[3. 进程退出场景](#3. 进程退出场景)

[4. 常见退出方法](#4. 常见退出方法)

正常终止

异常终止

[5. 退出码(Exit Code)](#5. 退出码(Exit Code))

[6. exit 函数](#6. exit 函数)

[7. _exit 函数](#7. _exit 函数)

示例对比

[8. return 退出](#8. return 退出)

[9. 补充:atexit 函数(扩展)](#9. 补充:atexit 函数(扩展))

[10. 总结](#10. 总结)


1. 引言

进程终止是进程生命周期的最后阶段。Linux提供了多种退出方式,每种方式在资源释放、数据刷新、退出码传递上有所不同。本文将详细分析进程终止的本质、退出码含义以及 exit_exit 的区别。

2. 进程终止的本质

释放进程申请的内核数据结构(task_struct、mm_struct等)和用户空间的代码与数据。

3. 进程退出场景

  • 代码运行完毕,结果正确:退出码为0;

  • 代码运行完毕,结果错误:退出码为非0;

  • 代码异常终止 :收到信号(如 SIGSEGVSIGKILL)。

4. 常见退出方法

正常终止
  • main 函数 return

  • 调用 exit()

  • 调用 _exit() / _Exit()

异常终止
  • ctrl + cSIGINT);

  • kill -9SIGKILL)等信号。

5. 退出码(Exit Code)

退出码是进程返回给父进程的一个整数值,低8位有效。在Shell中可以通过 echo $? 查看上一个命令的退出码。

退出码 含义
0 成功
1 通用错误
2 命令使用不当
126 权限不足或无法执行
127 命令未找到
128+n 被信号n终止
130 被 SIGINT 终止(Ctrl+C)
143 被 SIGTERM 终止

可以使用 strerror()perror() 获取退出码对应的描述信息。

6. exit 函数

c

复制代码
#include <stdlib.h>
void exit(int status);

exit 在调用 _exit 之前会执行以下清理工作:

  1. 执行通过 atexit()on_exit() 注册的清理函数;

  2. 刷新所有标准IO流缓冲区,关闭所有打开的流;

  3. 调用 _exit(status)

7. _exit 函数

c

复制代码
#include <unistd.h>
void _exit(int status);

_exit 会立即进入内核,不做任何用户态清理(不刷新缓冲区、不执行 atexit 函数)。

示例对比

c

复制代码
// 使用 exit
printf("hello");  // 没有换行,仍在缓冲区
exit(0);          // 刷新缓冲区,输出 "hello"

// 使用 _exit
printf("hello");
_exit(0);         // 不刷新缓冲区,无输出

8. return 退出

main 中执行 return n 等价于调用 exit(n),因为 main 的返回值会被运行时函数作为 exit 的参数。

9. 补充:atexit 函数(扩展)

c

复制代码
#include <stdlib.h>
int atexit(void (*function)(void));

可以注册多个函数,在 exit 调用时按注册相反顺序执行。常用于资源释放、日志记录等。

10. 总结

  • 希望完整清理和刷新数据时使用 exitreturn

  • 需要立即终止、不执行任何清理时使用 _exit

  • 退出码是父子进程通信的重要方式,应规范使用。

相关推荐
ziyun66688816 小时前
Docker 容器化 Web 服务架构搭建与自动化运维项目
运维·docker·架构
wavemap16 小时前
HyperPHP 免费主机无限流量
服务器·php
Forever Nore17 小时前
LeetCode 13 罗马数字转整数 - 按规则处理
linux·服务器·leetcode
我不会插花弄玉17 小时前
2.Linux基础指令下【由浅入深-Linux】
linux·服务器
梦想的旅途217 小时前
企微 API 二次开发:利用 AI Agent 实现自动化运维
运维·人工智能·企业微信
安科瑞-小李17 小时前
铁路智能运维进化路线:自动化→状态可视→预测维护
运维·自动化·数据采集·能耗可视化
雯宝18 小时前
3. 驱动框架(块设备)
linux
酷可达拉斯18 小时前
自动化运维-Ansible任务控制与流程控制
运维·自动化·ansible
HiDev_18 小时前
【非标自动化】2、认识元器件(电机保护器)
运维·自动化
立少→万能汉编18 小时前
用“立少→超文本”写静态网页,标签<倍>
服务器·前端·javascript