fork是posix系统调用,c++需包含调用,返回值:父进程得子pid(正数),子进程得0,失败得-1;采用写时复制机制,父子进程并发执行且调度顺序不确定。

fork 在 C++ 中不能直接用,得靠 fork 所在的 C 标准库
你写的是 C++,但 fork 本身是 POSIX C 函数,C++ 标准库里根本没有它。想用就得显式包含 <unistd.h></unistd.h>(Linux/macOS)或换 Windows 替代方案(比如 CreateProcess)。别指望 #include <iostream></iostream> 或 <process.h></process.h> 能给你 fork。
常见错误现象:error: ‘fork’ was not declared in this scope —— 就是因为没加头文件,或者编译环境不支持 POSIX(比如纯 MSVC 默认不启用 POSIX 支持)。
- Linux/macOS 下:加
#include <unistd.h></unistd.h>,链接时不需要额外参数 - Windows 下:MinGW/MSYS2 可用
fork;原生 MSVC 不支持,得改用CreateProcess或_spawn系列函数 - 跨平台项目建议:用
#ifdef __linux__或#ifdef _WIN32做条件编译,别硬写fork
fork 返回值怎么判断父子进程?只看 pid_t 的符号和零值
fork 返回类型是 pid_t,不是 int(虽然常和 int 兼容),它的值只有三种可能:
- 在父进程中返回子进程 PID(正整数)
- 在子进程中返回
0 - 出错时返回
-1,并设置errno
别用 if (fork() > 0) 判断父进程就完事——漏了错误处理。正确写法必须检查 -1:
yuanfang-skills 的共享设计系统,提供 token CSS 变量、12+ 主题以及可复用的布局类型 HTML 块,供 yuanfang-html-image(以及 fu...)使用。
pid_t pid = fork();
if (pid == -1) {
perror("fork failed");
return 1;
} else if (pid == 0) {
// 子进程逻辑
execl("/bin/ls", "ls", "-l", nullptr);
exit(1); // exec 失败才走到这儿
} else {
// 父进程逻辑,pid 是子进程 ID
int status;
waitpid(pid, &status, 0);
}
注意:execl 成功后不会返回,失败才继续执行;子进程不 exit 或 exec 就会“泄漏”并重复执行后续代码(常见 bug)。
子进程继承了什么?哪些资源要主动清理
fork 是“写时复制”(copy-on-write),子进程刚创建时共享代码段、打开的文件描述符、信号处理设置等,但各自有独立的内存地址空间、PID、PPID、计时器等。
- 文件描述符默认继承且保持相同值(
fd 3在父子中都是3),如果不想子进程访问某文件,父进程应在fork前用fcntl(fd, F_SETFD, FD_CLOEXEC)设置 close-on-exec - 信号掩码和忽略状态也继承,但挂起的信号不会传给子进程
- 子进程不会自动继承父进程的线程——
fork只复制调用线程,多线程程序里用fork很危险,容易死锁(如 malloc 锁、IO 缓冲区) - 别在多线程程序里直接
fork后exec,除非你清楚所有线程状态;更安全的做法是fork前pthread_atfork注册清理函数
为什么 fork+exec 组合比 system 更可控
system 内部确实用了 fork + exec + wait,但它走的是 shell 解析路径(/bin/sh -c "cmd"),带来额外开销和安全隐患(比如命令注入)。而手写 fork+exec 可以绕过 shell,直接调用二进制。
- 想执行
ls -l /tmp:用execl("/bin/ls", "ls", "-l", "/tmp", nullptr),不经过 shell,无注入风险 - 需要重定向?得在子进程中先
dup2修改stdin/stdout/stderr,再exec -
system返回的是 shell 退出码(需WEXITSTATUS提取),而waitpid可以拿到完整状态,包括是否被信号终止 - 性能上:省掉一次 shell 进程启动,尤其高频调用时差异明显
真正难的不是调用 fork,而是处理好文件描述符、信号、资源释放、错误分支和多线程边界——这些地方一漏,程序就表现诡异,而且很难复现。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










