详解C语言中的wait()函数和waitpid()函数

yizhihongxing

详解C语言中的wait()函数和waitpid()函数

在Linux系统编程中,wait()和waitpid()函数可以用来等待进程的终止,以及获得进程的退出状态。在本文中,我们将介绍这两个函数的使用方法以及相应的示例代码。

wait()函数

wait()函数会暂停当前进程的执行,直到它的子进程结束为止。如果子进程已经终止,wait()函数会立即返回,否则将一直阻塞等待,直到子进程终止。

wait()函数的原型如下:

#include <sys/wait.h>
pid_t wait(int *status);

其中,参数status是一个整型指针,用于存储子进程的退出状态。

下面是一个简单的示例程序,它先派生了一个子进程,在子进程中调用exit()函数退出,然后父进程调用wait()函数等待子进程的结束,并获取子进程的退出状态。

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

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

    if (pid < 0) {
        perror("fork");
        exit(EXIT_FAILURE);
    } else if (pid == 0) {  // child process
        printf("child process\n");
        exit(EXIT_SUCCESS);
    } else {  // parent process
        printf("parent process\n");
        int status;
        wait(&status);
        printf("child exit status: %d\n", status);
    }

    return 0;
}

输出结果如下:

parent process
child process
child exit status: 0

waitpid()函数

waitpid()函数的功能和wait()函数类似,都是等待指定进程的结束。但waitpid()函数比wait()函数更加灵活,可以指定等待的进程和等待的选项。

waitpid()函数的原型如下:

#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *status, int options);

其中,pid参数是等待的进程ID,status参数与wait()函数的status参数含义相同,options参数指定等待的选项,通常为0。

下面是一个示例程序,演示了waitpid()函数的用法。该程序首先创建一个子进程,然后父进程等待子进程结束,而子进程则休眠5秒后退出。

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

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

    if (pid < 0) {
        perror("fork");
        exit(EXIT_FAILURE);
    } else if (pid == 0) {  // child process
        printf("child process sleeping...\n");
        sleep(5);
        printf("child process exiting...\n");
        exit(EXIT_SUCCESS);
    } else {  // parent process
        printf("parent process waiting...\n");
        int status;
        waitpid(pid, &status, 0);
        printf("child process exit status: %d\n", status);
    }

    return 0;
}

输出结果如下:

parent process waiting...
child process sleeping...
child process exiting...
child process exit status: 0

总结

wait()函数和waitpid()函数都可以用于等待子进程结束,并获取子进程的退出状态。waitpid()函数比wait()函数更加灵活,可以指定等待的进程和等待的选项。

在使用这两个函数时,一定要注意处理可能出现的错误,并及时释放资源。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解C语言中的wait()函数和waitpid()函数 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • C语言基础之malloc和free函数详解

    C语言基础之malloc和free函数详解 在C语言中,malloc和free是用于动态内存分配和释放的两个重要函数。本文将详细讲解它们的使用方法和注意事项。 1. malloc函数 malloc函数用于在运行时动态分配内存空间。它的函数原型如下: void* malloc(size_t size); size参数表示要分配的内存空间的字节数。 malloc…

    other 2023年8月1日
    00
  • php自动加载规范psr4(thinkphp)

    PHP 自动加载规范 PSR-4(ThinkPHP) 什么是自动加载 在 PHP 开发中,需要引入不同的类和库文件,传统的方式是使用 include 或者 require 函数来加载。这种方式虽然简单易用,但是在项目代码量庞大时,频繁使用 include 或者 require 函数会导致程序运行效率低下,甚至会影响网站访问速度。 PHP 自动加载是一种常见的…

    其他 2023年3月29日
    00
  • 电脑桌面右键新建菜单中没有Word/Excel/PPT等文档怎么办?

    若电脑桌面右键新建菜单中没有Word/Excel/PPT等文档,可能是由于Office软件未正常安装或被卸载导致相关菜单项丢失。 解决方法如下: 步骤一:检查Office软件是否正常安装 首先,需要确认电脑已安装Office软件且安装是完整的。可以通过以下操作来确认: 点击Windows开始按钮,并在搜索框中输入“控制面板”。 在弹出的控制面板窗口中,选择“…

    other 2023年6月27日
    00
  • GDB:从单线程调试到多线程调试(MFiX单步调试)

    GDB: 从单线程调试到多线程调试 (MFiX 单步调试) 引言 在软件开发中,调试是必不可少的一环,本文将重点介绍通过 GDB 进行调试的过程。我们将以 MFiX(一款开源多相流计算软件)为例介绍单线程到多线程调试的过程。 一、单线程调试 单线程调试是指在程序的单个执行线程中进行调试。在 MFiX 应用程序的单线程模式下进行调试,具体操作如下: 编译 MF…

    其他 2023年3月28日
    00
  • SpringBoot之QueryDsl嵌套子查询问题

    Spring Boot之QueryDsl嵌套子查询问题攻略 简介 QueryDsl是一个用于构建类型安全的SQL查询的框架,它提供了一种流畅的API来构建查询表达式。在Spring Boot中使用QueryDsl可以简化数据库查询操作。然而,当需要进行嵌套子查询时,可能会遇到一些问题。本攻略将详细介绍如何解决Spring Boot中QueryDsl嵌套子查询…

    other 2023年7月28日
    00
  • css样式找到兄弟节点

    简介 在CSS中,我们可以使用选择器来选择元素并应用样式。在本攻略中,我们将介绍如何使用CSS选择器找到兄弟节点,并提供两个示例说明。 兄弟选择器 在CSS中,我们可以使用兄弟选择器(~)来选择元素的兄弟节点。兄弟选择器选择与指定元素相邻的所有兄弟元素。 以下是兄弟选择器的语法: element1 ~ element2 { /* CSS样式 */ } 在上面…

    other 2023年5月6日
    00
  • linux下Samba服务和NFS服务配置的方法

    下面是详细的讲解“Linux下Samba服务和NFS服务配置的方法”的完整攻略。 Linux下Samba服务配置的方法 什么是Samba? Samba是一种开源软件,允许Linux操作系统与Windows系统相互通信。它实现了不同系统之间文件和打印机共享的功能。Samba服务可以让Windows用户访问Linux服务器上的共享文件和打印机。 Samba服务的…

    other 2023年6月27日
    00
  • 电脑版FireFoX火狐浏览器无法登陆账号不能自动登陆该怎么办?

    电脑版FireFoX火狐浏览器无法登陆账号不能自动登陆的解决方案 在使用FireFox火狐浏览器时出现账号无法自动登陆的情况,可能是由于以下几个原因导致的: 浏览器存在缓存或Cookie问题,导致无法保存账号信息; 浏览器设置问题,未启用密码或账号自动填充功能; 网站问题,无法识别或保存账号信息。 针对以上原因,下面提供几种解决方案。 1. 清空浏览器缓存和…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部