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);
    }
}
相关推荐
vibecoding日记5 小时前
双非如何快速入职字节等大厂大模型?真实案例分析:推理优化和投机解码
算法·求职·大模型工程师
yszaygr21387 小时前
Verilog参数化游程编码RLE模块
算法
望易8 小时前
刚设计的大模型架构-双域耦合认知框架
算法·架构
复杂网络12 小时前
多个 Claude Code 与多个 Codex 协同工作:设计与实现方案
算法
orion571 天前
Missing Semester Class1:course overview and introduction of shell
linux
HjhIron1 天前
面试常客:字符串算法从入门到进阶
算法·面试
吴佳浩1 天前
DeepSeek DSpark:Confidence-Scheduled Speculative Decoding 技术解析
人工智能·算法·deepseek
用户120487221611 天前
Linux驱动编译与加载
linux·嵌入式
触底反弹1 天前
🧠 搞懂 Token,才算真正入门大模型——从分词原理到 Embedding 语义实战
javascript·人工智能·算法