• Linux进程等待


    一、进程等待是什么?

    通过系统调用wait/waitpid,来对子进程进行状态检验与回收的工作。

    二、为什么要有进程等待

    1、子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏
    另外,进程一旦变成僵尸状态,就无法被杀死,kill-9也不行,因为谁也没有办法杀死一个已经死去的进程。 (必须解决的)
    2、子进程运行完成,结果对还是不对,或者是否正常退出。
    通过进程等待,获取子进程退出情况--验证给子进程的任务完成的如何。 (可选项,有时不一定关心完成的如何)
    父进程通过进程等待的方式,回收子进程资源,获取子进程退出信息。

    三、wait/waitpid

    1、函数参数/返回值介绍

    阻塞等待(如服务器模式)

    只要没有子进程退出,父进程就会在wait()处一直等待,不返回,默认为阻塞等待状态

    阻塞状态:scanf是等待硬件资源

    wait不返回时相当于等待软件资源

    2、父进程wait1个子进程的样例

    注:wait是等待任意一个子进程退出。

    3、循环wait来wait多个子进程

    四、利用waitpid获取子进程退出信息

    1、输出型参数status

    要获取的信息有好几部分,因此status的32位被分为几部分使用。

    异常退出:

    [0,6]位 共有2^6 == 64个信号 表示异常终止,本质是进程收到了某个信号 7表示core dump

    例如:段错误,除0错误。

    正常退出:

    [8,15]表示退出状态,即exit对应的退出码

    通过位运算&和>>得到退出信号和退出码

    2、底层原理:

    子进程退出后释放代码和数据,但保留task_struct,用来给上层返回退出信息

    3、宏(宏函数,带()类似函数)

    WIFEXITED--> Wait  if  exited  查看子进程是否正常退出

    WEXITSTATUS--> 子进程退出状态  即退出码

    4、options等待方式

    options == 0 阻塞等待方式

    options == WNOHANG(wait no....)

    非阻塞轮询:非阻塞+循环  

    查询不成功就返回,然后继续循环查询直到成功。

    两次查询之间的时间可以做自己的事情。

    将父进程要做的事情解耦出来

    1、wait的主要任务是等待子进程,父进程此时额外做的一般是轻量级的工作,要及时返回

    2、稍晚一点回收子进程,或者将多个子进程统一回收也是可接受的

  • 相关阅读:
    最短路径算法
    绘图和可视化(Python)
    C++11新特性(右值引用,万能转发)
    单调栈是什么?
    云原生周刊:Argo CD v2.12 发布候选版本 | 2024.06.24
    【Rust日报】2022-08-14 Actix Web 的可扩展速率限制中间件
    jQuery获取表单的值val()
    ssm心理测验系统的设计与实现毕业设计-附源码211710
    第二部分:DDD 设计中的基本元素
    MetaObjectHandler的使用
  • 原文地址:https://blog.csdn.net/lzfnb666/article/details/134090989