fork() 創建子進程,返回值區分父(子 PID)與子(0)。| 特性 | 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,且子進程嚴禁修改任何共享資料。