迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > C语言 >

C 语言中的 wait 函数

作者:迹忆客 最近更新:2023/03/28 浏览次数:

本文将演示关于如何使用 C 语言中的 wait 函数的多种方法。


在 C 语言中使用 wait 函数来等待子进程的状态变化

wait 函数是符合 POSIX 标准的系统调用的封装器,定义在 <sys/wait.h> 头文件中。该函数用于等待子进程的程序状态变化,并检索相应的信息。wait 通常在创建新子进程的 fork 系统调用之后调用。wait 调用会暂停调用程序,直到它的一个子进程终止。

用户应该将代码结构化,使调用进程和子进程有两条不同的路径。通常用 if...else 语句来实现,该语句评估 fork 函数调用的返回值。注意 fork 在父进程中返回子进程 ID,一个正整数,在子进程中返回 0。如果调用失败,fork 将返回-1。

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


int main() {
    pid_t c_pid = fork();

    if (c_pid == -1) {
        perror("fork");
        exit(EXIT_FAILURE);
    }

    if (c_pid == 0) {
        printf("printed from child process %d", getpid());
        exit(EXIT_SUCCESS);
    } else {
        printf("printed from parent process %d\n", getpid());
        wait(NULL);
    }

    exit(EXIT_SUCCESS);
}

在 C 语言中使用 waitpid 函数来等待特定子进程的状态变化

waitpidwait 函数的一个略微增强的版本,它提供了等待特定子进程和修改返回触发行为的功能。waitpid 除了子进程被终止的情况外,还可以返回子进程是否已经停止或继续。

在下面的例子中,我们从子进程调用 pause 函数,子进程进入睡眠状态,直到收到信号。另一方面,父进程调用 waitpid 函数,暂停执行,直到子进程返回。并利用宏 WIFEXITEDWIFSIGNALED 分别检查子进程是正常终止还是被信号终止,然后将相应的状态信息打印到控制台。

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


int main() {
    pid_t child_pid, wtr;
    int wstatus;

    child_pid = fork();
    if (child_pid == -1) {
        perror("fork");
        exit(EXIT_FAILURE);
    }

    if (child_pid == 0) {
        printf("Child PID is %d\n", getpid());
        pause();
        _exit(EXIT_FAILURE);
    } else {
        wtr = waitpid(child_pid, &wstatus, WUNTRACED | WCONTINUED);
        if (wtr == -1) {
            perror("waitpid");
            exit(EXIT_FAILURE);
        }

        if (WIFEXITED(wstatus)) {
            printf("exited, status=%d\n", WEXITSTATUS(wstatus));
        } else if (WIFSIGNALED(wstatus)) {
            printf("killed by signal %d\n", WTERMSIG(wstatus));
        }
    }
    exit(EXIT_SUCCESS);
}

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 C 语言中使用 typedef enum

发布时间:2023/05/07 浏览次数:181 分类:C语言

本文介绍了如何在 C 语言中使用 typedef enum。使用 enum 在 C 语言中定义命名整数常量 enum 关键字定义了一种叫做枚举的特殊类型。

C 语言中的静态变量

发布时间:2023/05/07 浏览次数:151 分类:C语言

本文介绍了如何在 C 语言中使用静态变量。在 C 语言中使用 static 变量在函数调用之间保存变量值

C 语言中生成随机数

发布时间:2023/05/07 浏览次数:64 分类:C语言

本文演示了如何在 C 语言中生成随机数。使用 rand 和 srand 函数在 C 语言中生成随机数

C 语言中的 i++ 与++i

发布时间:2023/05/07 浏览次数:83 分类:C语言

本文演示了如何在 C 语言中使用前缀增量与后缀增量运算符。C 语言中++i 和 i++ 记号的主要区别

C 语言中获取当前工作目录

发布时间:2023/05/07 浏览次数:182 分类:C语言

本文演示了如何在 C 语言中获取当前工作目录。使用 getcwd 函数获取当前工作目录的方法

C 语言中的位掩码

发布时间:2023/05/07 浏览次数:126 分类:C语言

本文介绍了如何在 C 语言中使用位掩码。使用 struct 关键字在 C 语言中定义位掩码数据

C 语言中的排序函数

发布时间:2023/05/07 浏览次数:181 分类:C语言

本文演示了如何在 C 语言中使用标准库排序函数。使用 qsort 函数对 C 语言中的整数数组进行排序

C 语言中的 extern 关键字

发布时间:2023/05/07 浏览次数:114 分类:C语言

本文介绍了如何在 C 语言中使用 extern 关键字。C 语言中使用 extern 关键字来声明一个在其他文件中定义的变量

C 语言中的 #ifndef

发布时间:2023/05/07 浏览次数:186 分类:C语言

本文介绍了如何在 C 语言中使用 ifndef。在 C 语言中使用 ifndef 保护头文件不被多次包含 C 语言中的头文件用于定义同名源文件中实现的函数的接口。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便