Linux --进程控制

发布时间:2026/8/26 16:06:35

Linux --进程控制
进程的诞生fork与vforkfork函数初识在Linux中fork是创建新进程的唯一方式从用户态视角看。它通过复制调用进程父进程来生成一个全新的进程子进程。#include unistd.h pid_t fork(void);返回值子进程返回0。父进程返回子进程的PID大于0。出错返回-1。为什么这样设计返回值父进程可能有多个子进程需要通过PID来区分和管理每个子进程。子进程只需要知道自己是否是子进程返回0即可它可以通过getppid()获取父进程PID。fork的执行流程当调用fork时内核会执行以下操作分配新的内存块和内核数据结构task_struct给子进程。将父进程的部分数据结构内容拷贝到子进程。将子进程添加到系统进程列表中。fork返回开始调度器调度。关键图解fork之前父进程独立执行。fork之后父子进程各自独立执行执行顺序由调度器决定无法预测。示例代码int main() { printf(Before: pid is %d\n, getpid()); pid_t pid fork(); if (pid -1) perror(fork), exit(1); printf(After: pid is %d, fork return %d\n, getpid(), pid); sleep(1); return 0; }输出Before: pid is 43676 After: pid is 43676, fork return 43677 After: pid is 43677, fork return 0注意子进程没有打印 “Before”因为fork之前父进程独立执行子进程是从fork返回处开始执行的。写时拷贝父子进程在创建时共享代码和数据为了效率。只有当任意一方试图修改数据时才会以写时拷贝的方式为修改方复制一份副本。优点提高内存使用效率延迟分配。保证进程独立性互不干扰。扩展理解COW 是虚拟内存管理的重要优化它使得fork非常轻量因为不需要立即复制全部内存。进程的终点进程终止进程退出的三种场景代码运行完毕结果正确退出码为0。代码运行完毕结果不正确退出码非0。代码异常终止被信号杀死如SIGKILL、SIGSEGV。常见退出方法正常终止return从main返回。exit()标准库函数会执行清理工作。_exit()系统调用立即终止。异常终止收到信号如CtrlCSIGINT。退出码Exit Code0成功。非0失败具体含义可自定义或参考系统约定。常见退出码Shell中退出码含义0成功1通用错误2命令使用不当126权限不足或无法执行127命令未找到130被SIGINTCtrlC终止143被SIGTERM终止注意退出码只有低8位有效0~255如果传-1实际看到的是255。为什么exit(-1)会显示 2551. 本质原因数据截断exit()函数的参数是int类型通常占4字节但内核只保留了该整数的低8位1字节作为进程的退出状态。int 类型假设32位 -1 的二进制表示11111111 11111111 11111111 11111111 ↑ 只取低8位11111111 转换成十进制255为什么只取低8位退出码范围限制在 0-255足够表达各种退出状态。内核用int的status字段既要存退出码又要存终止信号等信息通过位图方式。status的低16位布局只研究status低16比特位因为高16位在进程等待中通常不使用。status 的低16位从高位到低位 ┌──────────────┬────────────┬──────────────┐ │ bit 15-8 │ bit 7 │ bit 6-0 │ │ (8位) │ (1位) │ (7位) │ ├──────────────┼────────────┼──────────────┤ │ 退出码 │ core dump │ 终止信号 │ │ (exit code)│ 标志 │ (term sig) │ └──────────────┴────────────┴──────────────┘详细拆解位范围长度含义说明bit 15-88位退出码进程正常退出时的返回值0-255bit 71位core dump标志是否产生了核心转储文件bit 6-07位终止信号编号进程被哪个信号杀死的int ret wait(st); if (ret 0 (st 0x7F) 0) { // 正常退出 printf(child exit code:%d\n, (st 8) 0xFF); } else if (ret 0) { // 异常退出 printf(sig code : %d\n, st 0x7F); }st 0x7F—— 提取终止信号0x7F 的二进制0000 0000 0111 1111 ↑ 只保留低7位 st 0x7F 的作用提取 status 的 bit 6-0终止信号示例如果进程被SIGKILL (9)杀死st 0x7F 9如果进程被SIGINT (2)杀死st 0x7F 2如果进程正常退出st 0x7F 0(st 8) 0xFF—— 提取退出码假设 st 0x0000 0A00 (子进程 exit(10)) st 8右移8位把退出码移到低8位 0x0000 0A00 8 0x0000 000A (st 8) 0xFF取低8位 0x0000 000A 0xFF 10示例子进程exit(10)→ 退出码 10子进程exit(255)→ 退出码 255判断是否正常退出if ((st 0x7F) 0) { // 终止信号为0 → 进程正常退出 }exitvs_exit_exit()exit()直接系统调用库函数最终调用_exit()不刷新缓冲区刷新所有缓冲区关闭流不执行清理函数执行atexit注册的清理函数printf(hello); // 没有换行 exit(0); // 输出 hello _exit(0); // 不输出缓冲区未刷新扩展知识return在main中等同于exit因为main是由启动例程调用的启动例程会接收返回值并传递给exit。父进程的“收尸”进程等待为什么要等待子进程防止僵尸进程子进程退出后如果父进程不回收子进程变成僵尸Z状态占用内核资源。获取退出信息父进程需要知道子进程任务完成情况成功/失败/异常。无法杀死僵尸kill -9对僵尸进程无效只能靠父进程wait。wait和waitpid#include sys/wait.h pid_t wait(int *status); pid_t waitpid(pid_t pid, int *status, int options);wait阻塞等待任意一个子进程。waitpid可指定等待哪个子进程并支持非阻塞。返回值总览函数返回值含义wait() 0成功返回被回收的子进程PID-1失败没有子进程或出错errno被设置waitpid() 0成功返回被回收的子进程PID0非阻塞模式WNOHANG下没有子进程退出-1失败出错errno被设置参数解析pid-1等待任意子进程等同于wait。0等待指定PID的子进程。status输出型参数存放退出信息按位图编码。options0阻塞等待。WNOHANG非阻塞如果没有子进程退出则立即返回0。常用宏WIFEXITED(status)是否正常终止。WEXITSTATUS(status)提取退出码需先判断WIFEXITED。WTERMSIG(status)提取终止信号。if (WIFEXITED(status)) { printf(退出码: %d\n, WEXITSTATUS(status)); } else { printf(终止信号: %d\n, WTERMSIG(status)); }阻塞 vs 非阻塞等待阻塞父进程挂起直到子进程退出。非阻塞父进程轮询检查子进程状态期间可执行其他任务。非阻塞示例伪代码do { ret waitpid(-1, status, WNOHANG); if (ret 0) { // 执行临时任务 do_other_work(); } } while (ret 0);程序“换脑”进程程序替换什么是程序替换子进程fork后如果想执行一个全新的程序而非父进程代码就需要程序替换。原理将新程序的代码和数据加载到当前进程的地址空间。替换原有的代码段、数据段、堆栈。进程ID不变只是“内容”换了。exec函数族Linux 提供了 6 个exec系列函数它们都以exec开头但用法不同。int execl(const char *path, const char *arg, ...); int execlp(const char *file, const char *arg, ...); int execle(const char *path, const char *arg, ..., char *const envp[]); int execv(const char *path, char *const argv[]); int execvp(const char *file, char *const argv[]); int execve(const char *path, char *const argv[], char *const envp[]);命名规律l(list)参数以列表形式传递。v(vector)参数以数组形式传递。p(path)自动在PATH中搜索程序路径。e(env)自定义环境变量。注意调用成功则不返回。调用失败返回-1。只有execve是系统调用其他都是库函数。示例// 使用列表参数指定完整路径 execl(/bin/ls, ls, -l, NULL); // 使用数组参数自动搜索PATH char *argv[] {ls, -l, NULL}; execvp(ls, argv);

