在 Linux 中,“创建进程”本质上是通过 复制已有进程 来完成的(Linux 没有“凭空创建进程”的系统调用)。下面从原理 → 常用方式 → 示例代码逐步说明。
Linux 创建新进程的标准流程是:
所有进程最终都来源于
init/systemd(PID 1)
#include <stdio.h>
#include <unistd.h>
int main() {
pid_t pid = fork();
if (pid == 0) {
// 子进程
printf("子进程 PID = %d\n", getpid());
} else if (pid > 0) {
// 父进程
printf("父进程 PID = %d\n", getpid());
} else {
perror("fork");
}
}
#include <unistd.h>
int main() {
pid_t pid = fork();
if (pid == 0) {
// 子进程执行 ls
execl("/bin/ls", "ls", NULL);
} else {
wait(NULL); // 等待子进程
}
}
#include <stdlib.h>
system("ls -l");
✅ 简单
❌ 不安全、效率低
FILE *fp = popen("ls", "r");
✅ 可读取命令输出
其实你每执行一条命令,Shell 都在创建进程:
ls
sleep 10 &
./my_program
& = 后台进程
| 问题 | 原因 |
|---|---|
| 僵尸进程 | 父进程没 wait() |
| 孤儿进程 | 父进程先退出 |
| 资源泄漏 | fork 后没 exec |
Linux 创建进程 = fork() 复制 + exec() 替换 + wait() 回收
如果你愿意,我可以:
你更想了解哪一块?