Linux环境编程第二天笔记

Linux环境编程第二天

fork()
  1. fork()会使得进程本身被复制,父子进程几乎一模一样。

    被复制的

    • 实际的UID和GID,以及有效的UID和GID

    • 所有的环境变量

    • 进程组ID和会话ID

    • 当前的工作路径,除非用chdir()修改

    • 打开的文件

    • 信号响应函数

    • 整个内存空间、包括栈、堆、数据段、代码段、标准I/O的缓冲区

    没被复制的

    • 进程的PID

    • 记录锁

    • 挂起的信号。

  2. 子进程会从fork()返回值后的下一逻辑语句开始执行。

  3. 父子进程相平等,并发执行,无法确定谁先谁后。

  4. ·父子进程是相互独立的:子进程完整的复制了父进程的内存空间,从内存的角度来看,父子进程是相互独立、互不影响的(无论是栈、堆、全局、静态数据、文本数据,子进程在产生时都会拷贝一份,连同虚拟内存)。

  5. fork()之前打开的文件,父子进程共享同一个文件的文件偏移量,但父进程提前退出,会导致终端回收 I/O 资源,子进程stdin失效。

    //测试代码 int c = fgetc(stdin); if (c == EOF) { printf("子进程stdin已失效,无法读取输入\n"); // 重置文件指针(避免影响后续操作) clearerr(stdin); }
  • 每个进程都有其独立的虚拟内存空间,而非物理内存

  • 子进程的很多实现并不执行父进程的完整副本。作为替代,使用了写时复制(COW)技术,这些区域由父子进程共享,内核将其访问权限改为只读。如果父子进程中任意一个试图修改这些区域,内核会只为修改区域制作一个副本。

fork和vfork的区别:

  1. fork函数采用写时复制:父子进程共享代码段,数据段和堆栈修改时才会复制,初始时共享物理内存

  2. vfork完全共享地址空间:父子进程共用一套数据段和堆栈,无写时复制,子进程修改数据会直接影响父进程执行顺序

  3. fork函数父子进程执行顺序不确定,由操作系统调度器决定。

  4. fork强制子进程先执行,父进程会被阻塞,直到子进程调用exec函数簇替换程序或调用_exit退出。

设计目的

  1. fouk适用于子进程需要独立执行父进程的代码,或后续执行其他操作。

  2. vfork专为子进程创建后立即调用exec设计,减少内存复制开销提升效率。

安全性:

  1. fork安全性高,父子进程地址空间相互隔离。

  2. vfork安全性较低,子进程修改数据会覆盖父进程数据;如果子进程未及时调用exec/exit,容易引发程序异常

返回值

  1. fork成功时父进程返回子进程PID,子进程返回0,失败返回-1。

  2. vfork与fork完全一样。

退出进程

  1. vfork创建的子进程必须调用_exit退出,不能调用exit,否则会刷新缓冲区

Linux提供了另一种进程创建函数clone(),它允许调用者控制哪一部分由父子进程共享

exit

exit和_exit区别:exit执行流程: 1、调用 atexit 注册退出处理函数。 2、刷新并打开所有打开的标准IO流。 3、删除创建的临时文件(tempfile函数)。 4、调用_exit进入内核态,进程终止,同时将 status(子进程的退出值) 传递给父进程。

_exit执行流程: 1、直接触发内核态的系统调用,跳过所有用户态下的清理步骤。 2、内核负责关闭进程所有打开的文件描述符、释放内存资源等。 3、向父进程发送信号,传递status值。

wait和waitpid

wait和waitpid用于等待子进程的状态变化

#include <sys/types.h> #include <sys/wait.h> ​ pid_t wait(int *status); // 等待任意子进程 pid_t waitpid(pid_t pid, int *status, int options); // 等待特定子进程

如果status不是一个空指针,则终止进程的终止信号存放在它所指向的单元里.如果不关心终止状态,则可将该参数指定为空指针。

wait

  • 等待任意一个子进程终止

  • 如果子进程已经终止,则立即返回

wapid

参数pid效果
pid==-1等待任意子进程
pid>0等待进程id与参数pid相等的子进程
pid==0等待组id等于调用进程组id的任意进程
pid<-1等待id等于参数pid的绝对值的子进程
参数options
0默认,阻塞等待
WNOHANG非阻塞,如果没有子进程退出则立即返回
WUNTRACED如果子进程暂停,也返回(比如Ctrl+c)

如果一个进程希望等待子进程终止,它可以使用wait();

如果一个进程希望等待父进程终止,则可以

while(getppid()!=1) { sleep(1); }
exec簇

当进程调用exec函数时,该进程会完全替换为新程序

返回值:成功不返回,失败返回-1

