在 Linux 中,进程创建本质上是通过 fork() 系统调用来完成的。下面从原理到示例给你系统讲一下。
fork() 是进程创建的唯一方式(近似)fork() → 内核复制父进程 → 产生子进程现代 Linux 实际使用的是
clone()系统调用,但fork()是对clone()的封装。
fork()#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main() {
pid_t pid = fork();
if (pid < 0) {
// fork 失败
perror("fork error");
} else if (pid == 0) {
// 子进程
printf("I am child, pid = %d\n", getpid());
} else {
// 父进程
printf("I am parent, pid = %d, child pid = %d\n", getpid(), pid);
}
return 0;
}
| 返回值 | 含义 |
|---|---|
< 0 |
创建失败 |
== 0 |
子进程 |
> 0 |
父进程,返回的是子进程 PID |
fork() 后发生了什么?fork() 并不会立刻复制内存✅ 提高性能
✅ 减少内存浪费
exec()fork() 只是复制进程
真正运行新程序要用 exec()
if (fork() == 0) {
execl("/bin/ls", "ls", "-l", NULL);
}
常见函数:
execlexecvexecleexecvp
exec()不会创建新进程,只是替换当前进程
fork()
↓
子进程
↓
exec()
↓
运行新程序
system()system("ls -l");
fork + exec + waitposix_spawn()fork+exec 更安全pthread_create()
ls
执行流程:
fork()exec() 执行 lswait() 等待子进程结束Linux 中进程创建 = fork() 复制进程 + exec() 执行新程序
如果你愿意,我可以:
你更想深入哪一块?