讲师中心 微信公众号
AI工具推荐 视频效率加速

Linux 下一个程序从执行到退出经历了什么?

夜涛君_2923

夜涛君_2923

发布时间:2026-01-26 19:57:10

|

255人浏览过

|

来源于php中文网

原创

程序在Linux下执行到退出本质是内核接管其生命周期的过程:经execve()加载ELF、状态切换(R/S/D/Z)、exit()或_exit()清理、内核最终回收PID与资源。

linux 下一个程序从执行到退出经历了什么?

一个程序在 Linux 下从执行到退出,本质是内核接管用户态进程生命周期的过程。它不是“直接运行代码”,而是经过一系列受控的内核介入步骤——跳过任意一环,程序根本启动不了。

execve() 系统调用才是真正起点

你以为 ./a.out 是程序自己开始跑?其实是 shell 调用了 execve(),把控制权彻底交给内核。这个调用会:

  • 清空当前进程的用户空间内存(栈、堆、代码段、数据段)
  • 按 ELF 文件头和 program header 加载新程序的代码段(.text)、初始化数据段(.data)、未初始化数据段(.bss)
  • 设置新的栈帧,把 argc、argv、envp 压入栈顶
  • 跳转到入口点(通常是 _start,不是 main)

没成功返回 execve() 就意味着程序压根没“出生”——常见错误如 Permission denied(缺少执行权限或 noexec 挂载)、No such file or directory(动态链接器路径不对,哪怕文件存在也会报这个)。

内核如何管理进程状态切换

从 execve() 返回后,进程就进入 R(Running/Runnable)状态,但实际执行还取决于调度器。整个生命周期中,它会在以下状态间切换:

  • R:正在 CPU 上运行,或排在运行队列里等调度
  • S:可中断睡眠(比如等 read() 从磁盘读完)
  • D:不可中断睡眠(通常卡在底层驱动,如坏磁盘 IO,kill -9 也杀不掉)
  • Z:僵尸态——子进程已退出,但父进程还没调用 waitpid() 回收其退出码和资源

注意:ps 看到的 T(stopped)不是退出,而是被信号暂停(如 Ctrl+Z 或 kill -STOP),仍占 PID 和内存资源。

onewo-rtlinux
onewo-rtlinux

Linux 实时编程助手。生成、审查并修改用于周期性控制任务和中断驱动程序的 C 代码。强制实施实时调度策略。

下载

exit() 和 _exit() 的区别决定资源清理方式

程序退出时,C 库封装了 exit(),但它和系统调用 _exit() 行为不同:

  • exit():先刷新所有 stdio 缓冲区(fflush(NULL)),调用 atexit() 注册的函数,最后才调用 _exit()
  • _exit():直接触发 sys_exit 系统调用,不刷缓存、不执行清理函数

在 fork 后的子进程中,如果用 exit() 可能导致父进程 stdio 缓冲区被重复写入(因为 fork 复制了缓冲区内容);这时应无条件用 _exit()。glibc 的 main() 返回其实隐式调用了 exit(),不是 _exit()。

内核回收进程的最后一步:释放 PID 和资源

当进程调用 _exit() 或收到终止信号(如 SIGKILL),内核会:

  • 释放虚拟内存区域(VMA)、页表、打开的文件描述符(close_on_exec 位生效)、信号处理上下文
  • 向父进程发送 SIGCHLD,并把退出状态存进进程描述符(task_struct)
  • 若父进程已退出,init 进程(PID 1)自动成为其父进程,并最终调用 waitid() 回收,避免僵尸累积

真正难排查的是:父进程忘了 wait(),又没设 SIGCHLD handler,或者 handler 里没调用 waitpid(-1, &status, WNOHANG) ——这时 ps aux | grep ' Z ' 就能看到一堆 Z 状态进程,它们不占内存,但 PID 被永久占用,直到父进程退出。

热门AI工具

更多
切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

509

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1658

2024.03.01

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

4667

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2128

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

4667

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2128

2023.08.10

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

3670

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

3193

2023.06.29

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

60

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn