迹忆客 专注技术分享

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

使用 C 语言中的 fork 函数

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

本文将介绍几种在 C 语言中使用 fork 函数的方法。


使用 fork 函数在 C 语言中创建一个新的进程

fork 函数用于创建一个新的进程,代表调用者进程的重复。需要注意的是,调用进程按惯例被称为父进程,新创建的进程-子进程。尽管我们在上面提到子进程是父进程的重复,但还是有一些区别,比如子进程有自己唯一的 PID(关于区别的完整细节在 fork 手册中列出)。

在下面的例子中,我们实现了一个简单的场景,即使用 fork 来并发执行两个进程。第一个 if 语句检查是否返回错误代码,只有在 fork 成功的情况下才继续执行。下一个 if 语句演示了如何组织代码由并发进程执行。

与其他函数相比,fork 调用有点独特,因为它成功后会返回两次-在父进程和子进程中-在父进程中返回子进程的 PID,在子进程中返回 0 值。需要注意的是,我们相应地指定了循环的条件,以区分进程的不同代码路径。

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

int main(void) {

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

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

    exit(EXIT_SUCCESS);
}

输出:

printed from parent process - 8485
printed from child process - 8486

在 C 语言中使用 exec 函数之一在子进程中执行新程序

使用 fork 函数的常见情况之一是在子进程中执行一个新的程序,这可以通过在其中添加一个 exec 函数来实现。在这种情况下,我们实现了一个名为 spawnChild 的单独函数,它可以创建一个新的进程,然后调用 execvp 来执行给定的程序。我们选择了一个广泛使用的命令行程序-top 在子进程中执行。需要注意的是,父进程可以选择使用 waitpid 来等待子进程的状态变化。

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

pid_t spawnChild(const char* program, char** arg_list)
{
    pid_t ch_pid = fork();
    if (ch_pid == -1) {
        perror("fork");
        exit(EXIT_FAILURE);
    }

    if (ch_pid == 0) {
        execvp(program, arg_list);
        perror("execve");
        exit(EXIT_FAILURE);
    } else {
        printf("spawned child with pid - %d\n", ch_pid);
        return ch_pid;
    }
}

int main(void) {
    int ret;
    const char *args[] = { "top", NULL, NULL };

    pid_t child;
    int wstatus;

    child = spawnChild("top", args);

    if (waitpid(child, &wstatus, WUNTRACED | WCONTINUED) == -1) {
        perror("waitpid");
        exit(EXIT_FAILURE);
    }

    exit(EXIT_SUCCESS);
}

输出:

printed from child process - 8486

转载请发邮件至 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

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便