fork()
unistd.h
pid_t fork(void);
创建子进程,通过返回值区分父子执行流,是进程创建的基本手段。
# fork · 创建子进程
## 头文件
`unistd.h`
## 函数原型
`pid_t fork(void);`
## 说明
fork 把当前进程复制出一个子进程,两个进程从同一行代码继续执行。通过返回值区分身份:父进程拿到子进程的 pid(大于 0),子进程拿到 0,失败返回 -1。
复制时子进程获得父进程内存的写时复制副本与打开的文件描述符副本;父子各自独立,一个退出不影响另一个。
## 最小示例
```c
#include <stdio.h>
#include <unistd.h>
int main(void) {
pid_t pid = fork();
if (pid < 0) { perror("fork"); return 1; }
if (pid == 0) { printf("child\n"); return 0; }
printf("parent, child pid = %d\n", (int)pid);
return 0;
}
```
## 常见坑
- 不处理 fork 失败,直接当成子进程逻辑继续走
- 子进程忘了退出,主函数返回后又多执行一段父进程代码
- 不 wait 子进程,子进程变僵尸进程,占用进程表项
- 在多线程程序里 fork,子进程只能安全调用异步信号安全的函数
## 相关函数
execve、waitpid、wait、exit、getpid