首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言 `fork()` 創建的是進程而非線程,父子進程輸出「Hello World」三次

     編輯:程式設計綜合問答

關鍵概念糾正

`fork()` 是創建子進程的系統調用,而非線程。子進程複製父進程的虛擬地址空間、文件描述符表等,擁有獨立的 PID。

題目代碼分析

pid_t pid = fork();
if (pid == 0) printf("Hello World\n");
else if (pid > 0) printf("Hello World\n");
else printf("Hello World\n");
  • 父進程:`pid > 0`,執行第二個分支 → 輸出一次;
  • 子進程:`pid == 0`,執行第一個分支 → 輸出一次;
  • `fork()` 失敗:`pid < 0`,執行 `else` → 輸出一次(極少見)。

正常情況下屏幕輸出兩行「Hello World」(順序不定,取決於調度器)。

為什麼不是三次?

`if-else if-else` 結構互斥,每個進程只會進入一個分支。若改為三個獨立 `if`,則父子進程各執行三次,共六次輸出。

進階驗證:打印 PID 觀察父子關係

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

int main() {
    pid_t pid = fork();
    if (pid == 0) {
        printf("Child:  PID=%d, PPID=%d\n", getpid(), getppid());
        sleep(30); // 方便用 pstree 觀察
    } else if (pid > 0) {
        printf("Parent: PID=%d, Child PID=%d\n", getpid(), pid);
        wait(NULL);
    } else {
        perror("fork");
    }
    return 0;
}

運行後配合 `pstree -p | grep a.out` 可清晰看到父子進程樹結構。

總結

  • `fork()` 返回值決定父子進程執行路徑;
  • 父子進程獨立運行,變量不共享(寫時複製);
  • 題目輸出兩次「Hello World」,而非三次。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved