操作系统:06 进程通信
1 基本概念
进程间通信是指两个或多个进程之间交互数据的过程,因为进程之间是相互独立的,为了协同工作必须进行进程间交互数据
2 进程间通信的分类
2.1 简单的进程间通信:
信号(携带附加数据)、文件、命令行参数、环境变量表
2.2 传统的进程间通信:
管道文件(有名管道、匿名管道)
2.3 XSI的进程间通信:
共享内存、消息队列、信号量
2.4 网络的进程间通信:
套接字技术Socket
3 传统的进程间通信:管道文件
管道是UNIX系统中最古老的进程间通信方式,古老意味着所有系统都支持,早期的管道文件支持半双工通信,现在有些系统的管道支持全双工
管道是一种特殊的文件,它的数据在文件中是流动的,读取之后就消失,如果文件中没有数据可读取时读取操作会阻塞
3.1 有名管道
基于有文件名的管道文件的通信
3.1.1通信编程模型:
进程A 进程B
创建管道文件 ...
打开文件 打开文件
写数据 读数据
关闭管道 关闭管道
删除管道文件 ...
3.1.2创建有名管道:
命令: mkfifo filename
函数:
int mkfifo(const char *pathname, mode_t mode);
功能:创建有名管道文件
pathname:管道文件的路径
mode:文件权限
3.2匿名管道:
注意:只适合通过fork创建的父子进程之间通信
int pipe(int pipefd[2]);
功能:创建一个匿名管道文件
通过参数pipefd,返回该匿名管道文件的读文件描述符和写文件描述符
pipefd:存储读写fd的数组,输出型参数
pipefd[0] 用于读 pipefd[1] 用于写
3.2.1 匿名管道的编程模型:
父进程 子进程
创建获取匿名管道 ...
创建子进程 共享一对fd
关闭读 关闭写
写数据 读数据
关闭写 关闭读
3.2.2 XSI进程间通信:
X/open公司制定用于进程间通信的系统(S)接口(I)规范
XSI进程间通信都需要借助系统内核完成,需要创建内核对象来进行操作,内核对象以整数形式提供给调用者使用,类似于文件描述符\文件指针作为标识符存在,也叫做IPC标识符
文件描述符\文件指针需要借助唯一的文件名进行建立,IPC标识符的创建需要借助IPC键值(整数),如果想要创建不同的IPC标识符,需要一个独一无二的IPC键值(别人也没用过)
key_t ftok(const char *pathname, int proj_id);
功能:计算出一个IPC键值
pathname:项目路径
proj_id:项目编号
返回值:根据路径+编号计算出一个IPC键值
注意:项目路径必须是有效路径,否则如果为非法路径,无论两个参数是否相同,计算出来的IPC键值一定相同,那就没意义了
如果是有效路径,只要两个参数出现一个不同,那么就会计算出不相同的IPC键值,就有意义了
4 共享内存
4.1 基本特点
两个或多个进程之间共享一块由内核负责维护的内存,该段内存可以与多个不同的进程的虚拟内存建立映射
优点:操作简单,不需要读写磁盘、不需要复制,最快的一种XSI机制
缺点:需要考虑同步访问的问题,一般使用信号解决
4.2 使用
int shmget(key_t key, size_t size, int shmflg);
功能:创建/获取共享内存
key:IPC键值 ftok给
size:共享内存的大小,只有获取共享内存时此参数无意义就设置为0
shmflg:
IPC_CREAT 创建共享内存,已存在时则获取
IPC_EXCL 共享内存已存在时则返回失败
如果是获取直接赋0
注意:当创建共享内存时,需要额外提供该段共享内存的权限码,
例如shmget(xx,4096,IPC_CREAT|0644)
返回值:IPC标识符,是创建/获取得到的共享内存的标识,错误会返回-1(只要不是-1就代表创建/获取成功)
void *shmat(int shmid, const void *shmaddr, int shmflg);
shmid:IPC标识符
shmaddr:想要映射的虚拟内存首地址,如果为NULL时由操作系统自动选择
shmfig:
SHM_RND 当shmaddr不为NULL时才有效,标识从shmaddr开始取内存页的整数倍进行映射,提高内存读写效率
SHM_RDONLY 以只读方式映射共享内存
返回值:成功映射后的内存首地址,映射失败返回0xFFFFFFFF(-1)
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
功能:删除/控制共享内存
shmid:IPC标识符
cmd:
IPC_STAT 获取共享内存的属性数据 buf输出型参数(获取到的属性数据存储到buf里)
IPC_SET 设置共享内存的属性数据 buf输入性参数(使用者将要设置的属性数据存到buf里)
IPC_RMID 删除共享内存(IPC也会删掉,统统删光)
struct shmid_ds {
struct ipc_perm shm_perm; //所有者相关信息
size_t shm_segsz; //共享内存字节数
time_t shm_atime; //最后映射时间
time_t shm_dtime; //最后取消映射时间
time_t shm_ctime; //最后修改时间
pid_t shm_cpid; //创建者进程号PID
pid_t shm_lpid; //最后取消映射的进程号PID
shmatt_t shm_nattch; //当前映射次数
};
int shmdt(const void *shmaddr);
功能:取消虚拟内存与共享内存的映射
shmaddr:虚拟内存的首地址
4.3 编程模型
进程A 进程B
创建共享内存 获取共享内存
映射共享内存 映射共享内存
写数据并通知其它进程 接到通知后读数据
接到通知后读数据 写数据并通知其它进程
取消映射 取消映射
删除共享内存 ...
5 消息队列
5.1 基础概念
由内核负责维护管理的数据链表结构,通过消息类型来对应的收发数据
5.2 使用
int msgget(key_t key, int msgflg);
功能:创建/获取消息队列
key:IPC键值 ftok给
shmflg:
IPC_CREAT 创建消息队列,已存在时则获取
IPC_EXCL 消息队列已存在时则返回失败
如果是获取直接赋0
注意:当创建消息队列时,需要额外提供该消息队列的权限码,
返回值:IPC标识符,是创建/获取得到的共享内存的标识,错误会返回-1(只要不是-1就代表创建/获取成功)
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
功能:向消息队列发送消息包
msqid:IPC标识符
msgp:消息包结构首地址
struct msgbuf {
long mtype; //消息类型,必须>0
char mtext[n]; //消息数据
};
msgsz:消息数据的字节数即mtext的字节数
msgflg:
0 阻塞发送
IPC_NOWAIT 当消息队列满时,立即结束并返回,
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);
功能:从消息队列中接收对应的消息包中的数据
msqid:IPC标识符
msgp:存储读取到的消息包结构首地址
struct msgbuf {
long mtype; //消息类型,必须>0
char mtext[n]; //消息数据
};
msgsz:消息包结构体字节数
msgtyp:要接收的消息类型几号
0 读取当前消息队列中的第一条消息包
>0 读取消息类型为msgtyp的消息包
<0 读取消息类型<abs(msgtyp)的消息包,若有多个,则读取消息类型最小值的消息包
msgflg:一般写0
IPC_NOWAIT如果没有符合的消息包,则立即返回不阻塞
MSG_EXCEPT 如果msgtyp>0,则读取第一个值不等于msgtyp的消息包
MSG_NOERROR 如果不包含此标志,实际消息包的字节数>msgtyp时会返回错误并不读取,如果包含,则不报错并只读取前msgtyp个字节
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
功能:删除\控制消息队列
shmid:IPC标识符
cmd:
IPC_STAT 获取消息队列的属性数据 buf输出型参数
IPC_SET 设置消息队列的属性数据 buf输入型参数
IPC_RMID 删除消息队列 buf无意义NULL
buf:
消息队列属性结构体
5.3 编程模型
进程A 进程B
创建消息队列 获取消息队列
发送消息 接收消息
接收不同的消息包 发送不同的消息包
删除消息 ...
6 信号量
6.1基本特点
由内核来维护共存给若干个进程的“全局变量”,用于记录共享资源的数量,限制进程对共享资源的访问
信号量是一种数据操作锁,本身不具备完整的数据通信交换功能而是通过控制其他的通信资源来更好地实现进程间通信
1、如果信号量的值>0,说明可以使用资源,需要先信号量-1.然后再使用
2、如果信号量的值=0,说明没有资源可以使用,此时进程进入休眠,直到信号量的值>0,进程会被唤醒,执行步骤1
3、当资源使用完毕后,先把信号量的值+1,然后内核会唤醒正在休眠的进程
int semget(key_t key,int nsems,int semflg)
功能:创建/获取信号量
key:IPC键值
nsems:信号量整体个数,一般写1
semflg:
返回值:IPC标识符
int semop(int semid,struct sembuf *sops,size_t nsops);
功能:对信号量的值进行操作
semid:标识符
相关文章:
操作系统:06 进程通信
1 基本概念 进程间通信是指两个或多个进程之间交互数据的过程,因为进程之间是相互独立的,为了协同工作必须进行进程间交互数据 2 进程间通信的分类 2.1 简单的进程间通信: 信号(携带附加数据)、文件、命令行参数、环境变量表 2.2 传统的进…...

