Linux进程控制(1)

1 进程创建

1-1 fork函数初识

在Linux中fork函数十分重要,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。

复制代码
#include <unistd.h>
pid_t fork(void);
返回值:子进程返回0,父进程返回子进程id,出错返回-1

进程调用 fork ,当控制转移到内核中的 fork 代码后,内核做:

  • 分配新的内存块和内核数据结构给子进程
  • 将父进程部分数据结构内容拷贝至子进程
  • 添加子进程到系统进程列表当中
  • fork 返回,开始调度器调度

所以,fork之前父进程独立执行,fork之后,父子两个执行流分别执行。注意,fork之后,谁先执行完全由调度器决定。

1-2 写时拷贝

通常,父子代码共享,父子再不写入时,数据也是共享的,当任意一方试图写入,便以写时拷贝的方式各自⼀份副本。

因为有写时拷贝技术的存在,所以父子进程得以彻底分离!完成了进程独立性的技术保证!

写时拷贝,是⼀种延时申请技术,可以提高整机内存的使用率

1-3 fork常规用法

  • 一个父进程希望复制自己,使父子进程同时执行不同的代码段。例如,父进程等待客户端请求,生成子进程来处理请求。
  • 一个进程要执行一个不同的程序。例如子进程从 fork 返回后,调用 exec 函数。

1-4 fork调用失败的原因

  • 系统中有太多的进程
  • 系统用户的进程数超过了限制

2 进程终止

一、进程终止的三种情况

  1. 代码跑完,结果正确 进程正常执行完毕,逻辑和结果都符合预期,例如 main 函数 return 0。
  2. 代码跑完,结果不正确 进程正常执行完毕,但结果不符合预期,例如 return 1(或其他非 0 退出码),表示程序逻辑错误。
  3. 代码没跑完,进程异常终止 进程中途被终止,例如收到信号(如段错误、被 kill 命令杀死),此时return没有被执行,退出码无意义。

二、进程退出状态的表示

进程的执行结果状态,由两个关键值表示:

  • sig(信号编号):表示进程是否因信号异常终止。sig == 0 表示正常结束;sig != 0 表示被信号终止。
  • exit_code(退出码):表示进程正常结束时的状态。只有当 sig == 0 时,退出码才有意义。
情况 sig(信号) exit_code(退出码)
正常且结果正确 0 0
正常但结果错误 0 非 0
异常终止 非 0 无意义

操作系统会把这两个信息写入进程的 task_struct(PCB)中,僵尸进程的核心作用,就是保存这个退出状态,供父进程读取。

三、进程如何退出(不考虑异常)

  1. main 函数的 return

    • 只有 main 函数的 return 会让进程结束;其他函数的 return 仅表示函数调用结束。
    • return n 本质上等价于调用 exit(n)。
  2. 在任意位置调用 exit()

    • 是 C 标准库函数,调用后进程直接终止。
    • 特点:会强制刷新缓冲区 (把缓冲区数据写入文件 / 终端),再调用系统调用 _exit()。
  1. 在任意位置调用 _exit()

    • 是直接的系统调用,内核提供的接口。
    • 特点:直接终止进程,不会刷新缓冲区,也不做任何用户态的清理工作。

💡 关键对比:exit() 会刷新缓冲区,_exit() 不会。因为缓冲区和刷新操作是 C/C++ 库维护的,不是内核的功能。

四、内核视角:进程终止时的操作

  1. 进程退出时,操作系统会将退出状态(exit_code 和 sig)写入进程的 task_struct。
  2. 进程需要以僵尸进程 的形式保留 PCB,直到父进程通过 wait()/waitpid() 读取退出状态,才会被彻底回收
相关推荐
꯭自꯭闭꯭19 小时前
达梦DMDSC主备搭建
linux·服务器·数据库
硅基手札19 小时前
MCP 实战 —— 从零写一个 CRC16 服务器(保姆级)
运维·服务器·ai
AI备忘录19 小时前
(二十三)华为华三锐捷迈普思科 MLAG 跨设备配置命令(双活网关五厂商对照)
服务器·网络·华为
打工仔折腾 AI19 小时前
把模型切换交给平台:用蓝耘智能路由搭建商品评论分析工具
java·服务器·前端·后端·python·性能优化·ai agent 实战
今年下半年19 小时前
【运维】windows虚拟机安装arm(aarch64)服务器
运维·windows·arm·虚拟机·aarch64
杨云龙UP19 小时前
TDengine Community 超级表建表实战:统一21个TAG与DOUBLE/字符串数据模板
运维·服务器·数据库·时序数据库·tdengine·涛思数据·stable建表
墨家句子20 小时前
AnythingLLM 搭本地知识库:文档问答不准怎么调
linux·后端
高山有多高20 小时前
【Linux笔记】冯诺依曼体系结构
linux·运维·笔记
katasea20 小时前
第05章:信创技术栈选型:服务器、操作系统、数据库、中间件适配对比
服务器·数据库·中间件
筑梦之路20 小时前
Alibaba Cloud Linux 4 IPXE全自动安装(直连官方源)——筑梦之路
linux·运维·服务器·国产化·阿里云操作系统