wait函数() waitpid函数()

wait函数

/*
    #include <sys/types.h>
    #include <sys/wait.h>
    pid_t wait(int *wstatus);
    功能:等待任意一个子进程结束,如果子进程结束或者中断了,那么就回收他的资源
    参数: wstatus
        进程退出时的状态信息,传入的是一个int类型的地址,传出参数
    返回值:
        成功:返回了被回收的子进程的ID
        失败:-1(所有的子进程结束了,调用函数失败了)

    调用wait函数的进程会被挂起(阻塞),知道他的一个子进程退出或者收到一个不能被忽略的信号才被唤醒
    如果没有子进程,函数立刻返回-1,如果子进程全部结束,也返回-1
*/
#include<sys/wait.h>
#include<sys/types.h>
#include<stdio.h>
#include<unistd.h>
int main() {
    pid_t pid;
    for(int i = 0; i < 5; i++) {
        pid = fork();
        if(pid == 0) {
            break;
        }
    }

    if(pid > 0) {
        while(1) {
            printf("父, pid = %d\n", getpid());
            int ret = wait(NULL);
            printf("child die, pid = %d", ret);
            sleep(1); 
        }            
    } 
    else if(pid == 0) {
        while(1) {
            printf("儿, pid = %d \n", getpid());
            sleep(1);
        }
        
    }
}
bash 复制代码
#include<sys/wait.h>
#include<sys/types.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main() {
    pid_t pid;
    for(int i = 0; i < 5; i++) {
        pid = fork();
        if(pid == 0) {
            break;
        }
    }

    if(pid > 0) {
        while(1) {
            printf("父, 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", ret);
            sleep(1); 
        }            
    } 
    else if(pid == 0) {
        //while(1) {
            printf("儿, pid = %d \n", getpid());
            sleep(1);
        //}
        exit(0);
    }
}

因为exit(0)所以退出的状态码0 如果exit(2)那么就是2

如果通过kill -9 杀死进程 那么宏WIFSIGNALED就生效 输出那句话

waitpid函数

cpp 复制代码
/*
    #include <sys/types.h>
    #include <sys/wait.h>
    pid_t wait(int *wstatus);
    pid_t waitpid(pid_t pid, int *wstatus, int options);
    功能:等待任意一个子进程结束,如果子进程结束或者中断了,那么就回收他的资源
    参数: 
        pid:
            pid > 0:某个子进程的pid
            pid = 0:回收当前进程组的所有子进程
            pid = -1:回收所有的子进程 相当于wait()
            pid < -1: 某个进程组的组id的绝对值,回收指定进程组中的子进程
        wstatus
        进程退出时的状态信息,传入的是一个int类型的地址,传出参数
        options:
            0:表示阻塞的
            WNOHANG:非阻塞
    返回值:
        > 0:返回了子进程的ID
        = 0:options = WNOHANG, 表示还有子进程活着
        = -1;表示错误或者没有子进程

    调用wait函数的进程会被挂起(阻塞),知道他的一个子进程退出或者收到一个不能被忽略的信号才被唤醒
    如果没有子进程,函数立刻返回-1,如果子进程全部结束,也返回-1
*/
#include<sys/wait.h>
#include<sys/types.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main() {
    pid_t pid;
    for(int i = 0; i < 5; i++) {
        pid = fork();
        if(pid == 0) {
            break;
        }
    }

    if(pid > 0) {
        while(1) {
            sleep(1); 
            printf("父, pid = %d\n", getpid());
            // int ret = wait(NULL);
            int st;
            int ret = waitpid(-1, &st, WNOHANG);
            if(ret == -1) break;
            else 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", ret);
            }     
        }            
    } 
    else if(pid == 0) {
        while(1) {
            printf("儿, pid = %d \n", getpid());
            sleep(1);
        }
        exit(0);
    }
}
相关推荐
程序员南飞1 小时前
ps aux | grep smart_webrtc这条指令代表什么意思
java·linux·ubuntu·webrtc
StrokeAce1 小时前
linux桌面软件(wps)内嵌到主窗口后的关闭问题
linux·c++·qt·wps·窗口内嵌
hsling松子4 小时前
使用PaddleHub智能生成,献上浓情国庆福
人工智能·算法·机器学习·语言模型·paddlepaddle
dengqingrui1235 小时前
【树形DP】AT_dp_p Independent Set 题解
c++·学习·算法·深度优先·图论·dp
C++忠实粉丝5 小时前
前缀和(8)_矩阵区域和
数据结构·c++·线性代数·算法·矩阵
热爱嵌入式的小许5 小时前
Linux基础项目开发1:量产工具——显示系统
linux·运维·服务器·韦东山量产工具
ZZZ_O^O5 小时前
二分查找算法——寻找旋转排序数组中的最小值&点名
数据结构·c++·学习·算法·二叉树
CV-King6 小时前
opencv实战项目(三十):使用傅里叶变换进行图像边缘检测
人工智能·opencv·算法·计算机视觉
代码雕刻家6 小时前
数据结构-3.9.栈在递归中的应用
c语言·数据结构·算法
雨中rain6 小时前
算法 | 位运算(哈希思想)
算法