0

0

Linux 进程生命周期完整解析

舞夢輝影

舞夢輝影

发布时间:2026-01-26 20:10:03

|

933人浏览过

|

来源于php中文网

原创

fork()后父子进程谁先运行无确定顺序,由内核CFS调度器决定;子进程退出后父进程不wait()会导致僵尸进程;子进程未exec时必须用_exit()而非exit()。

linux 进程生命周期完整解析

fork() 后父子进程谁先运行?

没有确定顺序。fork() 返回后,父子进程谁先被调度执行,完全由内核 CFS 调度器决定,不是“子进程一定等父进程 return 之后才跑”。很多新手写测试代码发现子进程总在父进程后面打印,误以为是顺序保证——那只是运气好或负载低下的巧合。

  • 若需严格同步(比如父进程必须等子进程初始化完再发数据),必须显式调用 waitpid() 或使用 pipe()/signal() 等 IPC 机制
  • 在循环 fork 场景(如预分叉服务器)中,不加同步极易引发竞态,比如多个子进程同时尝试绑定同一端口而失败
  • fork() 实际开销极小,靠写时复制(Copy-on-Write)延迟物理页拷贝;但若子进程立即大量写内存(如 deep copy 大结构体),反而比直接 malloc 更慢

execve() 失败的常见原因和调试方法

execve() 不创建新进程,只替换当前进程映像;它成功就永不返回,失败才返回 -1 并设置 errno。最常见的失败不是“找不到文件”,而是路径、权限或解释器问题。

  • 路径错误:execve("ls", ...) 失败(ENOENT),必须用 "./ls""/bin/ls";想自动查 $PATH,改用 execvpe()
  • 脚本无 #!:比如执行 ./deploy.sh 时内核报 ENOEXEC,说明该脚本第一行缺失 #!/bin/bash 或解释器路径不可达
  • 权限不足:目标文件无可执行位(chmod +x 缺失),或位于 noexec 挂载分区(如某些 tmpfs)
  • 调试技巧:在 exec 前加 printf("about to exec: %s\n", argv[0]); fflush(stdout);,避免因缓冲区未刷导致日志丢失

子进程退出后,父进程不 wait() 会怎样?

子进程变成僵尸(Z 状态),ps 显示 STAT 列为 Z,PID 无法复用,长期积累会耗尽进程表(/proc/sys/kernel/pid_max 限制)。注意:僵尸本身不占内存/CPU,但它的 task_struct 和退出状态仍驻留内核。

iOS开发学习之iOS多线程和RunLoop 中文WORD版
iOS开发学习之iOS多线程和RunLoop 中文WORD版

iOS多线程编程对于iOS开发初学者来说,总是会觉得很难理解和掌握,现在通过几个实例来更加系统全面的理解iOS多线程编程,希望对大家有所帮助。 有些程序是一条直线,起点到终点;有些程序是一个圆,不断循环,直到将它切断。直线的如简单的Hello World,运行打印完,它的生命周期便结束了,像昙花一现那样;圆如操作系统,一直运行直到你关机。 一个运行着的程序就是一个进程或者叫做一个任务,一个进程至少包含一个线程,线程就是程序的执行流。Mac和iOS中的程序启动,创建好一个进程的同时,一个线程便开始运行,

下载
  • 临时补救:父进程调用 waitpid(-1, &status, WNOHANG) 非阻塞回收;或注册 SIGCHLD 信号处理器,在其中循环 waitpid()
  • 彻底省事:父进程启动前设 signal(SIGCHLD, SIG_IGN),Linux 2.6+ 内核会自动清理(但注意:某些旧系统或容器环境可能不生效)
  • 双 fork 技巧:子进程再 fork 一个孙进程后立即 _exit(),孙进程被 init 收养,自然由 init 负责 wait —— 常用于守护进程脱离终端

exit() 和 _exit() 在 fork 后到底该用哪个?

子进程若已调用 execve(),用 exit()_exit() 都行;但若没 exec(比如只做计算就退出),**必须用 _exit()**,否则可能重复刷新父进程的 stdio 缓冲区,导致日志错乱或文件写入异常。

  • 根本原因:fork 后父子进程共享底层文件描述符(fd),但各自有独立的 FILE* 结构体;exit() 会 flush 所有打开的 FILE*,而父子 fd 指向同一文件,造成重复写
  • 典型现象:父进程 printf("done\n") 后 fork 子进程,子进程直接 exit(0),结果终端看到两行 "done"
  • 安全习惯:fork 后的子进程,只要不 exec,退出一律用 _exit();父进程则可用 exit()(需确保不依赖子进程 flush 行为)
实际写服务程序时,最容易被忽略的是 _exit() 的使用时机和 SIGCHLD 信号处理的异步安全性——比如在信号处理器里调用 printf()malloc() 会引发未定义行为,必须只用 async-signal-safe 函数(如 write()_exit())。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

73

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

283

2023.11.28

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

220

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

191

2025.07.04

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

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

1373

2023.06.21

如何安装LINUX
如何安装LINUX

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

705

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

295

2023.06.30

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

778

2023.07.05

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

31

2026.01.26

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.8万人学习

Git 教程
Git 教程

共21课时 | 3万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号