温馨提示×

如何创建linux进程

小樊
41
2026-09-21 18:38:01
栏目: 智能运维

在 Linux 中,“创建进程”本质上是通过 复制已有进程 来完成的(Linux 没有“凭空创建进程”的系统调用)。下面从原理 → 常用方式 → 示例代码逐步说明。


一、Linux 创建进程的核心原理

Linux 创建新进程的标准流程是:

  1. fork()
    • 复制当前进程(父进程)
    • 得到一个新的子进程
  2. exec()
    • 子进程用新程序替换自己
  3. wait()
    • 父进程等待子进程结束(避免僵尸进程)

所有进程最终都来源于 init / systemd(PID 1)


二、最基础方式:fork + exec(C 语言)

示例 1:fork 创建子进程

#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");
    }
}

示例 2:fork + exec(真正运行新程序)

#include <unistd.h>

int main() {
    pid_t pid = fork();

    if (pid == 0) {
        // 子进程执行 ls
        execl("/bin/ls", "ls", NULL);
    } else {
        wait(NULL); // 等待子进程
    }
}

三、更方便的方式(推荐)

1️⃣ system()

#include <stdlib.h>

system("ls -l");

✅ 简单
❌ 不安全、效率低


2️⃣ popen()

FILE *fp = popen("ls", "r");

✅ 可读取命令输出


四、Shell 中“创建进程”

其实你每执行一条命令,Shell 都在创建进程:

ls
sleep 10 &
./my_program

& = 后台进程


五、其他创建方式(进阶)

1️⃣ clone()(线程 / 容器基础)

  • 更底层
  • 可用于线程(pthread)、Docker

2️⃣ vfork()

  • 已不推荐使用

3️⃣ 守护进程(daemon)

  • fork 两次
  • 脱离终端

六、进程创建常见坑

问题 原因
僵尸进程 父进程没 wait()
孤儿进程 父进程先退出
资源泄漏 fork 后没 exec

七、总结一句话

Linux 创建进程 = fork() 复制 + exec() 替换 + wait() 回收

如果你愿意,我可以:

  • Python / Shell / Go 演示
  • 进程 vs 线程
  • 守护进程 / 容器进程创建

你更想了解哪一块?

0