Linux进程创建——fork与vfork深度解析

目录

[1. 引言](#1. 引言)

[2. fork函数初识](#2. fork函数初识)

为什么给子进程返回0,父进程返回子进程PID?

为什么一个函数会有两个返回值?

[3. fork的内核操作](#3. fork的内核操作)

[4. 写时拷贝(Copy-on-Write, COW)](#4. 写时拷贝(Copy-on-Write, COW))

[5. fork的常规用法](#5. fork的常规用法)

[6. fork调用失败的原因](#6. fork调用失败的原因)

[7. vfork函数(补充内容)](#7. vfork函数(补充内容))

[8. 总结](#8. 总结)


1. 引言

在Linux系统中,进程是资源分配和调度的基本单位。进程的创建是操作系统核心功能之一,而fork函数是其中最基础、最重要的接口。本文将深入探讨fork的工作原理、返回值特性、写时拷贝技术,以及vfork的区别与应用场景。

2. fork函数初识

fork用于从一个已存在的进程中创建一个新进程,新进程称为子进程,原进程称为父进程。

c

复制代码
#include <unistd.h>
pid_t fork(void);

返回值:

  • 子进程中返回 0

  • 父进程中返回子进程的PID;

  • 出错返回 -1

为什么给子进程返回0,父进程返回子进程PID?
  • 子进程可以通过 getpid() 获取自己的PID,不需要通过返回值;

  • 父进程可能拥有多个子进程,需要返回值来区分具体是哪个子进程;

  • 返回0可以简化子进程的代码逻辑(例如 if (pid == 0) 表示子进程)。

为什么一个函数会有两个返回值?

fork 调用一次,但在内核中会复制出一个新的进程控制块(PCB),两个进程各自从 fork 返回一次,因此看似"返回两次"。

3. fork的内核操作

  1. 分配新的内存块和内核数据结构给子进程;

  2. 将父进程的部分数据结构内容拷贝至子进程;

  3. 将子进程添加到系统进程列表;

  4. fork 返回,调度器决定哪个进程先执行。

注意: fork 之后父子进程的执行顺序由调度器决定,无法假设谁先运行。

4. 写时拷贝(Copy-on-Write, COW)

父子进程在 fork共享代码段和数据段,只有当一方尝试修改数据时,才会为修改的那一页分配独立的内存副本。

优点:

  • 提高内存利用率;

  • 延迟内存分配,减少不必要的拷贝;

  • 保证进程独立性。

写时拷贝是Linux内核中一项重要的性能优化技术。

5. fork的常规用法

  • 并行处理: 父进程等待客户端请求,子进程处理具体任务;

  • 执行新程序: 子进程 fork 后调用 exec 族函数执行另一个程序。

6. fork调用失败的原因

  • 系统中进程数超过系统限制;

  • 实际用户进程数超过其限制(ulimit -u)。

7. vfork函数(补充内容)

vfork 也用于创建子进程,但与 fork 有显著不同:

特性 fork vfork
地址空间 子进程复制父进程(写时拷贝) 子进程共享父进程地址空间(不复制)
执行顺序 调度器决定 子进程先执行,直到 exitexec,父进程才恢复
数据安全性 各自独立 子进程修改会影响父进程
用途 通用 主要用于立即 exec 的场景

注意: 现代Linux中 vfork 已被 fork + 写时拷贝优化取代,但了解其差异有助于理解历史设计。

8. 总结

fork 是Linux进程管理的基石,写时拷贝技术使其既高效又安全。理解 fork 的行为是掌握进程控制、守护进程、并发服务器等高级主题的前提。

相关推荐
2301_7779983418 小时前
Linux信号机制
linux
一叶龙洲21 小时前
win11与Ubuntu之间同步配置、插件
linux·运维·ubuntu
CHANG_THE_WORLD21 小时前
12.总结:深入理解 Linux I/O 多路复用:select、poll、epoll 全解析
linux·运维·服务器
风曦Kisaki1 天前
# Linux笔记:操作系统优化与资源管理
linux·运维·服务器·笔记
Mr.HeBoYan1 天前
一次持续三天才出现的丢包故障——深入解析 DPDK Memory Ordering、rte_ring 与 CPU Memory Barrier (下)
linux·网络·算法·架构·dpdk
zhangrelay1 天前
笔记本轻量高品质延寿工具完整分系统清单
运维·笔记·学习
初願致夕霞1 天前
C++懒汉单例设计详解
服务器·开发语言·c++
Discipline~Hai1 天前
ARM01-ARM体系架构
linux·c语言·arm开发·架构
RisunJan1 天前
Linux命令-screen(终端复用器)
linux·运维
啊哦1111 天前
安装VMware Workstation
linux·运维·服务器