温馨提示×

linux进程怎么创建

小樊
47
2026-08-05 11:10:49
栏目: 智能运维

在 Linux 中,进程创建本质上是通过 fork() 系统调用来完成的。下面从原理到示例给你系统讲一下。


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

1️⃣ fork() 是进程创建的唯一方式(近似)

  • Linux 中,新进程总是由已有进程创建
  • 父进程调用 fork() → 内核复制父进程 → 产生子进程
  • 子进程是父进程的副本

现代 Linux 实际使用的是 clone() 系统调用,但 fork() 是对 clone() 的封装。


二、最基础的进程创建:fork()

示例(C 语言)

#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() 后发生了什么?

子进程复制了什么?

  • 代码段
  • 数据段
  • 堆、栈
  • 文件描述符表
  • 环境变量

但:

  • PID 不同
  • 父进程 ID 不同
  • 不共享地址空间(写时复制)

四、写时复制(Copy-On-Write, COW)

  • fork() 并不会立刻复制内存
  • 父子进程共享同一块物理内存
  • 只有当某一方 写内存 时才真正复制

✅ 提高性能
✅ 减少内存浪费


五、进程执行新程序:exec()

fork() 只是复制进程
真正运行新程序要用 exec()

示例

if (fork() == 0) {
    execl("/bin/ls", "ls", "-l", NULL);
}

常见函数:

  • execl
  • execv
  • execle
  • execvp

exec() 不会创建新进程,只是替换当前进程


六、进程创建完整流程(常见模式)

fork()
  ↓
子进程
  ↓
exec()
  ↓
运行新程序

七、其他创建进程的方式

1️⃣ system()

system("ls -l");
  • 内部调用 fork + exec + wait
  • 简单但效率低、不安全

2️⃣ posix_spawn()

  • 现代 API
  • fork+exec 更安全
  • 常用于嵌入式

3️⃣ 线程 ≠ 进程

pthread_create()
  • 创建的是 线程
  • 共享地址空间
  • 不是进程

八、从 shell 看进程创建

ls

执行流程:

  1. shell 调用 fork()
  2. 子进程调用 exec() 执行 ls
  3. shell 调用 wait() 等待子进程结束

九、总结一句话

Linux 中进程创建 = fork() 复制进程 + exec() 执行新程序


如果你愿意,我可以:

  • 图解方式画进程创建流程
  • fork 和 clone 的区别
  • 进程 vs 线程
  • Python / Go 演示进程创建

你更想深入哪一块?

0