相关新闻

The Words in the Dictionary Are Arranged in Order: Understanding Alphabetization

The Words in the Dictionary Are Arranged in Order: Understanding Alphabetization

2026/8/26 16:06:35

🚀 TL;DR – Key TakeawaysAlphabetization is the systematic arrangement of words based on the order of letters in the English alphabet (A-Z). It’s not just about memorizing A-B-C—it’s about understanding letter priority, case sensitivity, punc…

免费开源的 ncmdump:3 步把网易云 NCM 音乐转成通用 MP3

免费开源的 ncmdump:3 步把网易云 NCM 音乐转成通用 MP3

2026/8/26 16:06:35

免费开源的 ncmdump:3 步把网易云 NCM 音乐转成通用 MP3 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump ncmdump 是一款免费开源的本地转换小工具,专门把网易云 NCM 加密音乐转成通用 MP3,全程离线…

Wan2.2-TI2V-5B 720P视频生成本地部署完整指南

Wan2.2-TI2V-5B 720P视频生成本地部署完整指南

2026/8/26 16:06:35

Wan2.2-TI2V-5B 720P视频生成本地部署完整指南 【免费下载链接】Wan2.2-TI2V-5B Wan2.2-TI2V-5B是一款开源的先进视频生成模型,基于创新的混合专家架构(MoE)设计,显著提升了视频生成的质量与效率。该模型支持文本生成视频和图像生…

光明语言已经完成了预定的开发工作,具体请看一下合并报告 :合并报告_第六轮.md 合并报告_第五轮.md咱们的光明语言,可以胜任DeepSeek-harness怎样的大型项目的开发工作了吗?

光明语言已经完成了预定的开发工作,具体请看一下合并报告 :合并报告_第六轮.md 合并报告_第五轮.md咱们的光明语言,可以胜任DeepSeek-harness怎样的大型项目的开发工作了吗?

2026/8/26 17:06:37

第六轮光明语言已经完成了预定的开发工作,具体请看一下合并报告 :合并报告_第六轮.md 合并报告_第五轮.md 咱们的光明语言,可以胜任DeepSeek-harness怎样的大型项目的开发工作了吗? 如果不行,请展开分析。 我们的第五轮…

LangGraph智能体开发的关键技术组件

