wait函数与waitpid函数

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值