使用 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
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