Linux进程等待——wait、waitpid与僵尸进程

目录

[1. 引言](#1. 引言)

[2. 进程等待的必要性](#2. 进程等待的必要性)

[3. wait 函数](#3. wait 函数)

[4. waitpid 函数](#4. waitpid 函数)

[5. 获取子进程退出状态](#5. 获取子进程退出状态)

[6. 阻塞与非阻塞等待](#6. 阻塞与非阻塞等待)

阻塞等待示例

非阻塞等待示例

[7. 补充:孤儿进程与守护进程](#7. 补充:孤儿进程与守护进程)

[8. 总结](#8. 总结)


1. 引言

如果父进程不等待子进程退出,子进程会变成僵尸进程(Zombie),占用内核资源,甚至导致内存泄漏。本文详细讲解进程等待的必要性、waitwaitpid 的使用方法,以及如何获取子进程的退出状态。

2. 进程等待的必要性

  • 回收子进程资源:避免僵尸进程;

  • 获取子进程退出状态:判断任务执行结果;

  • 防止内存泄漏 :僵尸进程无法被 kill -9 杀死。

3. wait 函数

c

复制代码
#include <sys/wait.h>
pid_t wait(int *status);
  • 返回值:成功返回子进程PID,失败返回-1;

  • 参数 status :输出型参数,用于获取子进程退出信息,不关心则传 NULL

4. waitpid 函数

c

复制代码
pid_t waitpid(pid_t pid, int *status, int options);

参数 pid

  • pid == -1:等待任意子进程,同 wait

  • pid > 0:等待指定PID的子进程。

参数 options

  • 0:阻塞等待;

  • WNOHANG:非阻塞等待,若子进程未退出则立即返回0。

返回值:

  • 正常返回子进程PID;

  • WNOHANG 且无子进程退出时返回0;

  • 出错返回-1。

5. 获取子进程退出状态

status 是一个32位整数,其低16位包含以下信息:

  • 高8位(位8~15):退出码(正常退出时);

  • 低7位(位0~6):终止信号编号;

  • 第7位(bit 7):coredump标志。

常用宏:

  • WIFEXITED(status):是否正常退出;

  • WEXITSTATUS(status):提取退出码;

  • WIFSIGNALED(status):是否被信号终止;

  • WTERMSIG(status):提取终止信号。

6. 阻塞与非阻塞等待

阻塞等待示例

c

复制代码
waitpid(-1, &status, 0);  // 等待任意子进程,阻塞
非阻塞等待示例

c

复制代码
while ((ret = waitpid(-1, &status, WNOHANG)) == 0) {
    // 子进程仍在运行,执行其他任务
}

7. 补充:孤儿进程与守护进程

  • 孤儿进程 :父进程先于子进程退出,子进程被 init(PID=1)收养,可自动回收;

  • 守护进程 :一种特殊的孤儿进程,脱离终端,后台运行(如 sshdcrond)。

8. 总结

  • 始终使用 waitwaitpid 回收子进程;

  • 非阻塞等待适用于需要同时处理其他任务的场景;

  • 理解 status 的位结构是调试信号问题的基础。

相关推荐
泡泡鱼(敲代码中)27 分钟前
MySQL基础学习笔记:从数据模型到DDL全掌握
开发语言·数据库·笔记·学习·mysql
H_oRIZoN_27 分钟前
Linux入门DAY41(51 单片机 串口与通信协议)
linux·运维·单片机
小马同学-2 小时前
OpenStack 使用实战:Web 界面与 CLI 命令行实验
运维·云计算·openstack
潜创微科技2 小时前
IT6520:USB-C 转 MIPI 高集成控制器,DP 1.4a 转 MIPI 单芯片搞定 4K120 显示
c语言·开发语言·低延迟·掌机·联阳
GeW2 小时前
RHCE备考别瞎学!按这个计划走,30天提高通过率,快速拿证
linux
Escalating_xu2 小时前
【System V 信号量】从 P/V 原语到 Builder 封装:写出可控、可清理的进程互斥组件
java·linux·开发语言·jvm
傲世仙尊2 小时前
System V 进程间通信详解:共享内存、消息队列与信号量(CSDN博客)
linux·开发语言·c++
码农小韩3 小时前
Linux应用开发(六)——进程间通信
linux·linux驱动·嵌入式软件开发·嵌入式操作系统·linux应用
cvby3 小时前
C++11
开发语言·c++
网安老伯3 小时前
都2026年了,还在问网络安全怎么入门?看完这一篇你就懂了
运维·计算机网络·web安全·网络安全·wireshark·密码学·网络攻击模型