操作系统: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年,换了好几份工作(行业流行性大),每次工作都是裸辞。朋友都觉得不可思议。因为我一直对自己很有信心,而且特别不喜欢请假面试,对自己负责也对公司负责。 但是这次没想到市场环境非常不好,…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...