fork() 调用一次、返回两次:父进程返回子进程 PID(>0),子进程返回 0,失败返回 −1。现代系统用写时复制(COW)共享物理页,写入时才复制。fork() 是 Unix / Linux 系统中创建新进程的核心系统调用。调用一次,返回两次——这是 fork 最独特的特征。
$pid\_t\; pid = fork();$
现代操作系统不会在 fork 时立即复制整个地址空间,而是采用写时复制技术。
| 属性 | 是否继承 | 说明 |
|---|---|---|
| 地址空间(副本) | 继承(COW) | 写时复制 |
| 文件描述符 | 继承 | 共享文件偏移量 |
| 信号处理函数 | 继承 | 信号掩码继承 |
| 当前工作目录 | 继承 | |
| 环境变量 | 继承 | |
| PID / PPID | 不继承 | 子进程获得新 PID,PPID = 父进程 PID |
| 未处理信号 / 文件锁 / 定时器 | 不继承 | 子进程清空 |
wait(),子进程 PCB 残留。wait()/waitpid() 回收子进程,或注册 SIGCHLD 信号处理函数,可避免僵尸进程。fork 通过系统调用进入内核,内核完成:
↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。