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;

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

4. 常见退出方法

正常终止
  • 从 main 函数 return;

  • 调用 exit();

  • 调用 _exit() / _Exit()。

异常终止
  • ctrl + c(SIGINT);

  • kill -9(SIGKILL)等信号。

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. 总结

  • 希望完整清理和刷新数据时使用 exit 或 return;

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

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

相关推荐
水饺编程4 分钟前
第2章:Linux 基础,rm 命令
linux·c语言·汇编
范同学~8 分钟前
固定表头+第一列+最后一列
java·服务器·前端
雪落漂泊12 分钟前
Linux基础开发工具(三)gcc/g++与make/makefile篇
linux·运维·服务器
Sayai13 分钟前
Neo4j 社区版高可用实战:DRBD 块级复制 + Keepalived 虚拟 IP 冷备切换(附启停 SOP 与脑裂防范)
运维·neo4j·keepalived·高可用·drbd
爱吃辣椒的小豆豆21 分钟前
Linux-sshd-实战-白名单与跳板机
linux·运维·服务器
气质、小青年!26 分钟前
进程1学习
linux·学习
强哥聊算力41 分钟前
《算力江湖·国产GPU突围:摩尔线程故事》第四集:从图形到AI:摩尔线程为什么必须冲进大模型赛道?
运维·服务器·人工智能·ai·gpu算力
blueSatchel1 小时前
framebuffer注册源码解读
linux·嵌入式
2401_862880821 小时前
嵌入式Linux系统移植与驱动开发完整指南
linux·c语言·驱动开发
坤坤子吖1 小时前
Linux 线程同步与互斥——互斥锁
linux·服务器·c++·笔记·学习