【Linux】进程间通信 续

目录

管道的原理(匿名管道)

核心原理

站在内核的角度看管道的本质

接口

创建管道文件

代码示例

管道的特征

管道读写端的四种情况

管道的应用场景

命令行的管道。

使用管道实现进程池

初始化

控制子进程

退出

命名管道

命名管道的理解

代码示例

服务端

客户端

日志

共享内存(system v)

原理解析

代码案例

让两个进程看到同一份资源

开始通信

共享内存的特性

共享内存的属性

利用管道实现同步机制

消息队列(system v)

原理

接口

信号量(system v)

理解信号量

接口

IPC在内核中的数据结构设计


管道的原理(匿名管道)

文件描述符表,文件的加载,内存中生成一个文件对象,每个文件对象有inode,方法集,文件缓冲区,磁盘中的文件属性加载到inode,文件内容加载到文件缓冲区。

内存级文件,不在磁盘中,只在内存中运转,类似于临时文件。

子进程会拷贝父进程PCB,文件描述符表,但不会拷贝文件对象。所以它们指向同一个文件对象。

父子进程可以同时看到这个文件,意味着可以在这个内存级文件的缓冲区进行通信了。

管道就是文件,只不过是内存级文件。


核心原理

父进程以读和写打开管道文件。

父子进程都指向管道文件。

各自关闭一端读或写,可实现单向通信。


站在内核的角度看管道的本质

父进程同时用读方式和写方式打开管道文件,会创建读文件对象和写文件对象,但它们是同一个文件,都是同一个inode,同一个方法集,同一个缓冲区。

把父进程写关闭,子进程读关闭。

上述讲的是匿名管道。


接口

创建管道文件

成功返回0,失败返回-1并设置错误码。

参数是输出型参数。

代码示例

创建子进程各自关闭一端。子进程写父进程读。

子进程构建内容,写给管道文件。

父进程从管道文件接收信息。


管道的特征


管道读写端的四种情况

读端如果关闭,写端就会被13信号杀死。


管道的应用场景

命令行的管道。


使用管道实现进程池

模型思路:父进程写子进程读。

Makefile

描述需要管理的信息

组织信息并初始化

控制子进程

控制退出

初始化

创建多个管道和多个子进程,并记录想要的信息。

子进程的任务

接收父进程给的任务码,执行对应任务

控制子进程

给子进程发送任务码

退出

关闭写端

等待子进程退出


命名管道

指令

创建命名管道


命名管道的理解

不同的进程会以读写方式打开不同的文件对象,但都指向同一个文件的inode,方法集,缓冲区。

这样可以让不同的进程看到同一份资源

不同进程通信时不想要刷盘就诞生了管道文件,也就是内存级文件,管道文件不需要刷盘。

不同进程通信的前提是看到同一份资源,为了保证同一份资源我们就用了路径+文件名确定,因为具有唯一性,所以叫命名管道。


代码示例

makefile

生成两个可执行程序,一个服务端,一个客户端。

服务端

创建管道文件

第一个参数是路径文件名,第二个参数是文件权限

删除管道文件

参数是路径文件名

把创建和删除放到类的构造和析构中,用类的生命周期来管理。

打开管道文件

开始通信


 

客户端

打开文件

开始通信,用户输入

cin 是空格和回车分割,getline是回车分割。

关闭


日志

形参实例化从右向左

va_list 是一个char*

va_start让这个指针指向第一个参数的下一位

va_arg 根据类型提参数

va_end 指针置空

时间

输入时间戳可以转化为一个时间结构体

日志格式分为两部分

左部分是日志等级和时间

右部分是用户自定义部分

打印日志有三种,往屏幕打印,往文件打印,往不同文件打印


共享内存(system v)

原理解析

在物理内存创建一块区域,这块区域都映射在不同进程的共享区,进程对共享区的操作实现对同一块区域的交流。

释放共享内存


代码案例

让两个进程看到同一份资源

在系统里创建一个共享内存

唯一标识符key

获取共享内存

1. 获取key

2. 创建共享内存

key与shmid

查看共享内存 ipcs -m 

手动关闭是 ipcrm -m shmid

共享内存的权限设置

