使用 C 語言中的 fork 函式

Jinku Hu 2023年1月30日 2021年2月28日
  1. 使用 fork 函式在 C 語言中建立一個新的程序
  2. 在 C 語言中使用 exec 函式之一在子程序中執行新程式
使用 C 語言中的 fork 函式

本文將介紹幾種在 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
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - C Process