使用 C 語言中的 fork 函式

Jinku Hu 2023年10月12日
  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 <sys/wait.h>
#include <unistd.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 <sys/wait.h>
#include <unistd.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
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook

相關文章 - C Process