基于linux下的高并发服务器开发(第二章)- 2.9 waitpid 函数

news2024/10/7 6:41:29

#include <sys/types.h>
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *wstatus, int options);
    功能:回收指定进程号的子进程,可以设置是否阻塞。
    参数:
              - pid:
                      pid > 0 : 表示某个子进程的pid
                      pid = 0 : 表示回收当前进程组的所有子进程    

                                 例如:回收当前进程组(A)的所有子进程:BC都被回收
                      pid = -1 : 表示回收所有的子进程,相当于 wait()  (最常用)

                                 例如:回收A的所有子进程:BCD都被回收


                      pid < -1 : 表示某个进程组的组id的绝对值,回收指定进程组中的子进程

 


             - options:设置阻塞或者非阻塞
                                0 : 阻塞
                                WNOHANG : 非阻塞
            - 返回值:
                          > 0 : 返回子进程的id
                          = 0 : options=WNOHANG, 表示还有子进程活着
                          = -1 :错误,或者没有子进程了

 

waitpid.c 

/*
    #include <sys/types.h>
    #include <sys/wait.h>
    pid_t waitpid(pid_t pid, int *wstatus, int options);
        功能:回收指定进程号的子进程,可以设置是否阻塞。
        参数:
            - pid:
                pid > 0 : 表示某个子进程的pid
                pid = 0 : 表示回收当前进程组的所有子进程    
                pid = -1 : 表示回收所有的子进程,相当于 wait()  (最常用)
                pid < -1 : 表示某个进程组的组id的绝对值,回收指定进程组中的子进程
            - options:设置阻塞或者非阻塞
                0 : 阻塞
                WNOHANG : 非阻塞
            - 返回值:
                > 0 : 返回子进程的id
                = 0 : options=WNOHANG, 表示还有子进程活着
                = -1 :错误,或者没有子进程了
*/
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main() {

    // 有一个父进程,创建5个子进程(兄弟)
    pid_t pid;

    // 创建5个子进程
    for(int i = 0; i < 5; i++) {
        pid = fork();
        if(pid == 0) {
            break;
        }
    }

    if(pid > 0) {
        // 父进程
        while(1) {
            printf("parent, pid = %d\n", getpid());
            sleep(1);

            int st;
            /*
                - pid:
                      pid = -1 : 回收所有的子进程,相当于 wait()  (最常用)
			    - options:设置阻塞或者非阻塞
                      0 : 阻塞
                      WNOHANG : 非阻塞
            */
            // int ret = waitpid(-1, &st, 0);
            int ret = waitpid(-1, &st, WNOHANG);
            
            /*
                pid_t waitpid(pid_t pid, int *wstatus, int options);
                    - 返回值:
                          > 0 : 返回子进程的id
                          = 0 : options=WNOHANG, 表示还有子进程活着
                          = -1 :错误,或者没有子进程了
            */

            if(ret == -1) {
                break;
            } else if(ret == 0) {
                // 说明还有子进程存在
                continue;
            } else if(ret > 0) {
                //说明回收到了具体的子进程的id
                if(WIFEXITED(st)) {
                    // 是不是正常退出
                    printf("退出的状态码:%d\n", WEXITSTATUS(st));
                }
                if(WIFSIGNALED(st)) {
                    // 是不是异常终止
                    printf("被哪个信号干掉了:%d\n", WTERMSIG(st));
                }

                printf("child die, pid = %d\n", ret);
            }
           
        }

    } else if (pid == 0){
        // 子进程
         while(1) {
            printf("child, pid = %d\n",getpid());    
            sleep(1);       
         }
        exit(0);
    }

    return 0; 
}
 gcc waitpid.c -o waitpid

./waitpid

 kill -9 33355

 kill -9 33356

 kill -9 33357

 kill -9 33358

 kill -9 33359

都被干掉以后,回到 int ret = waitpid(-1,&st,WNOHANG);发现没有子进程了,ret返回-1,然后break掉,父进程结束!!!整个程序运行结束

 ​​​​​​​

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

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

相关文章

