wait函数与waitpid函数

2023-09-22 10:07:58

1.函数介绍 

2.wait函数 

#include <sys/types.h>

#include <sys/wait.h>

       pid_t wait(int *wstatus);

       功能:等待任意一个子进程结束,如果该子进程结束了,此函数会回收子进程的资源

       参数:

            -int *wstatus:进程退出时的状态信息,传入的是一个int类型的地址,传出参数

        返回值:

            -成功:返回被回收的子进程的id;

            -失败:-1(所有子进程都结束/调用函数失败)

        调用wait函数的进程会被挂起(阻塞),直到它的一个子进程退出或者收到一个不能被忽略的信号时才被唤醒(相当于继续往下执行);

        如果没有子进程了,函数立刻返回,返回-1;

        如果子进程都已经结束了,也会立即返回-1.

#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <unistd.h>
int main() {
    //有一个父进程,创建5个子进程(兄弟)
    pid_t pid;
    for(int i = 0; i < 5; i++) {
        pid = fork();
        if(pid == 0) {
            break;
        }
    }
    if(pid > 0) {
        //父进程
        while(1) {
            printf("parent, pid = %d\n", getpid());
            int ret = wait(NULL);
            if(ret == -1) {
                break;
            }
            printf("child die, pid = %d\n", ret);
            sleep(1);
        }
    } else if(pid == 0) {
        while(1) {
            printf("child, pid = %d\n", getpid());
            sleep(1);
        }
    }
    return 0;
}

#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <unistd.h>
#include<stdlib.h>
int main() {
    //有一个父进程,创建5个子进程(兄弟)
    pid_t pid;
    for(int i = 0; i < 5; i++) {
        pid = fork();
        if(pid == 0) {
            break;
        }
    }
    if(pid > 0) {
        //父进程
        while(1) {
            printf("parent, pid = %d\n", getpid());
            // int ret = wait(NULL);
            int st;
            int ret = wait(&st);
            if(ret == -1) {
                break;
            }
            if(WIFEXITED(st)) {
                //是不是正常退出
                printf("退出的状态码:%d\n", WEXITSTATUS(st));
            }
            if(WIFSIGNALED(st)) {
                //是不是异常终止
                printf("被哪个信号干掉了: %d\n", WTERMSIG(st));
            }
            printf("child die, pid = %d\n", ret);
            sleep(1);
        }
    } else if(pid == 0) {
        //while(1) {
            printf("child, pid = %d\n", getpid());
            sleep(1);
        //}
        exit(0);
    }
    return 0;
}

#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <unistd.h>
#include<stdlib.h>
int main() {
    //有一个父进程,创建5个子进程(兄弟)
    pid_t pid;
    for(int i = 0; i < 5; i++) {
        pid = fork();
        if(pid == 0) {
            break;
        }
    }
    if(pid > 0) {
        //父进程
        while(1) {
            printf("parent, pid = %d\n", getpid());
            // int ret = wait(NULL);
            int st;
            int ret = wait(&st);
            if(ret == -1) {
                break;
            }
            if(WIFEXITED(st)) {
                //是不是正常退出
                printf("退出的状态码:%d\n", WEXITSTATUS(st));
            }
            if(WIFSIGNALED(st)) {
                //是不是异常终止
                printf("被哪个信号干掉了: %d\n", WTERMSIG(st));
            }
            printf("child die, pid = %d\n", ret);
            sleep(1);
        }
    } else if(pid == 0) {
        while(1) {
            printf("child, pid = %d\n", getpid());
            sleep(1);
        }
        exit(0);
    }
    return 0;
}

3.waitpid函数 

#include <sys/types.h>

       #include <sys/wait.h>

       pid_t waitpid(pid_t pid, int *wstatus, int options);

       功能:回收指定进程号的子进程,可以设置是否阻塞

       参数:

            -pid_t pid:

                pid > 0:某个子进程的pid

                pid = 0:回收当前进程组的所有子进程

                pid= -1:回收所有的子进程,相当于wait()

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

            -int *wstatus:进程退出时的状态信息,传入的是一个int类型的地址,传出参数

            -int options:设置阻塞或者非阻塞

                0:阻塞

                WNOHANG:非阻塞

        返回值:

            ->0:返回被回收的子进程的id;

            =0:options = NOHANG,表示还有子进程

            -失败:-1(所有子进程都结束/调用函数失败)

       

        调用wait函数的进程会被挂起(阻塞),直到它的一个子进程退出或者收到一个不能被忽略的信号时才被唤醒(相当于继续往下执行);

        如果没有子进程了,函数立刻返回,返回-1;

        如果子进程都已经结束了,也会立即返回-1.

