Linux操作系统——第四章 进程间通信

news2024/11/27 14:38:43

 

 

目录

进程间通信介绍

进程间通信目的

进程间通信发展

进程间通信分类

管道

System V IPC

POSIX IPC

管道

什么是管道

匿名管道

管道读写规则

管道特点

命名管道

创建一个命名管道

匿名管道与命名管道的区别

命名管道的打开规则

system V共享内存

共享内存示意图 

共享内存数据结构

共享内存函数

shmget函数 

shmat函数

 shmdt函数

shmctl函数

进程互斥


 



进程间通信介绍




进程间通信目的



数据传输:一个进程需要将它的数据发送给另一个进程
资源共享:多个进程之间共享同样的资源。
通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。
进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。



进程间通信发展



管道

System V进程间通信
POSIX进程间通信



进程间通信分类



管道



匿名管道pipe
命名管道



System V IPC


System V 消息队列
System V 共享内存
System V 信号量


POSIX IPC


消息队列
共享内存
信号量
互斥量
条件变量
读写锁



管道




什么是管道



管道是Unix中最古老的进程间通信的形式。
我们把从一个进程连接到另一个进程的一个数据流称为一个“管道

 


匿名管道


#include <unistd.h>
功能:创建一无名管道
原型 int pipe(int fd[2]);
参数
fd:文件描述符数组,其中fd[0]表示读端, fd[1]表示写端
返回值:成功返回0,失败返回错误代码 

 


管道读写规则



当没有数据可读时

  • O_NONBLOCK disable:read调用阻塞,即进程暂停执行,一直等到有数据来到为止。
  • O_NONBLOCK enable:read调用返回-1,errno值为EAGAIN。


当管道满的时候

  • O_NONBLOCK disable: write调用阻塞,直到有进程读走数据
  • O_NONBLOCK enable:调用返回-1,errno值为EAGAIN

如果所有管道端对应的文件描述符被关闭,则read返回0
如果所有管道端对应的文件描述符被关闭,则write操作会产生信号SIGPIPE,进而可能导致write进程退出
当要写入的数据量不大于PIPE_BUF时,linux将保证写入的原子性。
当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。 

 


管道特点


  • 只能用于具有共同祖先的进程(具有亲缘关系的进程)之间进行通信;通常,一个管道由一个进程创建,然后该进程调用fork,此后父、子进程之间就可应用该管道。
  • 管道提供流式服务

                一般而言,进程退出,管道释放,所以管道的生命周期随进程
                一般而言,内核会对管道操作进行同步与互斥

  • 管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道

 

 

 


命名管道


  • 管道应用的一个限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信。
  • 如果我们想在不相关的进程之间交换数据,可以使用FIFO文件来做这项工作,它经常被称为命名管道。
  • 命名管道是一种特殊类型的文件

创建一个命名管道



命名管道可以从命令行上创建,命令行方法是使用下面这个命令:

mkfifo filename 

命名管道也可以从程序里创建,相关函数有

int mkfifo(const char *filename文件名 ,   mode_t mode文件权限);


匿名管道与命名管道的区别


  • 匿名管道由pipe函数创建并打开。
  • 命名管道由mkfifo函数创建,打开用open
  • FIFO(命名管道)与pipe(匿名管道)之间唯一的区别在它们创建与打开的方式不同,一旦这些工作完成之后,它们具有相同的语义。

命名管道的打开规则


  • 如果当前打开操作是为读而打开FIFO时

                O_NONBLOCK disable:阻塞直到有相应进程为写而打开该FIFO
                O_NONBLOCK enable:立刻返回成功

  • 如果当前打开操作是为写而打开FIFO时

                O_NONBLOCK disable:阻塞直到有相应进程为读而打开该FIFO
                O_NONBLOCK enable:立刻返回失败,错误码为ENXIO



system V共享内存




共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据


共享内存示意图 


 


共享内存数据结构


 struct shmid_ds {
struct ipc_perm shm_perm; /* operation perms */
int shm_segsz; /* size of segment (bytes) */
__kernel_time_t shm_atime; /* last attach time */
__kernel_time_t shm_dtime; /* last detach time */
__kernel_time_t shm_ctime; /* last change time */
__kernel_ipc_pid_t shm_cpid; /* pid of creator */
__kernel_ipc_pid_t shm_lpid; /* pid of last operator */
unsigned short shm_nattch; /* no. of current attaches */
unsigned short shm_unused; /* compatibility */
void *shm_unused2; /* ditto - used by DIPC */
void *shm_unused3; /* unused */
}


共享内存函数



shmget函数 


功能:用来创建共享内存
原型
int shmget(key_t key, size_t size, int shmflg);
参数
key:这个共享内存段名字
size:共享内存大小
shmflg:由九个权限标志构成,它们的用法和创建文件时使用的mode模式标志是一样的
返回值:成功返回一个非负整数,即该共享内存段的标识码;失败返回-1


