博客
关于我
【进程】wait() 函数详细分析
阅读量:498 次
发布时间:2019-03-07

本文共 1648 字,大约阅读时间需要 5 分钟。

wait和waitpid的区别及使用方法

1. 概念理解

在POSIX系统中,wait()waitpid()是两种常用系统调用的主要区别在于执行时的行为特征和作用效果。本文将从功能与行为特点入手,系统分析两者之间的根本差异。


2. 阻塞与非阻塞

2.1 阻塞机制

  • wait()函数的行为:调用wait()会使得当前进程阻塞,直到它的任意一个子进程结束才会返回。子进程结束会引发SIGCHLD信号,当该信号未被处理或处理结果不明确时,进程会保持阻塞状态。
  • 阻塞条件:如果有一个子进程结束,不管其他子进程是否继续运行,父进程都将被阻塞,直到某种方式唤醒它。这种规则与子进程的终止状态直接相关。

2.2 非阻塞机制

  • waitpid()函数的行为:调用waitpid()wait()不同之处在于,调用者可以选择等待特定进程ID或设置为非阻塞模式。实现上,waitpid()的非阻塞行为通过WNOFILLPG标志位控制。在非阻塞模式下,可继续执行其他任务,当有SIGCHLD信号被触发时,通过waitpid()获取子进程的终止状态,而不会阻塞当前执行流程。

2.3 特殊情境

  • 已终止的子进程:如果已有子进程终止并等待父进程确认,其信息可以立即被获取,无需继续等待。
  • No child,即没有子进程:调用waitpid()如果父进程不存在子进程,系统会立即返回错误,避免无效等待。

3. 等待子进程状态的获取

3.1 wait函数的特点

  • 单次等待wait()函数执行后,会返回当有一个子进程终止时的信息。此时需要多次调用wait()以获取所有子进程的终止状态。
  • 阻塞默认设置:需要通过信号处理机制,比如设置SA_NOCHLD来防止父进程被阻塞,否则子进程可能成为僵尸进程。

3.2 waitpid函数的特点

  • 条件等待waitpid()允许在等待特定子进程时,处理多个子进程终止事件,不会阻塞当前进程。
  • 进程选择灵活:可以通过进程ID或正例如选择等待哪些进程,适用于多个子进程的情况。

4. 与SIGCHLD信号的关系

4.1 信号默认处理

  • 系统默认设置:子进程终止时,会触发SIGCHLD信号,父进程若未设置SA_NOCHLD,会,默认地安装SA_ONSTACK处理程序,导致wait()函数被调用,从而防止子进程成为僵尸。

4.2 专家级处理方式

  • 信号处理程序管理:开发者可以在自己的信号处理函数中,自行调用wait()waitpid(),以控制何时和如何接收子进程终止信息,从而灵活管理父进程的等待行为。

5. 父进程的同步与异步模式

5.1 同步模式

  • 默认阻塞处理:使用wait()并默认处理SIGCHLD信号时,父进程会以同步方式等待子进程终止。在此模式下,父进程必须等待子进程完成后才能继续其他任务,避免资源竞争。

5.2 异步模式

  • 信号捕获与处理:通过安装自己的SIGCHLD信号处理函数,可以在不阻塞的情况下,异步获取子进程终止信息。这种方式允许父进程在多任务处理中,及时响应子进程事件。

6. wait函数何时返回?

  • 状态变化触发wait()函数返回时,总是伴随着某个子进程的终止状态。
  • 被设置为SA_INTERRUPT:在特殊情况下,父进程可以被中断,绕过正常的等待逻辑。

7. wait函数之与SIGCHLD信号的关系

7.1 信号来源

  • 里程碑事件:一旦一个子进程终止,内核会向父进程发送SIGCHLD信号,触发等待逻辑。

7.2 信号的重要性

  • 状态通知机制:这是内核向父进程传递子进程终止信息的关键方式,使得父进程才能知晓子进程的状态变化。

8. 总结

wait()waitpid()是POSIX系统中等待子进程终止的两大工具,两者的主要差别在于执行方式和控制能力。选择哪个函数取决于具体需求:如果需要防止阻塞且灵活处理多个终止事件,可以用waitpid();如果只需要简单等待子进程终止,可以用wait()。通过合理配置信号处理,父进程可以实现既高效又灵活的多任务处理。

转载地址:http://tsacz.baihongyu.com/

你可能感兴趣的文章
15种下载文件的方法&文件下载方法汇总&超大文件下载
查看>>
anaconda、python卸载后重装以及anaconda--443
查看>>
AWVS工具太顶了,漏洞扫描工具AWVS介绍及安装教程
查看>>
CentOS 系列:CentOS 7 使用 virt-install + vnc 图形界面/非图形界面 创建虚拟机
查看>>
CentOS 系列:CentOS 7文件系统的组成
查看>>
CentOS系列:【Linux】CentOS7操作系统安装nginx实战(多种方法,超详细)
查看>>
CSDN----Markdown编辑器
查看>>
Docker容器进入的4种方式(推荐最后一种)
查看>>
Docker部署postgresql-11以及主从配置
查看>>
EnvironmentNotWritableError: The current user does not have write permissions to the target environm
查看>>
Golang起步篇(Windows、Linux、mac三种系统安装配置go环境以及IDE推荐以及入门语法详细释义)
查看>>
Hyper-V系列:windows11开启系统自带安卓虚拟机并安装apk包
查看>>
Hyper-V系列:微软官方文章
查看>>
idea打war包的两种方式
查看>>
Java系列:【注释模板】IDEA中JAVA类、方法注释模板教程
查看>>
JS系列(仅供参考):【浏览器编程】浏览器F12调试工具面板详解和JavaScript添加断点
查看>>
Kali 更换源(超详细,附国内优质镜像源地址)
查看>>
kali安装docker(亲测有效)
查看>>
Linux系列:Linux目录分析:[/] + [/usr] + [/usr/local] + [/usr/local/app-name]、Linux最全环境配置 + 动态库/静态库配置
查看>>
Linux系列:ubuntu各版本之间的区别以及Ubuntu、kubuntu、xUbuntu、lubuntu等版本区别及界面样式
查看>>