fork函数,本质是将内存复制,当 fork() 发生时,操作系统把父进程当前的内存状态(包括变量值、程序计数器 PC 等)完整地拷贝了一份给子进程。
想象你在读一本书(看完的部分就被收起来了)(执行程序):
你读到了第 10 页(fork())。
突然,复印机把你这个人连同你手里的书一起复印了一份。
现在有两个你(父和子)。
你们手里的书都翻在第 10 页。
接下来,你们两个人都会从第 11 页开始接着往下读。
没有人会回到第 1 页重新开始读。
一次调用,两次返回
fork() 函数非常神奇,它调用一次,却返回两次:
在父进程中: 返回子进程的 PID(一个大于 0 的正整数)。
在子进程中: 返回 0。
如果出错: 返回 -1(这种情况极少,暂不讨论)。
假设我们要实现:父进程负责打印 "I am Father",子进程负责计算 1+1 并打印结果。
#include <stdio.h> #include <unistd.h> #include <sys/types.h> int main() { printf("程序开始运行...\n"); // 【关键时刻】在这里发生分裂 pid_t pid = fork(); // --- 分裂点 --- // 此时内存里有两个进程,都在往下执行 if (pid > 0) { // 【分支 A】只有父进程会进入这里 // 因为对于父进程,pid 是子进程的ID(比如 8834),大于 0 printf("我是爸爸 (PID: %d),我的孩子是 %d\n", getpid(), pid); printf("爸爸的任务:负责打印这句话。\n"); } else if (pid == 0) { // 【分支 B】只有子进程会进入这里 // 因为对于子进程,pid 永远是 0 int result = 1 + 1; printf("我是儿子 (PID: %d),我算出来的结果是: %d\n", getpid(), result); } else { // 错误处理 printf("创建失败!\n"); } printf("程序结束。\n"); // 注意:父子都会执行这一行 return 0; }