当前位置: 首页 > news >正文

Linux 使用 `wait` 函数回收子进程

Linux 使用 `wait` 函数回收子进程

  • 引言
  • `wait` 函数的作用
  • 创建僵尸进程的示例
    • 代码解释
  • 使用 `wait` 函数回收子进程
    • 代码解释
  • `wait` 函数的详细解析
    • 函数原型
    • 参数说明
    • 返回值
    • 注意事项
  • 处理僵尸进程的方法
  • 常见问题解答
    • 1. `wait` 函数会阻塞父进程吗?
    • 2. 如何避免僵尸进程的产生?
    • 3. `wait` 和 `waitpid` 的区别是什么?
  • 总结

引言

在 Linux 系统中,进程管理是一个核心概念。当父进程创建子进程后,子进程可能会在父进程之前终止。如果父进程没有及时回收子进程的资源,子进程会变成僵尸进程(Zombie Process),占用系统资源。为了避免这种情况,Linux 提供了 waitwaitpid 函数,用于回收子进程并获取其退出状态信息。

本文将详细讲解 wait 函数的使用方法、工作原理以及如何通过代码实现子进程的回收,避免僵尸进程的产生。


wait 函数的作用

wait 函数的作用是阻塞父进程,直到一个子进程终止。当子进程终止时,wait 函数会返回子进程的退出状态,并回收子进程的资源。具体功能包括:

  1. 阻塞父进程:父进程在调用 wait 后会进入阻塞状态,直到子进程终止。
  2. 获取子进程退出状态:通过 wait 函数可以获取子进程的退出状态信息。
  3. 回收子进程资源wait 函数会清理子进程的进程控制块(PCB),释放子进程占用的资源【1†source】。

创建僵尸进程的示例

