首页 > 系统相关 >Linux系统下进程回收--waitpid函数

Linux系统下进程回收--waitpid函数

时间:2023-04-02 11:55:05浏览次数:35  
标签:-- child pid process Linux 进程 include waitpid

waitpid函数的作用和wait函数的作用相同,只是有些参数不同。
在Linux终端下输入命令:man 2 waitpid查看waitpid函数的具体描述:

SYNOPSIS
       #include <sys/types.h>
       #include <sys/wait.h>

        pid_t waitpid(pid_t pid, int *wstatus, int options);
            作用:回收指定进程号的子进程,可以设置非阻塞(默认阻塞)。
            参数:
                pid_t pid:
                    < -1:回收某个进程组的组id的绝对值,回收指定进程组的子进程
                    -1:回收所有子进程,相当于wait()        //最常用
                    0:回收当前进程组的所有子进程
                    > 0:某个子进程的id

                The value of pid can be:

                    < -1   meaning wait for any child process whose process group ID is equal to the absolute value of pid.

                    -1     meaning wait for any child process.

                    0      meaning wait for any child process whose process group ID is equal to that of the calling process.

                    > 0    meaning wait for the child whose process ID is equal to the value of pid.
                
                
                int *wstatus:进程退出时的状态信息,传入的是一个int类型的地址,传出参数。
                    返回值:
                        - 成功:返回被回收的子进程的id
                        - 失败:返回-1(调用函数失败,或者所有子进程都被回收)

                int options:设置阻塞或非阻塞
                    0:阻塞
                    WNOHANG:非阻塞
            返回值:
                > 0:返回子进程的id
                = 0:options=WNOHANG,表示还有子进程没有退出(在非阻塞的情况下)
                -1 :错误,或者没有子进程

        
        WIFEXITED(wstatus)
              returns true if the child terminated normally, that is, by calling exit(3) or _exit(2), or by  returning  from
              main().

       WEXITSTATUS(wstatus)
              returns  the  exit  status of the child.  This consists of the least significant 8 bits of the status argument
              that the child specified in a call to exit(3) or _exit(2) or as the argument for a return statement in main().
              This macro should be employed only if WIFEXITED returned true.

       WIFSIGNALED(wstatus)
              returns true if the child process was terminated by a signal.

下面是waitpid函数的简单案例:

#include <sys/types.h>
#include <sys/wait.h>
#include <iostream>
#include <unistd.h>
#include <stdlib.h>

using std::cout;
using std::endl;

namespace waitpid_test{
    void test(){

        //有一个父进程创建5个子进程
        pid_t pid;

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

        if(pid>0){
            //父进程
            while(1){
                cout<<"parent,pid:"<<getpid()<<endl;
                sleep(1);
                //int ret = wait(NULL);
                int st;
                
                //阻塞
                //int ret = waitpid(-1,&st,0);

                //非阻塞
                int ret = waitpid(-1,&st,WNOHANG);


                if(ret == -1)
                    break;
                
                else  if(ret == 0)
                    //说明还有子进程存在
                    continue;
                else if(ret > 0){
                
                    if(WIFEXITED(st))
                        //是不是正常退出
                        cout<<"退出的状态码:"<<WEXITSTATUS(st)<<endl;
                    if(WIFSIGNALED(st))
                        //是不是异常终止
                        cout<<"被哪个信号干掉了:"<<WTERMSIG(st)<<endl;
                    cout<<"child has died,pid:"<<ret<<endl;
                }

                 
                
                
            }
        }
        else if(pid == 0){
            //子进程
            while(1){
            cout<<"child, pid:"<<getpid()<<endl;
            sleep(1);    
            }
            exit(0);
        }
    }

}

int main(){

    //wait_test::test();
    waitpid_test::test();
    return 0;
}

标签:--,child,pid,process,Linux,进程,include,waitpid
From: https://www.cnblogs.com/nakjima/p/17275902.html

相关文章

  • 876. 链表的中间结点
    876.链表的中间结点给你单链表的头结点head,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。示例1:输入:head=[1,2,3,4,5]输出:[3,4,5]解释:链表只有一个中间结点,值为3。示例2:输入:head=[1,2,3,4,5,6]输出:[4,5,6]解释:该链表有两个......
  • DockerFile
    DockerFile构建镜像首先通过一张图来了解Docker镜像、容器和Dockerfile三者之间的关系。通过上图可以看出使用Dockerfile定义镜像,运行镜像启动容器。Dockerfile概念Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些......
  • 【Linux Centos】如何卸载自带的python和yum以及卸载后如何重新安装yum
    【LinuxCentos】如何卸载自带的python和yum以及卸载后如何重新安装yum注意如果不是必要情况,请不要卸载服务器自带的python,因为yum等命令都会用到python库,卸载以后可能造成不良后果。如果只是觉得系统python版本不合适,想安装新版本,建议安装anaconda或miniconda,在不同的环境中使......
  • AcWing 278. 数字组合
    给定 N 个正整数 A1,A2,…,AN,从中选出若干个数,使它们的和为 M,求有多少种选择方案。输入格式第一行包含两个整数 N 和 M。第二行包含 N 个整数,表示 A1,A2,…,AN。输出格式包含一个整数,表示可选方案数。数据范围1≤N≤100,1≤M≤10000,1≤Ai≤1000,答案保证在int......
  • Location地址栏对象
         ......
  • springboot-监听器
    监听器ApplicationListener可以实现这个接口时传入对应的监听器,用于监听该事件比如:实现ApplicationListener<ContextRefreshedEvent>接口,重写onApplicationEvent方法,将ContextRefreshedEvent对象传进去。如果我们想在加载或刷新应用上下文时,也重新刷新下我们预加载的资源......
  • JavaIO流:主要知识点
    JavaIO流:主要知识点File类介绍:java.io.File类:文件和文件目录路径的抽象表示形式,与平台无关。File能新建、删除、重命名文件和目录,但File不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。想要在Java程序中表示一个真实存在的文件或目录,那么必......
  • .net reactor 学习系列(五)---.net reactor针对De4Dot脱壳工具的应对
     De4Dot是一个专门反混淆.net程序的一个工具,支持对于以下工具混淆过的代码的清理:Agile.NET(akaCliSecure)Babel.NETCodeFortCodeVeilCodeWallCryptoObfuscatorDeepSeaObfuscatorDotfuscator.NETReactorEazfuscator.NETGoliath.NETILProtectorMaxtoCodeMPRESSRummageSkater.N......
  • 组会小结20230328
    1、《RobustRGB-DFusionforSaliencyDetection》(1)引入了一种分层注意力(LWA)来自动调整不同层之间的深度图贡献,动态确定每层的具体融合策略。(2)设计了一个三叉戟空间注意力(TSA),通过聚合更广泛的空间上下文特征以解决深度错位问题。 具体步骤:RFnet网络主要由分层注意LWA和......
  • 电子逻辑
    2、第二层小规模集成电路实现的基本逻辑功能一一逻辑门:包括:与、或、非、与非、或非、同或、异或等。3、第三层:中小规模集成电路实现的复杂逻辑器件:1)组合逻辑电路——全加器、译码/编码器、三态门等;全加器:完成一位二进制数的运算;译码/编码器:编码信号转换;三态门:控制线路连接状态。2......