shmat函数


功能:将共享内存段连接到进程地址空间
原型
void *shmat(int shmid, const void *shmaddr, int shmflg);
参数
shmid: 共享内存标识
shmaddr:指定连接的地址
shmflg:它的两个可能取值是SHM_RND和SHM_RDONLY
返回值:成功返回一个指针,指向共享内存第一个节;失败返回-1

shmaddr为NULL,核心自动选择一个地址
shmaddr不为NULL且shmflg无SHM_RND标记,则以shmaddr为连接地址。
shmaddr不为NULL且shmflg设置了SHM_RND标记,则连接的地址会自动向下调整为SHMLBA的整数倍。公式:shmaddr -
(shmaddr % SHMLBA)
shmflg=SHM_RDONLY,表示连接操作用来只读共享内存


 shmdt函数


功能:将共享内存段与当前进程脱离
原型
int shmdt(const void *shmaddr);
参数
shmaddr: 由shmat所返回的指针
返回值:成功返回0;失败返回-1
注意:将共享内存段与当前进程脱离不等于删除共享内存段

 


shmctl函数


功能:用于控制共享内存
原型
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
参数
shmid:由shmget返回的共享内存标识码
cmd:将要采取的动作(有三个可取值)
buf:指向一个保存着共享内存的模式状态和访问权限的数据结构
返回值:成功返回0;失败返回-1


 注意:共享内存没有进行同步与互斥


进程互斥


  • 由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种关系为进程的互斥
  • 系统中某些资源一次只允许一个进程使用,称这样的资源为临界资源或互斥资源。
  • 在进程中涉及到互斥资源的程序段叫临界区
  • 特性方面:IPC资源必须删除,否则不会自动清除,除非重启,所以system V IPC资源的生命周期随内核 

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

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

相关文章

【SpringBoot】解决依赖版本不一致报错问题

哈喽大家好&#xff0c;我是阿Q。今天在开发代码的过程中&#xff0c;由于手抖&#xff0c;不知道引入了什么包依赖&#xff0c;导致项目启动一直报错&#xff0c;特写本文来记录下解决问题的经过。 文章目录 问题描述报错信息如下报错描述 解决方法总结 问题描述 报错信息如下…

vite中使用 vite- aliases 插件报错

vite 中使用 vite-aliases 插件报错 vite-aliases 介绍报错内容解决方法 vite-aliases 介绍 vite-aliases 可以帮助我们自动生成别名: 检测你当前目录下包括 src 在内的所有文件夹, 并帮助我们去生成别名。 下载 npm i vite-aliases -D 使用 import { defineConfig } from vi…

VALSE 2023 无锡线下参会个人总结 6月11日-2

VALSE2023无锡线下参会个人总结 6月11日-2 6月11日会议日程安排Workshop&#xff1a;目标检测与分割程明明&#xff1a;粒度自适应的图像感知技术张兆翔&#xff1a;基于多传感器融合的视觉物体检测与分割 Workshop&#xff1a;ChatGPT与计算机视觉白翔&#xff1a;再谈ChatGPT…

290. 单词规律

290. 单词规律 C代码&#xff1a;别人手搓的 bool wordPattern(char * pattern, char * s){char arr[301][3001];char *p strtok(s, " ");int pos 0;while(p ! NULL) {sprintf(arr[pos], "%s", p);p strtok(NULL, " ");}int len strlen(pat…

Linux环境安装Jdk图文步骤

准备工作&#xff1a; a、jdk安装包&#xff1a;百度网盘 请输入提取码&#xff0c;提取码&#xff1a;jdk8 b、远程工具&#xff0c;xshell&#xff0c;&#xff0c;electerm&#xff0c;&#xff0c;MobaXterm&#xff0c;&#xff0c;fxp&#xff0c;docker&#xff0c;宝…

软件测试V、W和H模型的优缺点汇总,零基础必看哦

目录 V模型 W模型 H模型 总结&#xff1a; 软件测试有三种模型&#xff0c;分别是V模型&#xff0c;W模型和H模型。每种模型都有自己的优点和缺点。 V模型 V模型如下图所示&#xff1a; V模型的优点 V模型明确地标识出了在开发过程中一般应完成的测试级别&#xff0c;以及…

STM32-HAL库串口DMA空闲中断的正确使用方式+解析SBUS信号

STM32-HAL库串口DMA空闲中断的正确使用方式解析SBUS信号 一. 问题描述二. 方法一——使用HAL_UART_Receive_DMA三. 方法二——使用HAL_UARTEx_ReceiveToIdle_DMA四. 方法三——使用HAL_UARTEx_ReceiveToIdle_IT&#xff08;不使用DMA&#xff09;五. 总结 一. 问题描述 能够点…

java springboot整合MyBatis-Plus 多用点Plus支持一下国人开发的东西吧

