Linux进程控制——进程等待

news2024/11/17 11:34:32

文章目录

    • 进程等待
      • 进程等待的必要性
      • 进程等待的方法
      • status参数
      • option参数

进程等待

进程等待的过程其实是父进程等待子进程死亡的过程

进程等待的必要性

如果子进程退出,父进程不进行处理,子进程会变成僵尸进程,有内存泄漏的风险

僵尸进程只有父进程有权处理,其他指令对其都没有效果了

父进程创建子进程是为了完成某项任务,当子进程结束后,父进程有必要了解任务完成的如何

父进程需要对子进程进行回收

进程等待的方法

waitpid系统调用的返回值是pid_t,如果等待成功则返回进程pid,失败则返回-1

这个函数有三个参数,第一个参数是pid_t pid,表示需要等待的进程id,输入-1表示等待任一子进程结束

第二个参数是int* stat_loc,这是一个输出型参数,采用指针的方法获取子进程退出状态,如果我们不关心这个状态直接传入NULL即可

第三个参数是int options,默认为0,代表阻塞等待,也有非阻塞等待的情况

还有一个wait的系统调用,只有第二个参数,就相当于waitpid的默认使用情况

#include<sys/wait.h>
#include<stdlib.h>
#include<stdio.h>

int main()
{
    pid_t id = fork();
    if(id==0)
    {
        int count = 5;
        while(count)
        {
            printf("%d: 这是一个子进程,pid为:%d\n", count, getpid());
            count--;
            sleep(1);
        }
        exit(0);
    }
    waitpid(id,NULL,0);
    printf("等待子进程\n");
    return 0;
}

image.png

我们知道的是,当子进程创建出来之后,父进程是不会进入到判断语句中的,而且也没有打印等待子进程,而是一直在执行waitpid这一行,是一直等到子进程执行完毕之后才继续执行的

status参数

父进程想要了解子进程的退出码和推出信号就需要用到这个输出型参数status

而退出码和退出信号是两个数据,怎么只用一个参数来表示,这其实就用到了位图的思想,用低八位表示异常终止的信号,剩下八位表示退出的状态

画出来就是这样的

image.png

终止信号的最高位是一个core dump标志,我们暂时先不研究

因此我们就可以通过位运算来获取退出码和终止信号

退出码是(status >> 8) & 0xFF

终止信号是status & 0x7F

我们可以手动设置一下退出码来进行验证

#include<sys/wait.h>
#include<stdlib.h>
#include<stdio.h>

int main()
{
    pid_t id = fork();
    int status = 0;
    if(id==0)
    {
        int count = 5;
        while(count)
        {
            printf("%d: 这是一个子进程,pid为:%d\n", count, getpid());
            count--;
            sleep(1);
        }
        exit(21);
    }
    waitpid(id,&status,0);
    printf("等待子进程\n");
    printf("退出码:%d; 终止信号:%d\n",(status>>8)&0xFF),status&0x7F;
    return 0;
}

image.png

option参数

option参数的默认值为0,表示阻塞等待,就是说父进程啥也不干,就等着子进程结束,那如果想让父进程可以在等待的时候做自己的事情,就需要用一个宏定义WNOHANG

意思是 waiting no hang 父进程会继续运行下面的代码,因为waitpid的返回值是进程退出的pid,我们也就可以用这个来判断,子进程是否结束

然后写一个循环访问即可

例如

#include<sys/wait.h>
#include<stdlib.h>
#include<stdio.h>

int main()
{
    pid_t id = fork();
    if(id==0)
    {
        int count = 5;
        while(count)
        {
            printf("%d: 这是一个子进程,pid为:%d\n", count, getpid());
            count--;
            sleep(1);
        }
        exit(21);
    }
    while(1)
    {
        int wait = waitpid(id,NULL,WNOHANG);
        if(wait==id)
        {
            printf("子进程退出,id为%d\n",wait);
            break;
        }
        else if(wait==0)
        {
            printf("子进程未退出\n");
        }
        else
        {
            perror("waitpid");
            exit(1);
        }
        sleep(1);
    }
    return 0;
}

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1956010.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

docker容器cuda不可用,怎么解决?

通过Docker 构建的镜像中,启动之后,发现容器内部读取不到显卡驱动nvidia-smi 1、设置 NVIDIA Docker 存储库 distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add

超逼真AI生成电影来了!《泰坦尼克号》AI重生!浙大阿里发布MovieDreamer,纯AI生成电影引爆热议!

视频生成领域的最新进展主要利用了短时内容的扩散模型。然而&#xff0c;这些方法往往无法对复杂的叙事进行建模&#xff0c;也无法在较长时间内保持角色的一致性&#xff0c;而这对于电影等长篇视频制作至关重要。 对此&#xff0c;浙大&阿里发布了一种新颖的分层框架Mov…

Kafka知识总结(选举机制+控制器+幂等性)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 选举机制 控制器&#xff08;Broker&#xff09;选举 控制器就是…

大模型算法面试题(十五)

本系列收纳各种大模型面试题及答案。 1、大模型LLM进行SFT如何对样本进行优化 大模型LLM&#xff08;Language Model&#xff0c;语言模型&#xff09;进行SFT&#xff08;Structured Fine-Tuning&#xff0c;结构化微调&#xff09;时&#xff0c;对样本的优化是提升模型性能…

从0开始搭建vue + flask 旅游景点数据分析系统(四):编写前端首页【数据驾驶舱】