#include <unistd.h> ​ extern char **environ; ​ int execl(const char *path, const char *arg, ... /* (char *) NULL */); int execlp(const char *file, const char *arg, ... /* (char *) NULL */); int execle(const char *path, const char *arg, ... /*, (char *) NULL, char * const envp[] */); int execv(const char *path, char *const argv[]); int execvp(const char *file, char *const argv[]); int execvpe(const char *file, char *const argv[], char *const envp[]); // GNU扩展
参数意义
path即将被加载执行的ELF文件或脚本的路径
file即将被加载执行的ELF文件或脚本的名字
arg以列表方式罗列的的ELF文件或脚本的参数
argv[]以数组方式组织的ELF文件或脚本的参数
envp[]用户自定义的环境变量数组
字母说明
l参数以列表形式传递(可变参数)
v参数以数组形式传递
pPATH环境变量中查找可执行文件
e可以指定新的环境变量
进程组

每个进程除了有一个进程ID以外,还属于一个进程组。

进程组是一个或多个进程的集合。每个进程组有一个唯一的进程组ID

每个进程组有一个组长进程,组长进程的进程组ID等于其进程ID(即PGID=PID)

进程组组长可以创建一个进程组、创建该组中的进程,然后终止。只要在某个进程组中有一个进程存在,则该进程组就存在,这与组长进程是否终止无关

对话期(会话)

会话是一个或多个进程组的集合。会话由首进程创建,会话内所有进程共享一个控制终端。

创建会话的进程,其PID=会话ID(SID),该进程不能是其他进程组的组长

一个会话包含多个进程组,进程组又分为前台进程组和后台进程组。

控制终端

一个会话可以有一个控制终端。

建立与控制终端连接的会话首进程被称为控制进程

一个会话中的几个进程组可被分为一个前台进程组以及一个或多个后台进程组

如果一个会话有一个控制终端,则它有一个前台进程组,其他进程组为后台进程组。

无论何时键入中断健(Delete或Ctlr+C)/退出键(Ctrl+\),都会将中断信号/退出信号发送至前台进程组的所有进程。

守护进程

守护进程是生存周期长的一种进程。它们一般在系统引导装入时启动,仅在系统关闭时才终止。

系统进程依赖于操作系统实现,父进程ID为0的各进程通常是内核进程,它们作为系统引导装入过程的一部分而启动。内核进程是特殊的,通常在整个系统的生命周期中。它们以超级用户特权运行,无控制终端,无命令行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1190673.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch近实时搜索揭秘:1秒内可查如何实现?

当你在 Kibana 中查询刚生成的日志&#xff0c;或在电商网站搜索刚上架的商品时&#xff0c;可能会好奇&#xff1a;数据写入后不到 1 秒就能搜到&#xff0c;这是如何实现的&#xff1f; 这背后就是 Elasticsearch (ES) 的“近实时”&#xff08;Near Real-Time, NRT&#xff…

Llama 3在哪些领域有实际应用?

1.Llama 3在哪些领域有实际应用&#xff1f;Llama 3 凭借其开源、高性能、可微调、支持长上下文和多语言等优势&#xff0c;已在多个领域展现出广泛的实际应用价值。尽管原生版本对中文支持有限&#xff0c;但通过微调&#xff08;SFT/LoRA&#xff09;或结合RAG&#xff08;检…

导师严选9个AI论文工具,自考本科论文格式规范+写作神器推荐!

导师严选9个AI论文工具&#xff0c;自考本科论文格式规范写作神器推荐&#xff01; AI 工具如何让论文写作更高效 在自考本科的道路上&#xff0c;论文写作无疑是一个重要且令人头疼的环节。随着人工智能技术的不断进步&#xff0c;越来越多的 AI 工具被应用于学术写作中&#…

OpenOCD JTAG协议开发完全指南

OpenOCD JTAG协议开发完全指南 版本: 1.0 日期: 2026年1月 适用范围: RISC-V调试、FPGA开发、嵌入式系统调试 目录 JTAG基础概念 OpenOCD架构 JTAG协议层次 JTAG状态机 IR/DR扫描操作 OpenOCD API详解 RISC-V调试规范 实际应用案例 常见问题排查 JTAG基础概念 什么是JTAG? …

使用 pip3 一键卸载当前环境中所有已安装的 Python 包(Linux / macOS / Windows)

在 Python 开发过程中&#xff0c;随着不断安装和测试各种库&#xff0c;环境很容易变得臃肿、混乱。 当出现依赖冲突、版本错乱或准备重建环境时&#xff0c;一次性卸载所有第三方包是一个高效的解决方案。 本文介绍一种通用、安全、可控的方法&#xff0c;适用于&#xff1a;…

【总结】说课基本框架

高中信息技术课程说课的基本框架通常围绕教学设计的系统性、科学性和育人价值展开,强调以学生为中心、项目驱动、素养导向。根据所提供的知识库内容,可总结出一个清晰、通用且符合当前教改趋势的说课结构如下:一、教…

Linux运维必备:一个LVM管理添加和扩容脚本的诞生记(完整版)

从简单需求到踩坑无数&#xff0c;最终炼成自动化神器。本文记录了一个LVM管理脚本的完整开发历程&#xff0c;包含所有踩过的坑和最终解决方案。附赠可直接使用的纯净版脚本。一、起因&#xff1a;一个看似简单的小需求那天&#xff0c;一位运维兄弟在群里求助&#xff1a;&qu…