文章java springboot整合MyBatis做数据库查询操作讲述了boot项目整合MyBatis的操作方法 但现在就还有一个 MyBatis-Plus Plus是国内整合的一个技术 国内的很多人会喜欢用 特别是一些中小型公司 他们用着会比较舒服 好 然后我们打开idea 创建一个项目 选择 Spring Initializr…

(九)CSharp-数组

一、矩形数组 1、访问数组元素 class Program{static void Main(string[] args){int[] intArr1 new int[15];intArr1[2] 10;int var1 intArr1[2];int[,] intArr2 new int[5, 10];intArr2[2, 3] 7;int var2 intArr2[2, 3];int[] myIntArray new int[4];for (int i 0; i…

Git 报错 Updates were rejected because the remote contains work that you do

目录 Git 报错 Updates were rejected because the remote contains work that you do 1、命令行出现这种情况 2、idea出现同样的报错&#xff0c;解决方式同上 Git 报错 Updates were rejected because the remote contains work that you do 这个报错实在是让我受不了了&…

Kendo UI for jQuery---03.组件___网格---05.编辑---01.概述

编辑概述 编辑是剑道 UI 网格的一项基本功能&#xff0c;它允许您操作其数据的呈现方式。 网格提供以下编辑模式&#xff1a; 批量编辑 内联编辑 弹出窗口编辑 自定义编辑开始 要启用编辑&#xff1a; 熟悉剑道UI中的常见编辑概念 配置网格的数据源 通过配置定义字段schem…

PaddleOCR Windows下配置环境并测试

目录 1.PaddleOCR 介绍 1.2 PaddleOCR支持模型介绍 2.环境配置 3.PaddleOCR源码 1.PaddleOCR 介绍 PaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库&#xff0c;助力开发者训练出更好的模型&#xff0c;并应用落地。 支持多种OCR相关前沿算法&#xff0c;在此基础上打…

简单的一批的DockerFile构建(内附超详细docker学习笔记)

目录 介绍 DockerFile常用保留字指令 演示自定义构建java8版本centos docker专用学习笔记 超全 介绍 总结: 从应用软件的角度来看&#xff0c;Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段&#xff0c; * Dockerfile是软件的原材料 * Docker镜像是软件…

SpringBoot参数校验入门

一、添加依赖 <!--参数校验--> <dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId> </dependency> <!--lombok--> <dependency><groupId>org.projectlombok&…

few-shot object counting论文汇总

文章目录 2021OBJECT COUNTING: YOU ONLY NEED TO LOOK AT ONE 2022CounTR: Transformer-based Generalised Visual CountingFew-shot Object Counting with Similarity-Aware Feature Enhancement 2023CAN SAM COUNT ANYTHING? AN EMPIRICAL STUDY ON SAM COUNTING 2021 OBJ…

【MSP432电机驱动学习】TB6612带稳压电机驱动模块、MG310电机、13线霍尔编码器

所用控制板型号&#xff1a;MSP432P401r 今日终于得以继续我的电赛小车速通之路&#xff1a; 苏轼云 “ 素面常嫌粉涴 &#xff0c; 洗妆不褪朱红。 ” 这告诫我们不能只注重在表面粉饰虚伪的自己&#xff0c;要像梅花一样&#xff0c;不断磨砺自己的内在~ 后半句是 “…

广告经济学与垄断竞争分析

产品与广告 产品的分类&#xff1a; 搜寻品&#xff1a;消费者在购买商品之前就可以知道其特征的产品经验品&#xff1a;只能够在使用后才能确认其特征的产品信任品&#xff1a;产品的质量即使在消费之后仍然不能确定&#xff0c;例如医学和法律服务 广告的分类&#xff1a;…

【C++】在线编译器推荐,让你随时随地编写代码

▒ 目录 ▒ &#x1f6eb; 问题描述环境 1️⃣ 支持调试网站Repl.itOnlineGDB 2️⃣ 不支持调试网站Wandboxjson.cnjdoodletutorialspointcppshellideonecoliruonline-ide 3️⃣ 性能分析网站Quick C BenchmarkCompare C Builds 4️⃣ 其它C Insights&#xff08;学习模板、C11…

Java阶段四Day04

Java阶段四Day04 文章目录 Java阶段四Day04关于SLF4j日志框架使用Sql注解关于DAO架构关于Service关于异常 关于SLF4j日志框架 在开发实践中&#xff0c;通常禁止使用System.out.println()这种语句输出信息&#xff0c;主要原因有&#xff1a; 输出效率低下&#xff0c;特别是字…

A fight among three “三国”混战 | 经济学人20230520版社论双语精翻

《经济学人》2023年5月20日封面&#xff08;社论&#xff09;文章精翻&#xff1a;《全球支付系统的“三国”混战》&#xff08;A fight among three&#xff09; A fight among three “三国”混战 The fight over the future of global payments 全球支付的未来之争 Digital …