Linux多进程中wait()函数学习

本文详细介绍了如何在C语言中使用Linuxwait()函数,包括其功能、系统调用原理,以及如何通过waitpid阻塞等待子线程的终止并获取其退出状态。还展示了在子进程被外部中断时的异常处理情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

wait()函数是Linux/Unix系统里的一个系统级函数,在C语言中通过#include <sys/wait.h>包含该系统调用的头文件。
想要查看如何使用这个函数,可以在终端中输入:

man 2 wait

如下图:
在这里插入图片描述
wait系统调用可以让父线程阻塞等待子线程的终止,并且可以获取子线程的终止状态信息。
下面举例说明如何使用它。

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

int main()
{
    pid_t pid = fork();
    if(pid < 0)
    {
        perror("fork");
        exit(1);
    }

    if(pid == 0)
    {
        int n = 3;
        while(n > 0)
        {
            printf("this is child process, pid[%d]\n", getpid());
            sleep(5);
            --n;
        }
        exit(3);
    }
    else
    {
        int stat_val;
        waitpid(pid, &stat_val, 0);
        if (WIFEXITED(stat_val))
        {
            printf("Chiled exit with code %d\n", WEXITSTATUS(stat_val));
        }
        else if (WIFSIGNALED(stat_val))
        {
            printf("Child terminated abnormally, signal[%d]\n", WTERMSIG(stat_val));
        }
    }

    return 0;
}

程序正常的输出是:

zhanghaodeMacBook-Pro:cpp_excise zhanghao$ g+./a.out
this is child process, pid[12960]
this is child process, pid[12960]
this is child process, pid[12960]
Chiled exit with code 3

如果执行过程中,再起一个终端,把子进程杀死,如下:

kill -9 12788 //子进程ID每次会变,可以直接从打印看出来,或者通过ps u查当前用户进程

则会走到异常情况,此时后台的打印会是这样:

zhanghaodeMacBook-Pro:cpp_excise zhanghao$ ./a.out 
this is child process, pid[12788]
this is child process, pid[12788] //此时在另一个终端敲了kill -9 12788
Child terminated abnormally, signal[9]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码到程攻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值