Versal ACAP在线升级之Boot Image格式

1、简介 Xilinx FPGA、SOC器件和自适应计算加速平台&#xff08;ACAPs&#xff09;通常由多个硬件和软件二进制文件组成&#xff0c;用于启动这些设备后按照预期设计进行工作。这些二进制文件可以包括FPGA比特流、固件镜像、bootloader引导程序、操作系统和用户选择的应…

打造有效的产品帮助中心的关键步骤

在当今竞争激烈的市场中&#xff0c;为产品提供优质的客户支持是至关重要的。而一个有效的产品帮助中心可以成为解决客户问题和提供相关信息的中心。本文将介绍打造一个有效的产品帮助中心的关键步骤&#xff0c;帮助你提升客户体验并增强产品的用户满意度。 1. 选择合适的管理…

记一次ruoyi中使用Quartz实现定时任务

一、首先了解一下Quartz Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目&#xff0c;它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个&#xff0c;百个&#xff0c;甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标…

13matlab数据分析多项式的求值(matlab程序)

1.简述 统计分析常用函数 求最大值 max 和 sum 积 prod 平均值&#xff1a;mean 累加和&#xff1a;cumsum 标准差&#xff1a;std 方差&#xff1a;var 相关系数&#xff1a;corrcoef 排序&#xff1a;sort 四则运算 1.多项式的加减运算就是所对应的系数向量的加减运算&#…

ToT: 利用大语言模型解决需要深思熟虑的问题(下)

ToT 摘要介绍利用大语言模型进行有意识的问题解决1. 思维分解2. 思维产生 G(p,s,k)3. 状态评估V(p,S)4. 搜索算法 实验24游戏1). 任务设置2). 基准3). ToT设置4).结果5). 错误分析 创意写作1). 任务设置2).基准3).ToT设置4).结果 交叉词 相关工作规划和决策自我反省程序引导的L…

常见问题-wp