LangGraph智能体开发的关键技术组件

2026/8/26 17:06:37

目录 1.3.1 图架构核心组件 1.3.2 监控与干预组件 1.3.3 工具与集成组件 LangGraph开发AI Agent实践(人工智能技术丛书)【行情 报价 价格 评测】-京东 LangGraph的核心架构围绕智能体开发需求设计,由多个关键技术组件协同工作&#xf…

MCU定时器PWM输出深度解析|全网独家拆解计数比较输出机制、精准配置频率占空比、助力电机调速LED呼吸灯工控闭环稳定输出

MCU定时器PWM输出深度解析|全网独家拆解计数比较输出机制、精准配置频率占空比、助力电机调速LED呼吸灯工控闭环稳定输出

2026/8/26 17:06:37

目录 摘要 0 前言 1 PWM核心原理与硬件输出核心价值 1.1 PWM信号核心定义与调控逻辑 1.2 软件PWM与硬件PWM核心差距 2 定时器PWM输出硬件架构与底层工作机制 2.1 PWM输出核心硬件单元 2.2 硬件PWM完整工作流程 3 PWM输出核心模式与波形对齐方式详解 3.1 PWM模式1与模…

Excel-match函数

Excel-match函数

2026/8/26 17:06:37

match()是Excel中用于查找某个值在区域中的位置(序号)的函数,常用于和index、vlookup搭配实现动态查找。 match()本质是:告诉你某个值在第几行或第几列。 match语法 =match(lookup_value,lookup_array,[match_type])参数 含义 lookup_value 要查找的值 lookup_array 查找…

于SpringBoot2+vue2智能无人仓库管理

于SpringBoot2+vue2智能无人仓库管理

2026/8/26 17:06:37

1. Base64 编码解锁技能,猴子打野出装需 5 大米 ,才能真正驾驭“猴三棒”的暴力美学 鞋子/小野刀/贪婪之噬/暗影战斧/泣血之刃/名刀司命 铭文组合为8夺萃、1狩猎、1兽痕、5祸源、5无双、10鹰眼 复制打开获取源代码:https://fifteen.xiaobias.…

翁恺 6

翁恺 6

2026/8/26 16:56:37

unsigned 叫无符号&#xff0c;用来修饰整数类型&#xff0c;只能存 ≥0 的非负数&#xff0c;不能存负数。非常容易踩的坑&#xff08;重点&#xff09;无符号数永远不会小于 0unsigned int x 0; x--; if(x < 0) // 条件永远不成立&#xff01;unsigned不可能小于0 {pri…

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

2026/8/26 1:50:39

首先光是一种能量的载体和形态&#xff0c;宏观上观察到的光是由无数个微观的光量子组成的&#xff0c;每个光子在产生的瞬间&#xff0c;其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前&#xff0c;在微观层面&#xff0c;每个光量子的运动轨迹是以波函数所展现…

SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

2026/8/26 1:49:16

1. 通话转接不是“挂断再拨号”&#xff0c;而是SIP会话的动态重定向你有没有遇到过这样的场景&#xff1a;客服坐席A正在和客户通电话&#xff0c;突然需要把这通对话无缝转给专家坐席B&#xff0c;客户完全感知不到中间的断连——既没听到忙音&#xff0c;也没被要求重新拨号…

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

2026/8/24 21:16:09

1. 为什么选择Kolla-ansible来部署单节点OpenStack&#xff1f;如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法&#xff0c;那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

2026/8/26 0:05:45

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要&#xff1a; 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数&#xff08;random()、unifor…

Hermes接入团队协作后,我推翻了三个效率假设

Hermes接入团队协作后,我推翻了三个效率假设

2026/8/26 0:05:45

聊《Hermes真能提效吗&#xff1f;先看流程里最慢的那一步》之前&#xff0c;先说一句实在的&#xff1a;别急着背概念&#xff0c;先看它在真实项目里到底解决什么问题。摘要团队把 Hermes 接进项目三个月后&#xff0c;交付速度没有提升反而慢了。复盘后发现&#xff0c;最先…

免费AI大模型调教指南:打造专属网文写作助手

免费AI大模型调教指南:打造专属网文写作助手

2026/8/26 0:05:45

1. 先搞清楚“AI小说扩展模式”到底能帮你做什么如果你是一个刚开始写网文、或者卡在L3级别以下的作者&#xff0c;最头疼的可能是情节推进不下去、人物对话干瘪&#xff0c;或者世界观设定不够丰满。自己对着空白文档硬憋&#xff0c;效率很低。这时候&#xff0c;一个能理解你…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/22 2:02:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具&#xff0c;覆盖选题构思、文献整理、内容生成、格式排版等核心场景&#xff0c;真正帮你高效搞定论文难题。 一、全流程王者&#xff1a;一站式搞定论文全链路&#xff08;一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/22 4:13:47

2026年真正好用的AI论文工具&#xff0c;核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测&#xff0c;千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队&#xff0c;覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/22 1:32:34

告别游戏崩溃&#xff1a;XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…