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);
    }
}
相关推荐
古希腊数通小白(ip在学)3 分钟前
HCIA实现不同vlan间的通信
linux·服务器·网络
yi.Ist14 分钟前
数据结构 —— 键值对 map
数据结构·算法
s1533517 分钟前
数据结构-顺序表-猜数字
数据结构·算法·leetcode
半桔17 分钟前
【Linux手册】从接口到管理:Linux文件系统的核心操作指南
android·java·linux·开发语言·面试·系统架构
Coding小公仔19 分钟前
LeetCode 8. 字符串转换整数 (atoi)
算法·leetcode·职场和发展
GEEK零零七25 分钟前
Leetcode 393. UTF-8 编码验证
算法·leetcode·职场和发展·二进制运算
禁默25 分钟前
Linux Vim 编辑器详解:从入门到进阶(含图示+插件推荐)
linux·vim·excel
DoraBigHead1 小时前
小哆啦解题记——异位词界的社交网络
算法
许白掰2 小时前
Linux入门篇学习——Linux 工具之 make 工具和 makefile 文件
linux·运维·服务器·前端·学习·编辑器
木头左3 小时前
逻辑回归的Python实现与优化
python·算法·逻辑回归