WRF模式
随着生态文明建设和“碳中和”战略的持续推进,我国及全球气候变化及应对是政府、科学界及商业界关注的焦点。气候是多个领域(生态、水资源、风资源及碳中和等问题)的主要驱动因素,合理认知气候变化有利于解释生态环境变化机理及过…...

2直接连接的网络与VLAN划分【实验】【计算机网络】
2直接连接的网络与VLAN划分【实验】【计算机网络】 前言推荐2直接连接的网络与VLAN划分2.1共享式以太网和交换式以太网实验目的实验内容及实验环境实验原理共享式以太网交换式以太网 实验过程搭建实验环境初始化序训练操作共享式以太网-操作交换式以太网查看共享式以太网冲突查…...
【Linux0.11代码分析】04 之 head.s 启动流程
【Linux0.11代码分析】04 之 head.s 启动流程 一、boot/head.s 系列文章如下: 系列文章汇总:《【Linux0.11代码分析】之 系列文章链接汇总(全)》 . 1.《【Linux0.11代码分析】01 之 代码目录分析》 2.《【Linux0.11代码分析】02 之…...

自动化测试和selenium的使用
目录 自动化测试定义 为什么选择selenium来作为我们web自动化测试的工具? 自动化测试定位元素 使用cssSelector定位 使用XPath 定位 操作测试对象 模拟手动从键盘输入 点击对象 获取页面文本 清除对象输入的文本内容 添加等待(三种方式&#…...
Ubuntu常用终端操作
终端快捷键 打开 Ctrlaltt:打开终端(默认路径为家目录) Ctrlshiftn:打开终端(与当前终端处于同一路径下) Ctrlshiftt:打开终端(在大终端下面创建小终端) alt数字 关闭 exitCtrld 窗口切换 …...
Spring Security 6.x 系列【34】认证篇之前后端分离场景下的集成方案
有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.0.4 本系列Spring Security 版本 6.0.2 源码地址:https://gitee.com/pearl-organization/study-spring-security-demo 文章目录 1. 前言2. 案例演示2.1 未认证2.2 认证成功2.3 认证失败2.4 权限不足2.5 注…...
Qt之QTextToSpeech 让你的应用程序说话
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言QTextToSpeech基础使用1.创建一个QTextToSpeech对象2.朗读文字3.朗读文件和状态信息4.设置QTTS(QTextToSpeech)属性5.输出支持区域的设置列表、语言6.实现小数点朗读QTextToSpeech项目(练习)…...
为什么程序员喜欢用Linux?
Linux哪些行业在运用? Linux系统运用极其广泛,不少用户只知道windows,是因为,Linux的运用主要是在企业端。现在科技极其发达,我们手机在手,就能干很多事情,只需点一点屏幕,轻松完成…...
leetcode 598. 范围求和 II
题目描述解题思路执行结果 leetcode 598. 范围求和 II 题目描述 范围求和 II 给你一个 m x n 的矩阵 M ,初始化时所有的 0 和一个操作数组 op ,其中 ops[i] [ai, bi] 意味着当所有的 0 < x < ai 和 0 < y < bi 时, M[x][y] 应该…...
javaweb前置知识
1.CSS CSS的角色:页面显示的美观风格CSS的基础语法:标签样式;类样式;ID样式;组合样式;嵌入式样式表;内部样式表;外部样式表盒子模型:border、margin、padding定位和浮动…...

基于微信小程序的酒店预定管理系统设计与实现
第1章 绪论 1 1.1开发背景与意义 1 1.2开发方法 1 1.3论文结构 1 2系统开发技术与环境 3 2.1 系统开发语言 3 2.2 系统开发工具 3 2.3 系统页面技术 3 2.4 系统数据库的选择 4 2.5 系统的运行环境 4 2.5.1 硬件环境 4 2.5.2 软件环境 4 3系统分析 5 3.1可行性分析 5 3.1.1 经济…...
26. Service——深入学习
本章讲解知识点 Service 会话保持机制Service 的多端口设置Service 支持的网络协议Kubernetes 的服务发现机制Headless ServiceEndpoint Slices这一节我们来讲讲 Service 更多细节 1. Service 会话保持机制 Service 支持通过设置 sessionAffinity 实现基于客户端 IP 的会话保…...
【算法】Check If Word Is Valid After Substitutions 检查替换后的词是否有效
文章目录 Check If Word Is Valid After Substitutions 检查替换后的词是否有效问题描述:分析代码 Tag Check If Word Is Valid After Substitutions 检查替换后的词是否有效 问题描述: 给你一个字符串 s ,请你判断它是否 有效 。 字符串 s…...

基于jenkinsfile布置java工程
需求 通过jenkins发布java项目到服务器 预备环境 项目地址: https://gitee.com/asaland/sb-docker-appJenkins 2.387.3 通过Jenkinsfile实现方式 jenkins ui 配置pipeline 什么是pipeline? 直接看注释吧,简单点就是编排可以多个跨时间的构建代理…...
Spring JpaTransactionManager事务管理
首先,在做关于JpaTransactionManager之前,先对Jpa做一个简单的了解,他毕竟不如hibernate那么热门,其实二者很相识,只不过后期hibernate和JDO 版本都已经兼容了其Jpa,目前大家用的少了。 JPA全称Java Persi…...
全国职业院校技能大赛网络建设与运维赛项赛题(七)
全国职业院校技能大赛 网络建设与运维 赛题 (七)...

asp.net+sqlserver企业公司进销存管理系统
基于WEB的进销存管理系统主要企业内部提供服务,系统分为管理员,和员工2部分。 在本基于WEB的进销存管理系统中分为管理员,和普通用户2中模式,其中管理人员主要是对企业内商品类型。商品信息商品的出入库信息,以及员工…...

WxGL应用实例:绘制点云
WxGL附带了几个工具函数,其中read_pcfile用来解析.ply和.pcd格式的点云文件,该函数返回一个PointCloudData类实例,包含以下属性: PointCloudData.ok - 数据是否可用,布尔型PointCloudData.info - 数据可用性说明&…...

一个月内面了30家公司,薪资从18K变成28K,真行啊····
工作3年,换了好几份工作(行业流行性大),每次工作都是裸辞。朋友都觉得不可思议。因为我一直对自己很有信心,而且特别不喜欢请假面试,对自己负责也对公司负责。 但是这次没想到市场环境非常不好,…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...

初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...