openocd操作ku060板子记录

OpenOCD 操作 KU060 FPGA 核心原理 概述 本文档深入解析 OpenOCD 如何通过 JTAG 接口操作 KU060 FPGA 开发板&#xff0c;包括 Flash 刷写、内存检查、GDB 调试和板子状态检查等核心功能的底层原理。1. OpenOCD 架构与连接原理 1.1 JTAG 接口连接 主机(PC) --USB--> FT2232 …

《排序算法全解析:从基础到优化,一文吃透八大排序!》

本文详解冒泡、选择、插入等基础排序,以及快排、归并、堆排、希尔等高级排序的原理、c语言代码实现,对比各算法时间复杂读/空间复杂度,附代码详细注释,帮你彻底搞懂排序!一、为什么我们需要读懂排序--不止于"…

Linux命令大全-grep命令

一、简介grep(英文全拼: Global Regular Expression Print)命令用于查找文件里符合条件的字符串或正则表达式&#xff0c;并将符合条件的内容进行输出。二、语法语法&#xff1a;grep [选项]... PATTERN [FILE]...PATTERN&#xff1a;是一个基本正则表达式(缩写为BRE)&#xff…

ue c++编译报错解决

目录 e1696 无法打开 源 文件 "IMQTTClient.h" 解决方法&#xff1a; e1696 无法打开 源 文件 "IMQTTClient.h" 解决方法&#xff1a; 删除 目录&#xff1a; .vs Binaries Intermediate Saved 选中文件&#xff1a; MetahumancharacterHeiXi.uproje…

解析nanogpt - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

计算机毕业设计springboot线上票务系统app 基于Spring Boot的移动票务管理平台开发 Spring Boot框架下的线上票务系统设计与实现

计算机毕业设计springboot线上票务系统app_ck27e &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。随着互联网技术的飞速发展&#xff0c;线上票务系统已经成为人们日常生活中不可…

集合幂级数全家桶

集合幂级数 exp 求 \(e^{F(x)} = \sum\limits_{i \ge 0} \dfrac{F(x)^i}{i!}\),其中若 \(S \cap T = \varnothing\),则 \(x^S \times x^T = x^{S \cup T}\)。 定义二元函数 \(F(x, y) = \sum x^S y^{|S|} a_S\),这样…

计算机毕业设计springboot大气网格化治理智慧平台-报警处理子系统 基于SpringBoot的城市大气环境网格化智能预警与处置平台 SpringBoot驱动的空气质量网格监管报警协同系统

计算机毕业设计springboot大气网格化治理智慧平台-报警处理子系统9w1d1 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。PM2.5爆表那天&#xff0c;整个城市像被按下了灰色滤镜。…

AtCoder Beginner Contest竞赛题解 | AtCoder Beginner Contest 440

​欢迎大家订阅我的专栏&#xff1a;算法题解&#xff1a;C与Python实现&#xff01; 本专栏旨在帮助大家从基础到进阶 &#xff0c;逐步提升编程能力&#xff0c;助力信息学竞赛备战&#xff01; 专栏特色 1.经典算法练习&#xff1a;根据信息学竞赛大纲&#xff0c;精心挑选…

近十届两院增选院士籍贯 / 出生地排行:苏浙皖湘鲁霸榜

整理了近十届两院增选院士的籍贯、出生地数据&#xff1a; ✅ 维度一&#xff1a;院士「籍贯」&#xff08;最能体现地域文教底蕴&#xff09; 籍贯人数 TOP20 核心榜单&#xff08;头部集中度极高&#xff09; 1、浙江宁波 28 人&#xff08;全国第一&#xff0c;70年的稳定输…

LeetCode 379 电话目录管理系统

文章目录摘要描述题解答案题解代码分析1. 数据结构的选择2. 初始化方法3. get() 方法&#xff1a;分配号码4. check() 方法&#xff1a;检查号码是否可用5. release() 方法&#xff1a;释放号码6. 为什么使用 Set Array 的组合&#xff1f;7. 边界情况处理示例测试及结果示例 …

量子计算模拟器性能基准测试方法论

随着量子算法在金融建模、药物研发等领域的应用突破&#xff0c;量子计算模拟器已成为经典计算机环境验证量子程序的核心工具。软件测试从业者亟需建立一套针对量子特性的标准化基准测试体系。本文旨在系统阐述测试框架的设计原则、关键性能指标及工具链实践方案&#xff0c;为…

基于微信小程序的电子元器件商城系统源码文档部署文档代码讲解等

课题介绍本课题旨在开发一款基于微信小程序的电子元器件商城系统&#xff0c;适配电子元器件品类多、规格杂、采购场景多元的特性&#xff0c;解决传统采购渠道分散、比价繁琐、库存查询不便等痛点。系统以微信小程序为前端载体&#xff0c;依托Node.js搭建后端服务&#xff0c…