#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <unistd.h>
#include<stdlib.h>
int main() {
    //有一个父进程,创建5个子进程(兄弟)
    pid_t pid;
    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;
            //int ret = waitpid(-1, &st, 0);
            int ret = waitpid(-1, &st, WNOHANG);
            if(ret == -1) {
                break;
            }
            if(ret == 0) {
                //说明还有子进程存在
                continue;
            } else if (ret > 0) {
                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;
}

更多推荐

【外汇天眼】外汇交易的优势:公平、低成本和高流动性

外汇交易的优势体现在其公平性以及众多其他方面。让我们一起重新审视这些优势,以更清晰地了解外汇市场的吸引力。1、低成本交易:与其他金融市场不同,外汇市场没有佣金、清算费、交易所费、政府费或经纪费。大多数外汇经纪人通过点差服务获得回报。这意味着交易者可以更高效地管理交易成本。2、无固定手数:与期货市场不同,外汇市场允许交易

【2591. 将钱分给最多的儿童】

来源:力扣(LeetCode)描述:给你一个整数money,表示你总共有的钱数(单位为美元)和另一个整数children,表示你要将钱分配给多少个儿童。你需要按照如下规则分配:所有的钱都必须被分配。每个儿童至少获得1美元。没有人获得4美元。请你按照上述规则分配金钱,并返回最多有多少个儿童获得恰好8美元。如果没有任何分配

【Vue】利用vue.js、vuex和vue router组件、element ui plus组件来创建基于知识图谱的智能问答系统的前端部分

Vue.js是一个流行的JavaScript框架,用于构建用户界面。它基于MVVM模式,可以轻松地创建组件化应用程序。Vuex是Vue.js的官方状态管理库,用于管理Vue.js应用程序中的数据流。它提供了一种集中式的方式来管理应用程序中的所有组件的状态,并且它可以让你轻松地实现可预测的状态变化。VueRouter是V

PostgreSQL serial类型

serial类型和序列postgresql序列号(SERIAL)类型包括smallserial(smallint,short),serial(int)bigserial(bigint,longlongint)不管是smallserial,serial还是bigserial,其范围都是(1,922337203685477

Python实现简单的爬虫功能

目录一、导入必要的库和模块二、发送HTTP请求三、解析HTML文件四、存储数据五、完整代码示例六、注意事项总结随着互联网的普及,信息获取的需求越来越大,而爬虫技术则成为了一种常见的信息获取方式。在Python中,有许多库和模块可以用于实现简单的爬虫功能。本文将介绍如何使用Python实现简单的爬虫功能,包括导入必要的库

std::thread简单使用

std::thread是C++标准库中用于多线程编程的类。它允许你创建和管理线程,使程序能够并发执行不同的任务。以下是关于std::thread的详细介绍以及几个示例说明:创建线程你可以使用std::thread构造函数创建新的线程,并将要执行的函数传递给它。以下是创建线程的基本示例:#include<iostream

c++ 学习 之 静态存储区域 和常量字符串的联系

什么是静态存储区域静态存储区域(StaticStorageArea)是计算机程序运行时用于存储全局变量、静态变量和字符串字面值等数据的一种特殊内存区域。静态存储区域具有以下特点:生存周期:静态存储区域中的数据在程序启动时分配,在程序结束时才会释放。这意味着这些数据在整个程序的执行期间都存在,不会随着函数的调用而创建或销

备战2024秋招面试题-查看Linux的进程

前言:\textcolor{Green}{前言:}前言:💞快秋招了,那么这个专栏就专门来记录一下,同时呢整理一下常见面试题💞部分题目来自自己的面试题,部分题目来自网络整理给我冲学习目标:面试题:算法题:完成?学习目标:Linux有哪些命令查看Linux的进程算法题:排序链表面试题:Linux有那些命令?文件和目录管

四川百幕晟科技:抖店精选联盟怎么使用?

近年来,电商平台的兴起让很多人纷纷加入进来,希望通过在网上销售产品来赚取更多的利润。在这个竞争激烈的市场中,如何找到稳定的渠道来推广自己的产品成为了每个卖家的追求。抖店精选联盟是一个不错的选择,可以帮助卖家快速提升销量。1.如何使用抖店精选联盟?1.注册成为联盟会员首先,您需要在抖店精选联盟官网注册。注册过程比较简单,

Azure Kubernetes Service中重写规则踩坑小记录

前言最近在做标准产品在不同云平台中的部署验证,有幸体验了一下微软的Azure。负责采购的运维部门这次采用了ApplicationGateway来搭配AKS(AzureKubernetesService)对外暴露服务,正好借着这个机会来体验一下ApplicationGateway。应用场景域名api.demo.com指向

探索科技地图:通向未来的科技之路

科技地图是一张连接现实与未来的路线图,它标示着创新的方向和科技的潜力。在这个信息爆炸的时代,我们深陷于新技术和新理念的海洋中,科技地图为我们提供了一颗指南针,帮助我们更好地了解和探索科技的前沿。科技地图的起源:科技的演化之路科技地图并非一夜之间出现,它承载着几十年科技发展的积淀。从最早的计算机革命,到移动互联网的崛起,

热文推荐