在深入讲解 wait 函数之前,我们先通过一个示例代码展示僵尸进程的产生。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>int main() {pid_t pid = fork();if (pid == -1) {perror("fork");exit(EXIT_FAILURE);}if (pid == 0) {// 子进程printf("Child process (PID: %d) is exiting.\n", getpid());exit(EXIT_SUCCESS);} else {// 父进程printf("Parent process (PID: %d) is running. Child PID: %d\n", getpid(), pid);sleep(10); // 父进程继续运行,但不调用 wait()printf("Parent process exiting.\n");exit(EXIT_SUCCESS);}return 0;
}

代码解释

  1. fork() :创建子进程。pid 为 0 表示子进程,正值表示父进程的 PID。
  2. 子进程终止:子进程调用 exit(EXIT_SUCCESS) 终止。
  3. 父进程未回收:父进程未调用 wait,导致子进程成为僵尸进程。

运行上述代码后,可以使用以下命令查看僵尸进程:

ps -o pid,ppid,stat,cmd

僵尸进程的 STAT 列将显示为 Z【5†source】。


使用 wait 函数回收子进程

为了避免僵尸进程的产生,父进程需要调用 waitwaitpid 函数来回收子进程。以下是使用 wait 函数的示例代码。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>int main() {pid_t pid = fork();if (pid == -1) {perror("fork");exit(EXIT_FAILURE);}if (pid == 0) {// 子进程printf("Child process (PID: %d) is exiting.\n", getpid());exit(EXIT_SUCCESS);} else {// 父进程printf("Parent process (PID: %d) is waiting for child %d.\n", getpid(), pid);// 调用 wait 回收子进程int status;pid_t child_pid = wait(&status);if (child_pid == -1) {perror("wait");exit(EXIT_FAILURE);}printf("Child process %d terminated with status %d.\n", child_pid, status);exit(EXIT_SUCCESS);}return 0;
}

代码解释

  1. fork() :创建子进程。
  2. 子进程终止:子进程调用 exit(EXIT_SUCCESS)
  3. 父进程调用 wait :父进程调用 wait(&status) 阻塞,直到子进程终止。
  4. 获取退出状态status 包含子进程的退出状态信息。
  5. 回收子进程资源wait 函数回收子进程的资源,避免僵尸进程的产生。

wait 函数的详细解析

函数原型

pid_t wait(int *status);

参数说明

  • status :一个指向整数的指针,用于存储子进程的退出状态信息。如果 statusNULL,则不返回退出状态信息【6†source】。

返回值

  • 成功:返回子进程的 PID。
  • 失败:返回 -1,并设置 errno 以指示错误原因。

注意事项

  • wait 函数会阻塞父进程,直到子进程终止。
  • 如果子进程已经终止,wait 函数会立即返回。
  • 如果父进程调用 wait 时没有子进程,函数会阻塞,直到有子进程终止【7†source】。

处理僵尸进程的方法

除了使用 wait 函数,还可以通过以下方法避免僵尸进程的产生:

  1. 及时调用 waitwaitpid :父进程在子进程终止后立即调用 waitwaitpid 回收子进程。
  2. 使用信号处理:设置 SIGCHLD 信号处理函数,在信号处理函数中调用 waitwaitpid【8†source】。
  3. 忽略 SIGCHLD 信号:调用 signal(SIGCHLD, SIG_IGN);,让内核自动回收子进程【9†source】。

常见问题解答

1. wait 函数会阻塞父进程吗?

是的,wait 函数会阻塞父进程,直到子进程终止【1†source】。

2. 如何避免僵尸进程的产生?

及时调用 waitwaitpid 回收子进程,或者设置 SIGCHLD 信号处理函数【8†source】。

3. waitwaitpid 的区别是什么?

  • wait 函数会阻塞父进程,直到任意一个子进程终止。
  • waitpid 函数可以指定要等待的子进程,并支持非阻塞模式【6†source】。

总结

wait 函数是 Linux 进程管理中一个重要的工具,用于回收子进程并避免僵尸进程的产生。通过调用 wait 函数,父进程可以获取子进程的退出状态信息,并清理子进程的资源。在实际开发中,及时调用 waitwaitpid 函数是确保系统稳定性和高效性的关键。

希望本文能够帮助您更好地理解 wait 函数的作用和使用方法。如果您在实际开发中有任何问题,欢迎留言讨论!

http://www.dtcms.com/a/572677.html

相关文章:

  • 八股训练营第 8 天 | TCP连接三次握手的过程?TCP连接四次挥手的过程?HTTP的Keep-Alive是什么?
  • 【计算网络学习笔记】网络基础之网络协议栈
  • CyberSecEval 2
  • wordpress 两栏专业seo培训学校
  • 【浏览器CORS问题解决方案】SpringBoot+Vue3前后端全覆盖:浏览器跨域问题的多样化解决方案
  • 论述AI和人类的分工
  • 第四阶段C#通讯开发-6:Socket之UDP
  • 广州建设网站公司简介百度seo排名推广
  • 四自由度机械臂运动学与动力学分析
  • Spring Security 使用
  • Web3开发中的前端、后端与合约:角色定位与协作逻辑
  • 神经网络—— 人工神经网络
  • GroupNet:基于多尺度神经网络的交互推理轨迹预测
  • CANN 自定义算子实战:从智能门禁到工业质检,MindStudio 7.0 落地优化(时延 130ms + 漏检率 3%,代码可复现)
  • RecyclerView Item 点击 长按事件最佳实践(为什么长按要 return true?
  • 哪些软件可以做网站门户网站搭建方案
  • 【Java 开发日记】设计模式了解吗,知道什么是饿汉式和懒汉式吗?
  • HTTPDNS 并非是 DoH/DoT 中的一种
  • spring boot 请求分发器
  • 百度站长收录入口如何判断网站好坏
  • RVO和移动语义
  • 阻塞队列 BlockingQueue 全解析:从 ArrayBlockingQueue 到 LinkedBlockingQueue
  • Autoware.universe多点导航和避障绕障设置
  • 计网6.1 网络应用模型
  • YOLO系列算法学习:YOLOv8:系列又一力作
  • 自动化测试-YAML
  • UnityGLTF 材质创建与赋值流程
  • 专业英文网站建设外贸业务怎么利用网站开发客户
  • 泰州网站建设策划做棋牌网站合法
  • uniapp开发ai对话app,使用百度语音识别用户输入内容并展示到页面上