子进程的异步等待方式

给爸妈买的红米12C想装个老年桌面?先别急,解锁BL和Root前你得知道这些 本文详细解析了红米12C解锁BL和Root的利弊,为想要为长辈简化手机操作的用户提供全面指南。文章对比了BL解锁与Root的技术差异,推荐优先使用MIUI内置的极简模式等官方功能,并评估了Root的实际必要性。若必须Root,提供了安全操作流程和长期维护建议,帮助用户做出明智选择。 阅读详情

原来只给大家介绍过僵尸进程,而没有介绍僵尸进程是怎么回收的,今天就给大家介绍一下如何回收僵尸进程。

用wait和waitpid函数清理僵尸进程,父进程可以阻塞等待子进程结束,也可以非阻塞地查询是否有子进程结束等待清理(也就是轮询的方式)。采用第一种方式,父进程阻塞了就不能处理自己的工作了;采用第二种方式,父进程在处理自己的工作的同时还要记得时不时地轮询一下(也就是过一段时间过来看一下是否有子进程退出然后回收它)。

其实,子进程在终止时会给父进程发SIGCHLD信号,该信号的默认处理动作是忽略,父进程可以自定义SIGCHLD信号的处理函数,这样父进程只需专心处理自己的工作,不必关心子进程了,子进程终止时会通知父进程,父进程在信号处理函数中调用wait清理子进程即可。

下面我们用自定义的信号捕捉函数来捕捉SIGCHLD信号。先让父进程fork出一个子进程,让子进程sleep3秒之后在退出,这时候我们对SIGCHLD信号进程捕捉,打印出我们想要的语句,这样就可以验证子进程会对父进程发送SIGCHLD信号。

测试如下:

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>

void handler(int sig)
{
    printf("sig is: %d\n", sig);
}


int main()
{
    signal(SIGCHLD, handler);
    pid_t id = fork();
    if(id == 0)
    {
        printf("child is: %d, father is: %d\n", getpid(), getppid());
        exit(0);
    }
    else
    {
        printf("father is: %d\n", getpid());
        sleep(3);
    }
    return 0;
}

在上面的代码中我们让子进程先退出,这是我们对SIGCHLD信号进行了捕捉,然后在我们的捕捉函数中打印了捕捉的信号为17,而在下面我们可以看出17号信号为SIGCHLD。

父进程等待子进程的异步版本 :

首先必须介绍waitpid这个函数:

pid_t waitpid(pid_t pid, int *status, int options);
参数1:pid

Pid=-1,等待任一个子进程。与wait等效。
Pid>0.等待其进程ID与pid相等的子进程。
Pid==0等待其组ID等于调用进程组ID的任一个子进程。
Pid<-1等待其组ID等于pid绝对值的任一子进程。
参数2:status

WIFEXITED(status) : 若为正常终止子进程返回的状态,则为真。(查看进程是否是正常退出)
WEXITSTATUS(status) : 若WIFEXITED非零,提取子进程退出码。(查看进程的退出码)

参数3:options

WNOHANG:非阻塞式等待指定的进程。

WUNTRACED:如果子进程进入暂停执行则马上返回,但结束状态不予以例会。

WCONTINUED:若实现支持作业控制,那么由pid指定的任一子进程在暂停后已经继续,但状态尚未报告,则返回状态。

下面我们直接测试子进程的已步等待方式

将waitpid的第一个参数设置为-1等待任何一个子进程,将参数3设置为WNOHANG非阻塞是等待进程。

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>

void handler(int sig)
{
    pid_t id ;
    while((id = waitpid(-1,NULL,WNOHANG)) > 0)
    {
        printf("father:wait success:%d\n",id);
     }
    printf("child is quit! %d\n",getpid());
}


