C语言控制进程之进程等待详解

C语言控制进程之进程等待详解

什么是进程等待

进程等待是指程序在执行过程中,等待子进程结束并获取子进程的退出状态,以便对进程执行状态进行处理。

进程等待函数

进程等待函数是 头文件中定义的,常用的有以下两个:

  1. pid_t wait(int *status)

wait()函数会等待任意一个子进程,获取子进程的退出状态并存储到status指向的整型变量中,返回结束的子进程ID。

  1. pid_t waitpid(pid_t pid, int *status, int options)

waitpid()函数可以等待指定PID的子进程,获取子进程退出状态并存储到status指向的整型变量中,同时还可以通过options参数指定不同的等待方式。

进程等待示例

下面我们将通过两个示例来演示进程等待的使用。

示例1

下面是一个简单的fork()及wait()示例,父进程会等待子进程结束并获取子进程的退出状态。

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

int main() {
    pid_t pid;
    if((pid = fork()) < 0) {
        perror("fork error");
        exit(1);
    }
    else if(pid == 0) {
        // 子进程执行的代码
        printf("This is child process %d\n", getpid());
        exit(0);
    }
    else {
        int status;
        if(wait(&status) != pid) {
            perror("wait error");
            exit(1);
        }
        if(WIFEXITED(status))
            printf("Child process %d exited with code %d\n", pid, WEXITSTATUS(status));
    }
    return 0;
}

运行结果:

This is child process 23625
Child process 23625 exited with code 0

示例2

下面是一个waitpid()示例,利用waitpid()函数可以等待指定PID的子进程。

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

int main() {
    pid_t pid1, pid2, pid3;
    if((pid1 = fork()) < 0) {
        perror("fork error");
        exit(1);
    }
    else if(pid1 == 0) {
        // 子进程1执行的代码
        printf("This is child process 1, pid = %d\n", getpid());
        exit(1);
    }
    else {
        if((pid2 = fork()) < 0) {
            perror("fork error");
            exit(1);
        }
        else if(pid2 == 0) {
            // 子进程2执行的代码
            printf("This is child process 2, pid = %d\n", getpid());
            exit(2);
        }
        else {
            if((pid3 = fork()) < 0) {
                perror("fork error");
                exit(1);
            }
            else if(pid3 == 0) {
                // 子进程3执行的代码
                printf("This is child process 3, pid = %d\n", getpid());
                exit(3);
            }
            else {
                int status;
                // 等待子进程2结束并获取退出状态
                if(waitpid(pid2, &status, 0) == pid2 && WIFEXITED(status))
                    printf("Child process %d exited with code %d\n", pid2, WEXITSTATUS(status));
            }
        }
    }
    return 0;
}

运行结果:

This is child process 1, pid = 23626
This is child process 2, pid = 23627
This is child process 3, pid = 23628
Child process 23627 exited with code 2

参考

  • 《UNIX网络编程:卷1,套接字联网API》
  • 《深入理解计算机系统(原书第3版)》

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言控制进程之进程等待详解 - Python技术站

(0)
上一篇 2023年5月30日
下一篇 2023年5月30日

相关文章

  • C语言实现求定积分的方法

    C语言实现求定积分的方法 在C语言中实现求定积分的方法可以采用数值积分的方式,其中常用的方法有梯形法、辛普生法和龙贝格法。 梯形法 梯形法是最简单的数值积分方法之一,具体实现步骤如下: 将积分区间[a,b]分成n个小区间,每个小区间宽度为h=(b-a)/n。 计算每个小区间左右两端点的函数值后求平均值,得到该小区间的梯形面积。 将所有小区间梯形面积相加,得到…

    C 2023年5月22日
    00
  • C++控制台绘图头文件实例代码

    下面是对“C++控制台绘图头文件实例代码”的完整攻略: 1. 简介 在C++的控制台程序中,通过使用图形化绘图头文件,可以在控制台中绘制出各种图形。 2. 下载 在使用绘图头文件前,需要下载对应的库文件。 目前比较流行的库包括: graphics.h:Borland C++ 5.02自带的,不建议使用。 conio.h:Turbo C自带的,也不建议使用。 …

    C 2023年5月24日
    00
  • Adobe Photoshop CC 2019正式发布 PS CC 2019更新内容汇总(附下载地址)

    Adobe Photoshop CC 2019正式发布 Adobe Photoshop CC 2019是Adobe公司推出的最新版Photoshop图形处理软件,其于2018年10月15日正式发布。新版本的Photoshop CC带来了许多新的功能和改进,下面将对其更新内容进行详细的说明。 更新内容汇总 新增了画笔工具的设定和改进,使得用户在使用过程中更加得…

    C 2023年5月22日
    00
  • C语言 坐标移动详解及实例代码

    C语言 坐标移动详解及实例代码攻略 坐标移动的概念 在计算机中,坐标移动是指移动一个对象或点的位置以改变其在屏幕上显示的位置。在C语言中,使用结构体来表示坐标,并利用操作结构体的函数来实现坐标移动的功能。 坐标移动的实现步骤 定义结构体 首先,需要定义表示坐标的结构体。一般来说,坐标结构体包含两个变量:x坐标和y坐标。以下是一个示例程序: typedef s…

    C 2023年5月24日
    00
  • 解决javac不是内部或外部命令,也不是可运行程序的报错问题

    这个错误通常出现在Windows系统中,它表示系统无法找到Java编译器(javac)命令。这个问题可能是由于两个原因造成的:Java Development Kit(JDK)未在计算机上安装或未添加到PATH环境变量。 以下是解决这个问题的完整攻略: 步骤 1:确认 JDK 是否安装 如果 Java Development Kit(JDK)未安装在计算机上…

    C 2023年5月23日
    00
  • Json.net 常用使用小结(推荐)

    Json.net 常用使用小结(推荐) 什么是 Json.net? Json.net 是一个跨平台的 .NET 库,即使用最广泛的 JSON 库之一,能够处理 JSON 数据的序列化和反序列化。它在 .NET Framework 和 .NET Core 等多个平台上支持序列化和反序列化操作,同时也支持 LINQ、动态编译和对象转换等一系列高级功能。 Json…

    C 2023年5月23日
    00
  • C# 崩溃异常中研究页堆布局的详细过程

    C# 崩溃异常中研究页堆布局的详细过程 什么是页堆布局? 页堆布局(Page Heap)是一种用于内存管理的技术。它增强了堆管理器的动态检查,防止发生常见的堆错误,如覆盖内存、缓冲区溢出等。在页堆布局技术中,每一个页都被存储为一个不可变的空间大小,使得每一个堆分配都在一个匹配的页边界上发生。 页堆布局引发的异常 如果一个应用程序没有正确地使用内存,那么它很容…

    C 2023年5月23日
    00
  • C#中的char、string和StringBuilder的使用详解

    C#中的char、string和StringBuilder的使用详解 在C#中,char、string和StringBuilder都是用来表示字符串以及相关操作的工具。本文将详细讲解它们的使用方法及不同点。 Char Char是一个表示单个Unicode字符的数据类型。在C#中,它通常用于对单个字符进行操作。以下是一些对Char变量进行操作的示例: char…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部