一、孤儿进程项目内容定义父进程先于子进程终止该子进程就成为孤儿进程正常的进程不是一种进程的状态产生原因父进程意外崩溃、被强制终止如kill -9或父进程主动退出但未正确处理子进程特点被系统的“祖先进程一号进程”Linux 中是 init 或 systemdPID1收养仍能正常运行完成自身任务后正常终止不会占用额外资源影响本身是系统正常处理机制的结果无负面影响反而避免了进程成为“无主进程”示例若父进程因 bug 崩溃子进程被 init 收养后可继续提供服务二、僵尸进程项目内容定义进程已终止但内核未释放其进程控制块PCB进程状态变为 Z僵尸态产生原因父进程未调用wait()或waitpid()等系统调用来读取子进程的退出状态如退出码、终止原因导致内核无法回收 PCB特点• 已终止运行不再执行任何代码但 PCB 仍占用内存资源如 PID、退出状态• 通过ps命令显示状态为Z或Z僵尸态名称可能为defunct影响• 系统 PID 数量有限大量僵尸进程会耗尽 PID 资源导致新进程无法创建• 不占用用户空间的内存数据段但内核空间的 PCB 资源仍被占用且无法使用处理方式•预防父进程调用wait()/waitpid()主动回收子进程状态•清除kill -9无法直接杀死僵尸进程其已终止无运行实体若父进程未处理可终止父进程僵尸进程被 1 号进程收养1 号进程会定期回收其 PCB三、守护进程3.1 介绍项目内容定义运行在后台的特殊进程独立于控制终端用于持续提供系统服务设计目的不受用户登录/注销影响长期稳定运行如网络服务、定时任务特点•脱离终端无控制终端避免终端关闭导致进程终止•后台运行通过ps命令查看状态通常为S休眠名称多以d结尾如httpd、systemd•父进程为1号进程启动后会与原本父进程脱离被1号进程收养•环境干净默认不继承终端信号工作目录通常为/文件描述符如stdin/stdout/stderr被关闭或重定向到/dev/null3.2 守护进程创建流程步骤操作目的1父进程fork()后退出子进程成为孤儿进程被 init/systemdPID1收养脱离原终端控制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.hunistd.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.hsys/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 的进程脱离控制终端、在后台长期运行的系统服务进程如sshd、nginx产生原因父进程意外退出或主动退出未等待子进程子进程退出后父进程未调用wait/waitpid回收其退出状态程序主动调用setsid等函数创建脱离终端并后台运行进程状态正常运行状态PPID1僵尸状态标记为defunct后台运行状态无控制终端名称常以d结尾如httpd资源占用占用正常进程资源代码/数据/PCB仅占用 PCB 资源PID、退出状态不占用代码段/数据段占用正常进程资源长期稳定运行危害无直接危害被 1 号进程正常管理大量积累会耗尽 PID 资源导致新进程无法创建无危害是系统正常运行的必要服务如网络服务、定时任务处理方式无需手动处理1 号进程会自动回收其资源父进程调用wait/waitpid主动回收或终止父进程由 1 号进程回收无需处理随系统启动而启动、终止而终止可通过systemctl等工具管理典型场景父进程未等待子进程就退出如脚本中后台运行的子进程父进程长期运行且未处理子进程退出如服务器程序漏洞系统服务如sshd、crond、nginx