int main()
{
    signal(SIGCHLD, handler);
    pid_t id1 = fork();
    if(id1 == 0)
    {
        printf("child is: %d, father is: %d\n", getpid(), getppid());
        exit(0);
    }
    pid_t id2 = fork();
    if(id2 == 0)
    {
        printf("child is: %d, father is: %d\n", getpid(), getppid());
        sleep(1);
        exit(0);
    }
    printf("father is: %d\n", getpid());
    while(1)
    {
        printf("father is wait\n");
        sleep(1);
    }
    return 0;
}



在上面的代码中我们可以看出两个子进程分别是2907和2906,父进程为2905。当进程2069进程直接退出后给父进程发送了SIGCHLD信号,这时候父进程捕捉到了子进程发送的信号并打印了子进程的id 2906,然后打印自己的id 2905,等待了1秒后子进程2907退出给父进程发送了信号SIGCHLD,然后父进程接受并打印。






【深度学习基础】一篇弄懂训练集、验证集和测试集(呕心沥血版) 在深度学习中,训练集、验证集和测试集是构建和评估模型的核心组成部分。训练集用于模型的学习和参数优化,验证集帮助调整超参数和防止过拟合,而测试集则用于最终评估模型的泛化性能。正确划分和使用这三类数据集,对于开发高效、可靠的深度学习模型至关重要。本文将深入解析它们的作用、划分方法以及在实际应用中的注意事项,帮助你全面理解并掌握数据集的科学使用方法,从而提升模型的实际表现。 阅读详情

相关推荐

Frida动态Hook实战:逆向美团外卖mtgsig3.0签名算法

在移动应用安全与数据爬取领域,API签名是保障请求合法性与数据完整性的核心机制。其原理是通过特定算法,将请求参数、时间戳等动态要素加密生成唯一字符串,服务器端通过验签防止数据篡改与伪造。这项技术的核心价值在于,它构建了客户端与服务器之间的可信通道,是移动端数据交互安全的基础。在自动化测试、安全审计、市场数据分析等应用场景中,理解并能够获取或绕过签名验证是关键前提。本文聚焦于美团外卖App的核心签名参数mtgsig3.0,针对其复杂的算法逻辑,提供了一套基于Frida的动态Hook解决方案。通过Hook技术,

weixin_33935636的博客 833

Linux子进程的异步等待方式

我们知道当一个父进程创建一个子进程时,最好要调用wait或者waitpid函数等待子进程,不然会产生僵尸进程造成是内存泄漏的问题。一般父进程在等待子进程时有两种方式等待,一种是阻塞式等待,这时父进程不能处理自己的工作;另一种是以非阻塞式等待,父进程处理自己工作的同时,要定时去查看有没有子进程等待清理。1.验证子进程在退出的时候会给父进程发送一个SIGCHLD信号一般情况下父进程收到这个信号的默认处理

stay_the_course的博客 805

Navicat16/17数据库密码安全解析与实战解密指南

本文详细解析了Navicat 16/17版本中数据库密码的加密机制,并提供了实用的密码找回指南。通过导出连接文件获取加密密文,利用基于AES-128-CBC算法的本地HTML工具,可安全、离线地解密遗忘的密码。文章强调该方法仅适用于合法恢复自有密码,并给出了操作步骤与安全建议。

weixin_28835583的博客 466

进程等待及子进程异步等待方式

首先我们来看两个函数,wait和waitpid函数。       一个进程在终止时会关闭所有的文件描述符,释放在用户空间分配的内存,但它的PCB还保留着,内核在其中保存了一些信息;如果是正常终止则保存着退出状态,如果是异常终止则保存着导致该进程终止的信号是哪个。这个进程的父进程可以调用wait或waitpid获取这些信息,然后彻底清除掉这个进程。       当一个进程正常或异常终止时,内核就

gmy2016wiw的博客 530

Android 音频源码分析——音量调节流程

源码分析基于android9.0 一、声音类型 对于大多数手机用户来说,操作手机音量按键可以看到,声音类型分为四种:媒体、铃声、闹钟、通话,但是其系统内部则分为十几种类型。 声⾳类型用来区分不同播放用途及播放设备,包含11中类型 定义在 frameworks/base/media/java/android/media/AudioSystem.java中 /** Used to identify the default audio stream volume */ public static final in