指定顺序展示富集分析的term 调整热图的label角度 h1ggheatmap(dat[cg1,],cluster_rows T, #是否对行聚类cluster_cols T, #是否对列聚类tree_height_rows 0.28, #行聚类树高度tree_height_cols 0.1, #列聚类树高度annotation_cols group_list, #为列添加分组annotation_c…

软件检测报告对软件产品起的作用和编写原则分析

软件检测报告是一项对软件进行全面测试和评估的结果总结&#xff0c;通过对软件的功能、性能、安全性等方面的测试&#xff0c;以及通过分析软件的可靠性和稳定性&#xff0c;来评估软件的质量和合规性。 一、软件检测报告对软件产品起到的作用 1、提供一个全面的评估和分析软…

认识主被动无人机遥感数据、预处理无人机遥感数据、定量估算农林植被关键性状、期刊论文插图精细制作与Appdesigner应用开发

目录 第一章、认识主被动无人机遥感数据 第二章、预处理无人机遥感数据 第三章、定量估算农林植被关键性状 第四章、期刊论文插图精细制作与Appdesigner应用开发 更多推荐 遥感技术作为一种空间大数据手段&#xff0c;能够从多时、多维、多地等角度&#xff0c;获取大量的…

NAT 地址转换路由器配置命令(华为路由器)

#AR1路由器配置 # acl 2000 rule permit source any # interface GigabitEthernet0/0/1 nat outbound 2000 ip address 1.1.1.1 24 # interface GigabitEthernet0/0/0 ip address 172.16.1.1 255.255.255.0 # ip route-static 0.0.0.0 0.0.0.0 1.1.1.2 ip route-static …

工业平板电脑具备IP65防护等级,防尘、防水、防震

随着科技的快速发展&#xff0c;工业平板电脑已经成为了我们日常生活中不可或缺的一部分。而在不同领域中&#xff0c;各行各业的专业需求也在不断增长。针对工业领域的专业需求&#xff0c;工业平板电脑应运而生。它以出色的外观设计、强大的性能和丰富的功能&#xff0c;为工…

【iOS】对象的本质探索

OC对象的底层结构 问题&#xff1a;一个NSObject对象在内存中是如何布局的&#xff1f;NSObject的内存布局1 通过 lldb命令 窥探NSObject内存布局2 通过 View Memory 窥探NSObject内存布局3 通过 底层函数API 窥探NSObject内存布局总结 通过继承关系进一步了解NSObject1 运行项…

【SwitchyOmega】SwitchyOmega 安装及使用

文章目录 安装教程使用教程 安装教程 SwitchyOmega 谷歌商店下载链接&#xff1a;https://chrome.google.com/webstore/detail/proxy-switchyomega/padekgcemlokbadohgkifijomclgjgif?hlen-US 在谷歌商店搜索 SwitchyOmega&#xff0c; 选择 Proxy SwitchyOmega 点击 Add t…

刷题记录-1蓝桥公园

蓝桥杯刷题记录 记录蓝桥杯刷题每一天 python解题 import sysn, m, q map(int, input().split()) dp [[sys.maxsize]*(n1) for _ in range(n1)]for _ in range(m):u, v, w map(int, input().split())dp[u][v] dp[v][u] min(dp[u][v], w)for k in range(1, n1):for i in …

常见的网络攻击

​ 1.僵木蠕毒 攻击业内习惯把僵尸网络、木马、蠕虫、感染型病毒合称为僵木蠕毒。从攻击路径来看&#xff0c;蠕虫和感染型病毒通过自身的能力进行主动传播&#xff0c;木马则需要渠道来进行投放&#xff0c;而由后门木马&#xff08;部分具备蠕虫或感染传播能力&#xff09;构…

我在VScode学Java类与对象(Java构造方法 、JavaBean)第二辑 + VScode怎么在预览模式中点击另外一个文件,不会被替换掉

我的个人博客主页&#xff1a;如果’真能转义1️⃣说1️⃣的博客主页 关于Java基本语法学习---->可以参考我的这篇博客&#xff1a;《我在VScode学Java》 关于Java数组学习、JVM中的堆和栈—>可以参考我的这篇文章我在VScode学Java(Java一维数组、二维数组、JVM中的堆和栈…

VSCode种git rebase分支冲突解决无法继续rebase

情景&#xff1a; 常规来说我们git开分支开发完新功能之后&#xff0c;提交之前rebase dev分支&#xff0c;然后合并到dev上算是开发完成。 问题还原&#xff1a; 在开发完之后执行如下指令&#xff1a; 1.执行变基操作&#xff1a;git rebase dev。 //这一步出现冲突vscode上…

SQL中为何时常见到 where 1=1?

你是否曾在 SELECT 查询中看到过 WHERE 11 条件。我在许多不同的查询和许多 SQL 引擎中都有看过。这条件显然意味着 WHERE TRUE&#xff0c;所以它只是返回与没有 WHERE 子句时相同的查询结果。此外&#xff0c;由于查询优化器几乎肯定会删除它&#xff0c;因此对查询执行时间没…

AtcoderABC250场

A - Adjacent SquaresA - Adjacent Squares 题目大意 给定一个由H行W列组成的网格。令(i,j)表示从上到下第i行&#xff0c;从左到右第j列的方块。找出与方块(R,C)共享边的方块数量。 这里&#xff0c;方块(a,b)和方块(c,d)被称为共享边&#xff0c;当且仅当|a-c||b-d|1。 思路…

网站测试自动化系统

首先先分解一下执行测试用例的步骤&#xff0c;编码实现每一个步骤&#xff0c;然后使用批处理的形式将工作流串起来&#xff1a;&#xff08;当然啦&#xff0c;我们也可以使用.NET里面的Workflow来实现&#xff0c;只不过那样的话我们需要格外添加一个命令—安装.NET Framewo…

数据排布与跨距对齐

1 数据排布 1.1 数据排布的概念 在深度学习框架中&#xff0c;特征图通常以四维数组的形式呈现&#xff0c;这四个维度分别是&#xff1a;批量大小N&#xff0c;特征图通道数C&#xff0c;特征图高度H&#xff0c;特征图宽度W。数据排布&#xff08;Layout&#xff09;指的就…