首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Linux C編程:進程創建與 fork/vfork 差異深度解析

     編輯:關於C語言

進程模型核心概念

  • 微觀串行,宏觀並行:單 CPU 時間片輪轉,產生同時運行假象。
  • 父子進程:fork() 創建子進程,返回值區分父(子 PID)與子(0)。
  • 獨立地址空間:父子進程擁有各自的資料段、堆、棧,互不干擾。

fork() vs vfork()

特性fork()vfork()
資料段複製複製父進程整個地址空間(Copy-on-Write 優化)共享父進程資料段,不複製
執行順序父子並發,調度器決定父進程掛起,直到子進程 exit 或 exec
典型用途一般並發任務緊接 exec 啟動新程式(如 shell 執行命令)
風險較安全子進程修改共享資料會影響父進程,極易出錯

驗證程式:觀察變量隔離性

#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
    pid_t pid;
    char *pchar = "before fork";
    int test_va = 1;

    if ((pid = fork()) < 0) { perror("fork"); exit(1); }
    else if (pid == 0) {          /* 子進程 */
        printf("child process\n");
        pchar = "child pchar\n";
        test_va = 2;
        printf("%s%d\n", pchar, test_va);
        _exit(2);
    } else {                      /* 父進程 */
        printf("parent process\n");
        // sleep(1);  // 取消註解可觀察 vfork 父進程等待
        printf("%s%d\n", pchar, test_va);
    }
    return 0;
}

預期輸出(fork):父進程印出 "before fork" 和 1,證明子進程修改未影響父進程。
改用 vfork:父進程會印出子進程修改後的值,且父進程在子進程退出前阻塞。

最佳實踐

  • 現代系統 fork 採用 COW,開銷極小,優先使用 fork。
  • 極少數效能敏感且緊接 exec 才考慮 vfork,且子進程嚴禁修改任何共享資料。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved