news 2026/4/15 13:18:20

多线程的特殊线程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
多线程的特殊线程

一、孤儿进程

项目内容
定义

父进程先于子进程终止,该子进程就成为孤儿进程

(正常的进程)不是一种进程的状态

产生原因父进程意外崩溃、被强制终止(如kill -9),或父进程主动退出但未正确处理子进程
特点被系统的“祖先进程(一号进程)”(Linux 中是 init 或 systemd,PID=1)收养
仍能正常运行,完成自身任务后正常终止
不会占用额外资源
影响本身是系统正常处理机制的结果,无负面影响,反而避免了进程成为“无主进程”
示例父进程因 bug 崩溃,子进程被 init 收养后可继续提供服务

二、僵尸进程

项目内容
定义进程已终止,但内核未释放其进程控制块(PCB),进程状态变为 Z(僵尸态)
产生原因父进程未调用wait()waitpid()等系统调用来读取子进程的退出状态(如退出码、终止原因),导致内核无法回收 PCB
特点• 已终止运行,不再执行任何代码,但 PCB 仍占用内存资源(如 PID、退出状态)
• 通过ps命令显示状态为ZZ+(僵尸态),名称可能为<defunct>
影响• 系统 PID 数量有限,大量僵尸进程会耗尽 PID 资源,导致新进程无法创建
• 不占用用户空间的内存数据段,但内核空间的 PCB 资源仍被占用且无法使用
处理方式预防:父进程调用wait()/waitpid()主动回收子进程状态
清除kill -9无法直接杀死僵尸进程(其已终止,无运行实体);若父进程未处理,可终止父进程(僵尸进程被 1 号进程收养,1 号进程会定期回收其 PCB)

三、守护进程

3.1 介绍

项目内容
定义运行在后台的特殊进程,独立于控制终端,用于持续提供系统服务
设计目的不受用户登录/注销影响,长期稳定运行(如网络服务、定时任务)
特点脱离终端:无控制终端,避免终端关闭导致进程终止
后台运行:通过ps命令查看状态通常为S(休眠),名称多以d结尾(如httpdsystemd
父进程为1号进程:启动后会与原本父进程脱离,被1号进程收养
环境干净:默认不继承终端信号,工作目录通常为/,文件描述符(如stdin/stdout/stderr)被关闭或重定向到/dev/null

3.2 守护进程创建流程

步骤操作目的
1父进程fork()后退出子进程成为孤儿进程,被 init/systemd(PID=1)收养,脱离原终端控制
2子进程调用setsid()创建新会话,成为会话组长,脱离原控制终端,确保进程不再与任何终端关联
3调用chdir("/")将工作目录改为根目录(或其它不会被删除/卸载的目录),避免占用可卸载文件系统(如挂载点)导致无法卸载
4调用umask(0)修改文件创建掩码为 0,使守护进程创建文件时拥有完全权限(避免继承父进程的掩码限制)
5关闭所有继承的文件描述符释放父进程继承的 stdin/stdout/stderr 及其他打开的文件描述符,节省资源并避免意外操作
6使用dup()/dup2()重定向将标准输入、标准输出、标准错误重定向到/dev/null或日志文件,防止守护进程意外输出导致错误
7开启自己的服务执行守护进程的核心功能(如网络监听、定时任务等),长期稳定运行

3.3 相关函数

3.3.1 setsid函数

项目内容
头文件<sys/types.h>
<unistd.h>
原型pid_t setsid(void);
功能创建一个新会话,并让调用进程成为该新会话的首进程,同时也成为新进程组的组长
参数
返回值• 成功:返回调用进程的新会话标识符(会话ID)
• 失败:返回-1,并设置errno指示错误原因
备注调用进程不能是进程组组长,否则会失败;通常通过先fork()让父进程退出,子进程(非组长)再调用setsid()

3.3.2 chdir函数

项目内容
头文件<unistd.h>
原型int chdir(const char *path);
功能将调用进程的当前工作目录修改为参数path所指定的目录
参数path— 新的工作目录路径(字符串)
返回值• 成功:返回0
• 失败:返回-1,并设置errno指示错误原因

3.3.3 umask函数

项目内容
头文件<sys/types.h>
<sys/stat.h>
原型mode_t umask(mode_t mask);
功能修改进程的文件创建掩码(umask)
参数mask— 新的掩码值
计算公式• 实际文件权限 =~mask & 0666
• 实际目录权限 =~mask & 0777
返回值总是成功,返回之前的掩码值

四、三者的核心区别

对比维度

孤儿进程

(Orphan Process)

僵尸进程(Zombie Process)守护进程(Daemon Process)
定义父进程先于子进程退出,被子进程被 1 号进程收养的进程子进程先退出,但父进程未调用wait/waitpid回收其 PCB,导致进程状态为 Z 的进程脱离控制终端、在后台长期运行的系统服务进程(如sshdnginx
产生原因父进程意外退出或主动退出,未等待子进程子进程退出后,父进程未调用wait/waitpid回收其退出状态程序主动调用setsid等函数创建,脱离终端并后台运行
进程状态正常运行状态,PPID=1僵尸状态,标记为<defunct>后台运行状态,无控制终端,名称常以d结尾(如httpd
资源占用占用正常进程资源(代码/数据/PCB)仅占用 PCB 资源(PID、退出状态),不占用代码段/数据段占用正常进程资源,长期稳定运行
危害无直接危害,被 1 号进程正常管理大量积累会耗尽 PID 资源,导致新进程无法创建无危害,是系统正常运行的必要服务(如网络服务、定时任务)
处理方式无需手动处理,1 号进程会自动回收其资源父进程调用wait/waitpid主动回收;或终止父进程,由 1 号进程回收无需处理,随系统启动而启动、终止而终止,可通过systemctl等工具管理
典型场景父进程未等待子进程就退出(如脚本中后台运行的子进程)父进程长期运行且未处理子进程退出(如服务器程序漏洞)系统服务(如sshdcrondnginx
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 13:17:14

Logisim新手必看:用74LS00芯片搭建RS/D锁存器的5个常见错误及解决方法

Logisim新手必看&#xff1a;用74LS00芯片搭建RS/D锁存器的5个常见错误及解决方法 第一次用Logisim仿真软件配合74LS系列芯片搭建锁存器时&#xff0c;那种手忙脚乱的感觉我至今记忆犹新。明明按照教科书上的电路图连接&#xff0c;仿真时却总是出现意外的输出状态。后来才发现…

作者头像 李华
网站建设 2026/4/15 13:17:01

Ubuntu Autoinstall Generator:3步实现无人值守Ubuntu自动化部署

Ubuntu Autoinstall Generator&#xff1a;3步实现无人值守Ubuntu自动化部署 【免费下载链接】ubuntu-autoinstall-generator Generate a fully-automated Ubuntu ISO for unattended installations. 项目地址: https://gitcode.com/gh_mirrors/ub/ubuntu-autoinstall-genera…

作者头像 李华
网站建设 2026/4/15 13:15:46

开源vs闭源,轻量vs全能,视觉优先vs语言优先——多模态模型能力矩阵图(2024Q2权威版)

第一章&#xff1a;多模态大模型模型选择指南 2026奇点智能技术大会(https://ml-summit.org) 选择合适的多模态大模型是构建鲁棒AI应用的关键起点。不同模型在视觉理解、跨模态对齐、文本生成质量、推理延迟与硬件兼容性上存在显著差异&#xff0c;需结合任务目标、数据形态和…

作者头像 李华