创建共享内存与获取共享内存

共享内存的大小

挂接

去关联

传入挂接得到的地址

释放共享内存

a进程负责创建和删除共享内存,b进程负责获取共享内存。


开始通信

a进程读,b进程写

a进程直接从共享内存获取信息

b进程直接写到共享内存


共享内存的特性


共享内存的属性

获取共享内存属性

利用管道实现同步机制

获取key

获取共享内存分为创建和单纯获取

进程a,收到提醒后才去访问共享内存。

进程b,写完信息后通知对方访问。


消息队列(system v)

原理

不同的进程看到同一个队列,将带类型的数据块发送给队列,从队列上获取自己想要的数据。


接口

指令查看和删除消息队列


信号量(system v)

共享内存没有保护机制

临界资源,临界区


理解信号量

信号量的本质是计数器。

临界资源被分成很多块资源,信号量记录着还剩多少块资源。

每当执行流申请资源,信号量就记录资源被使用一份,资源使用完了就不给申请了,除非执行流还回来。

使用资源之前得先申请

原子的PV操作

概念总结

接口

申请信号量

第二个参数是申请信号量的个数,一般为1。

操作信号量

设置信号量

sembuf结构体需要自己定义

sem_op控制PV操作


 

IPC在内核中的数据结构设计

系统用数组管理IPC资源,数组存放的是第一个字段,可以直接访问ipc_perm结构体,如果想访问整个ipc的结构体只需要强转类型即可,这是多态最早的样子。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

宇树科技再落一子!天羿科技落地深圳,加速机器人创世纪

2025年3月5日,机器人行业龙头宇树科技(Unitree)在深圳再添新动作——全资子公司深圳天羿科技有限公司正式成立。这家注册资本10万元、法定代表人周昌慧的新公司,聚焦智能机器人研发与销售,标志着宇树科技在华南市场的战…

AI-Ollama本地大语言模型运行框架与Ollama javascript接入

1.Ollama Ollama 是一个开源的大型语言模型(LLM)平台,旨在让用户能够轻松地在本地运行、管理和与大型语言模型进行交互。 Ollama 提供了一个简单的方式来加载和使用各种预训练的语言模型,支持文本生成、翻译、代码编写、问答等多种…

SQLAlchemy系列教程:基本数据类型及自定义类型

在SQLAlchemy、Python SQL工具包和ORM中定义模型时,理解基本数据类型至关重要。本教程提供了在SQLAlchemy模型中有效使用内置基本类型的指南。 SQLAlchemy中的基本类型 SQLAlchemy支持一组与SQL数据库类型一致的基本数据类型。SQLAlchemy中的每种类型都为各种SQL类…

K8s The connection to the server 192.168.56.120:6443 was refused报错解决

虚拟机获取不到其他node节点的信息,通过使用docker ps -a 排查看到k8s的组件都是exited的状态,通过手动拉起docker 镜像id 起来之后,又变为exited的状态!!! 解决方法:重置k8s集群 使用 kubeadm…

随机树算法 自动驾驶汽车的路径规划 静态障碍物(Matlab)

随着自动驾驶技术的蓬勃发展,安全、高效的路径规划成为核心挑战之一。快速探索随机树(RRT)算法作为一种强大的路径搜索策略,为自动驾驶汽车在复杂环境下绕过静态障碍物规划合理路径提供了有效解决方案。 RRT 算法基于随机采样思想…

【实战 ES】实战 Elasticsearch:快速上手与深度实践-2.3.1 避免频繁更新(Update by Query的代价)

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 Elasticsearch数据更新与删除深度解析:2.3.1 避免频繁更新(Update by Query的代价)案例背景1. Update by Query的内部机制解析1.1 文档更…

Baklib内容中台赋能企业智管

内容中台构建全场景智管 现代企业数字化运营中,全域内容管理能力已成为核心竞争力。通过智能知识引擎驱动的内容中台架构,企业能够实现跨部门、多形态数据的统一归集与动态调度。以某制造企业为例,其利用中台系统将分散在CRM、ERP及内部文档…

今天来介绍和讨论 AGI(通用人工智能)