奋斗的菜鸟ing 3818

【Cadence】stb仿真和ac仿真——以一个简单的全差分反相放大器仿真为例

最近在补一些仿真方法学的问题,以及一些一直以来都有点模糊的概念,简单记录一下。搭建一个以两个CMOS反相器构成的全差分放大器(28nm工艺,PMOS和NMOS尺寸一致)激励的设置方便共模和差模仿真用同一个TB(这里有一个问题:这个放大器需要在开环下仿真还是闭环下?哪些放大器应用在开环,哪些闭环?这种应用场景不同会导致需要仿真得到开环还是闭环增益,或者环路增益?(我知道放大器在设计的时候肯定都是闭环应用的多,但是什么时候没必要闭环应用?光验证ac和stb仿真是否一样的话有必要有回路吗?

weixin_44951108的博客 5万+

【Linux】子进程的异步等待方式

SIGCHLD 当子进程退出时,它会向父进程发送SIGCHLD信号,该信号的默认处理方式为忽略,当父进程以阻塞方式等待时,它不能处理自己的工作。 我们自定义一个捕捉信号的函数myhandler #include #include #include #include #include void myhandler(int sig) { printf("得到一个信号 : %d 进程号

皓皓松的博客 1784

python 识别滑块验证码

博客来源于: https://www.cnblogs.com/wyh0923/p/16528354.html # -*- coding: utf-8 -*- # https://gov.pkulaw.cn/ 1. import io 2. import json 3. from pathlib import Path 4. from PIL import Image 5. import bas...

2102

Linux----子进程的异步等待方式

一、关于进程等待 相关博客: http://blog.youkuaiyun.com/rengui1228/article/details/73064852 二、基础知识      1,进程的各种状态             Linux是一个多用户,多任务的系统,可以同时运行多个用户的多个程序,就必然会产生很多的进程,而每个进程会有不同的状态。 在下文将对进程的R、S、D、T、Z、X 六种状态做个

rengui1228的博客 393

8、音频运行时系统的架构设计

本文深入探讨了音频运行时系统的分层设计及其优势,包括逻辑层和物理层的功能划分。通过分层设计,开发者可以更轻松地管理和优化音频资源,确保其在不同平台上的高效运行。文章还介绍了平台适配与优化、错误处理与调试以及未来发展方向等内容,为开发者提供了宝贵的参考和指导。

juice的博客 461

手把手教你完成YOLOv11 PySide6目标检测界面搭建,使用Qt6设计YOLOv11检测系统,前台系统+后台管理系统开发实战,可用于大论文凑工作量或毕设必备,全网最详细教程

目标检测是计算机视觉中的重要任务,广泛应用于安防监控、自动驾驶、智能家居等领域。YOLO系列模型由于其高效的检测速度和较高的准确率,成为目标检测任务的首选算法之一。本项目结合 YOLOv11 与 PySide6,构建了一个图形化界面,便于用户进行目标检测的操作和展示,实现对图片、视频和摄像头的实时目标检测,不仅可以用于大论文的工作量展示,还可以作为毕业设计。系统功能有:目标检测程序实现图片/视频/摄像头检测,AI 问答界面(deepseek大模型接口,流式输出)、退出登录、界面保存登录状态、个人信息修改等

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 7013

子进程异步等待方式

1. 原理 1、子进程在退出时,会给父进程发送17号信号 SIGCHLD 2、可以对信号SIGCHLD进行自定义动作,执行handler 3、handler是系统回调函数,在收到该信号后,在进程又内核返回用户态前,处理自定义函数handler。 2、异步等待子进程void handler(int sig) { pid_t ret = waitpid(-1,NULL,WNOHA

m0_37956168的博客 375

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: 信号的捕捉
下一篇: 守护进程
Maple_Leaf_
博客等级 码龄10年 4粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值