本期我们编写数据驾驶舱页面(Dashboard)这个页面。主要任务是引入echarts 组件编写数据驾驶舱页面。 视频教程后续会更新在我的B站&#xff1a;https://space.bilibili.com/1583208775?spm_id_from666.25.0.0 推荐从教程第一集开始从零开始学习&#xff1a;https://blog.csdn…

PyCharm2024 专业版激活设置中文

PyCharm2024 专业版激活设置中文 官网下载最新版&#xff1a;https://www.jetbrains.com/zh-cn/pycharm/download 「hack-jet激活idea家族.zip」链接&#xff1a;https://pan.quark.cn/s/4929a884d8fe 激活步骤&#xff1a; 官网下载安装PyCharm &#xff1b;测试使用的202…

HDMI的等长要求到底是多少?

四对差分走线对内误差最好做到 5mil 范围之内&#xff0c;对与对的差分误差最好控制在 10mil 范围之内。同时&#xff0c;对与对之间的间距要求做到 15mil&#xff0c;空间准许的情况下尽量拉开&#xff0c;减小串扰。 作者&#xff1a;凡亿教育 https://www.bilibili.com/rea…

VulnHub:doubletrouble1

靶机下载地址 trouble1 信息收集 主机发现 攻击机ip&#xff1a;192.168.31.218&#xff0c;扫描攻击机同网段存活ip。 nmap 192.168.31.0/24 -Pn -T4 确认目标机ip&#xff1a;192.168.31.174 端口扫描 nmap 192.168.31.174 -A -p- -T4 开放了22,80端口。 目录扫描 访…

小白学大模型:LLaMA-Factory 介绍与使用

最近这一两周看到不少互联网公司都已经开始秋招提前批了。 不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c;帮助一些球友…

Linux:进程信号(二.信号的保存与处理、递达、volatile关键字、SIGCHLD信号)

上次介绍了&#xff1a;(Linux&#xff1a;进程信号&#xff08;一.认识信号、信号的产生及深层理解、Term与Core&#xff09;)[https://blog.csdn.net/qq_74415153/article/details/140624810] 文章目录 1.信号保存1.1递达、未决、阻塞等概念1.2再次理解信号产生与保存1.3信号…

ES6语法详解,面试必会,通俗易懂版

目录 Set的基本使用WeakSet 使用Set 和 WeakSet 区别内存泄漏示例&#xff1a;使用普通 Set 保存 DOM 节点如何避免这个内存泄漏MapWeakMap 的使用 Set的基本使用 在ES6之前&#xff0c;我们存储数据的结构主要有两种&#xff1a;数组、对象。 在ES6中新增了另外两种数据结构&a…

Pytorch深度学习快速入门(中)

Pytorch深度学习快速入门&#xff08;中&#xff09; 一、Containers&#xff08;神经网络的基本骨架&#xff09;&#xff08;一&#xff09;Module 的使用&#xff08;二&#xff09;Sequential 的使用<搭建小实战> 二、Convolution Layers&#xff08;卷积层&#xff…

加密货币赋能跨境电商:PayPal供应链金融服务如何引领行业新趋势

跨境电商行业近年来呈现出爆发式增长&#xff0c;随着全球化贸易壁垒的降低和数字经济的快速发展&#xff0c;越来越多的商家和消费者跨越国界进行交易。根据eMarketer的数据&#xff0c;全球跨境电商交易额在2023年已超过4万亿美元&#xff0c;并预计在未来几年内仍将保持两位…

Golang | Leetcode Golang题解之第301题删除无效的括号

题目&#xff1a; 题解&#xff1a; func checkValid(str string, lmask, rmask int, left, right []int) bool {cnt : 0pos1, pos2 : 0, 0for i : range str {if pos1 < len(left) && i left[pos1] {if lmask>>pos1&1 0 {cnt}pos1} else if pos2 <…

403 forbidden (13: Permission denied)

403 forbidden (13: Permission denied) 目录 403 forbidden (13: Permission denied) 【常见模块错误】 【解决方案】 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市开发者…

手撕Leetcode个人笔记【第二周-数组-链表】

2. 两数相加 中等 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;…

初识HTML文件,创建自己的第一个网页!

本文旨在初步介绍HTML&#xff08;超文本标记语言&#xff09;&#xff0c;帮助读者理解HTML中的相关术语及概念&#xff0c;并使读者在完成本文的阅读后可以快速上手编写一个属于自己的简易网页。 一、HTML介绍 HTML(全称HyperText Markup Language&#xff0c;超文本标记语言…

探索Python的进度条神器:tqdm

文章目录 探索Python的进度条神器&#xff1a;tqdm一、背二、tqdm简介三、安装tqdm四、tqdm的五个简单使用示例五、tqdm在不同场景下的应用六、常见问题及解决方案七、总结 探索Python的进度条神器&#xff1a;tqdm 一、背 景&#xff1a;为什么选择tqdm&#xff1f; 在Python…

扫雷游戏小程序

目录 一.文件 1.头文件 2.源文件 二.游戏界面和执行(test.c) 三.函数实现(void game部分,源文件game.c) 1.定义雷二维数组和展示二维数组 2.初始化地雷数组 3.初始化显示的数组 4.显示当前的情况 5.随机放置地雷 6.排雷 ps:深度优先遍历数组 四.结束 一.文件 1.头…

基于图卷积神经网络(GCN)的高光谱图像分类详细教程(含python代码)

目录 一、背景 二、基于卷积神经网络的代码实现 1、安装依赖库 2、建立图卷积神经网络 3、建立数据的边 4、训练模型 5、可视化 三、项目代码 一、背景 图卷积神经网络&#xff08;Graph Convolutional Networks, GCNs&#xff09;在高光谱图像分类中是一种有效的方法…