首先介绍,AGI(通用人工智能)是什么? AGI(Artificial General Intelligence,通用人工智能)指的是能够像人类一样理解、学习、推理和解决广泛任务的人工智能系统。与目前的AI不同,AGI可…

计算机毕业设计SpringBoot+Vue.js乐享田园系统(源码+文档+PPT+讲解)

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

navicat导出postgresql的数据库结构、字段名、备注等等

1、执行sql语句 SELECT A.attnum AS "序号",C.relname AS "表名",CAST ( obj_description ( relfilenode, pg_class ) AS VARCHAR ) AS "表名描述",A.attname AS "字段名称",A.attnotnull as "是否不为null",(case when A…

FPGA开发,使用Deepseek V3还是R1(9):FPGA的全流程(详细版)

以下都是Deepseek生成的答案 FPGA开发,使用Deepseek V3还是R1(1):应用场景 FPGA开发,使用Deepseek V3还是R1(2):V3和R1的区别 FPGA开发,使用Deepseek V3还是R1&#x…

DeepSeek、Grok 和 ChatGPT 对比分析:从技术与应用场景的角度深入探讨

文章目录 一、DeepSeek:知识图谱与高效信息检索1. 核心技术2. 主要特点3. 应用场景4. 实际案例 二、Grok:通用人工智能框架1. 核心技术2. 主要特点3. 应用场景4. 实际案例 三、ChatGPT:聊天机器人与通用对话系统1. 核心技术2. 主要特点3. 应用…

三、0-1搭建springboot+vue3前后端分离-idea新建springboot项目

一、ideal新建项目1 ideal新建项目2 至此父项目就创建好了,下面创建多模块: 填好之后点击create 不删了,直接改包名,看自己喜欢 修改包名和启动类名: 打开ServiceApplication启动类,修改如下: …

快速生成viso流程图图片形式

我们在写详细设计文档的过程中总会不可避免的涉及到时序图或者流程图的绘制,viso这个软件大部分技术人员都会使用,但是想要画的好看,画的科学还是比较难的,现在我总结一套比较好的方法可以生成好看科学的viso图(图片格式)。主要思…

【前端基础】Day 9 PC端品优购项目

目录 1. 品优购项目规划 1.1 网站制作流程 1.2 品优购项目整体介绍 1.3 学习目的 1.4 开发工具以及技术栈 1.5 项目搭建工作 1.6 网站favicon图标 1.7 网站TDK三大标签SEO优化 2. 品优购首页制作 2.1 常见模块类命名 2.2 快捷导航shortcut制作 2.3 header制作 2.4…

仿mudou库one thread oneloop式并发服务器

项目gitee:仿muduo: 仿muduo 一:项目目的 1.1项目简介 通过咱们实现的⾼并发服务器组件,可以简洁快速的完成⼀个⾼性能的服务器搭建。 并且,通过组件内提供的不同应⽤层协议⽀持,也可以快速完成⼀个⾼性能应⽤服务器…

一文学会Spring

一、Spring简介 Spring的优点 Spring是一个开源免费的框架、容器Spring是一个轻量级的框架,非侵入式的控制反转IOC、面向切面AOP支持事务 Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器 二、IOC 2.1 IOC本质 控制反转IOC,是一种设计思想…

解决Spring Boot中LocalDateTime返回前端数据为数组结构的问题

在Spring Boot开发中,处理日期时间数据是一个常见的需求。Java 8 引入了新的日期时间API,如LocalDateTime,它提供了更强大的日期时间处理功能。然而,在将LocalDateTime对象序列化为JSON时,可能会遇到返回为数组结构的问…

【一个月备战蓝桥算法】递归与递推

字典序 在刷题和计算机科学领域,字典序(Lexicographical order)也称为词典序、字典顺序、字母序,是一种对序列元素进行排序的方式,它模仿了字典中单词的排序规则。下面从不同的数据类型来详细解释字典序: …

CSDN 1024天 创作纪念日

机缘 还记得那是2022年5月,在上家公司工作时候,意外发现同事在通过CSDN记录一些日常遇到、解决的问题,也会更新一些他擅长领域的知识点,并且收获了不少的粉丝和阅读量,这不由得激起了我的兴趣。也在有空时候&#xff…