嵌入式学习 (Day:27 IPC --- 进程间通信)
IPC 进程间通信 interprocess communicate (即:进程间进行数据交换)
三大类:
进程间通信的方式(共8种)
1、古老的通信方式(Linux设计时就有的)
无名管道 有名管道 信号
2、IPC对象通信 system v BSD suse fedora kernel.org (系统5) (必须同一个电脑)
消息队列(用的相对少,这里不讨论)
共享内存 (最重要,用的最多,类似全局变量)
信号量集 (信号量的集合)
3、socket通信 (不同电脑)
网络通信
线程信号,posix sem_init
特列:古老的通信方式中信号是唯一的异步通信
所有的通信方式中共享内存是唯一的最高效(重要)
1.管道==》无名管道、有名管道
无名管道 ===》pipe ==》只能给有亲缘关系进程通信 (pipe,管子,父子进程,爷孙进程可用)
有名管道 ===》fifo ==》可以给任意单机进程通信 (父子,爷孙,旁系关系(非父子/爷孙,如:堂兄妹)也行)
管道的特点:
1、管道是 半双工的工作模式 (要么在发或要么在收)
2、所有的管道都是特殊的文件不支持定位操作。lseek->> fd fseek ->>FILE*
3、管道是特殊文件,读写使用文件IO。fgets,fread,fgetc,
open,read,write,close;; (首选这几个文件IO操作,标准IO也行,但是标准IO有缓冲区,麻烦)
管道的四个特性:(管道开在3-4G内存空间中,)(最重要)
1,读端存在,一直向管道中去写,超过64k,写会阻塞。(读端存在,close不调用,默认读端存在;写的快,读的慢,写满了,写阻塞)
2,写端是存在的,读管道,如果管道为空的话,读会阻塞。 (写端和读端都存在,写的慢,读的块,读阻塞)
3.管道破裂,,读端关闭,写管道。(读端关闭,即没有接受方了,写的话,写端也会关闭,即写端管道破裂;用此方法关闭管道)
4. read 0 ,写端关闭,如果管道没有内容,read 0 ; (read 到0,即数据已读取完毕)
使用框架:
(读阻塞和写阻塞是正常情况,实际时经常遇到)
创建管道 ==》读写管道 ==》关闭管道
1、无名管道 ===》管道的特例 ===>pipe函数
特性:
1.1 亲缘关系进程使用
1.2 有固定的读写端
流程:
创建并打开管道: pipe函数
#include <unistd.h>
int pipe(int pipefd[2]); (0下标用来读,1下标用来写)
功能:创建并打开一个无名管道
参数:pipefd[0] ==>无名管道的固定读端
pipefd[1] ==>无名管道的固定写端
返回值:成功 0
失败 -1;
注意事项:
1、无名管道的架设应该在fork之前进行。 (如果在fork之后创建管道,父子会存在两个不同的管道,无法传输数据)
无名管道的读写:===》文件IO的读写方式。
读: read()
写: write()
关闭管道: close();
验证如下问题:
1、父子进程是否都有fd[0] fd[1], 是的
如果在单一进程中写fd[1]能否直接从fd[0]中读到。
可以,写fd[1]可以从fd[0]读
2、管道的数据存储方式是什么样的 队列
数据是否一直保留?
栈, 先进后出
队列形式存储 读数据会剪切取走数据不会保留 (管道中的数据被读取后即会删掉,不保留)
先进先出
3、管道的数据容量是多少,有没有上限值。
操作系统的建议值: 512* 8 = 4k
代码测试实际值: 65536byte= 64k (Unbuntu中管道容量为64K)
4、管道的同步效果如何验证?读写同步验证。
读端关闭能不能写? 不可以 ===>SIGPIPE 异常终止 (读端关闭,管道破裂)
写端关闭能不能读? 可以,取决于pipe有没有内容,===>read返回值为0 不阻塞
结论:读写端必须同时存在,才能进行
管道的读写。(一般写端先关闭,再关闭读端)
5、固定的读写端是否就不能互换?
能否写fd[0] 能否读fd[1]? 不可以,是固定读写端。
2.有名管道
有名管道===》fifo ==》有文件名称的管道。 (first in,first out) (大部分时候,用于非父子进程,父子进程也能用)
文件系统中可见
框架:
创建有名管道 ==》打开有名管道 ==》读写管道
==》关闭管道 ==》卸载有名管道 (卸载:即删除管道的文件名)
1、创建:mkfifo
#include <sys/types.h>
#include <sys/stat.h>
remove();
int mkfifo(const char *pathname, mode_t mode);
功能:在指定的pathname路径+名称下创建一个权限为
mode的有名管道文件。
参数:pathname要创建的有名管道路径+名称
mode 8进制文件权限。
返回值:成功 0
失败 -1;
2、打开有名管道 open
注意:该函数使用的时候要注意打开方式,
因为管道是半双工模式,所有打开方式直接决定
当前进程的读写方式。
一般只有如下方式: (fifo管道名,管道名是特殊文件,文件大小永远是0)
int fd-read = open("./fifo",O_RDONLY); ==>fd 是固定读端 (操作管道时,open会阻塞)
int fd-write = open("./fifo",O_WRONLY); ==>fd 是固定写端
不能是 O_RDWR 方式打开文件。
不能有 O_CREAT 选项,因为创建管道有指定的mkfifo函数
3、管道的读写: 文件IO
读: read(fd-read,buff,sizeof(buff));
写: write(fd-write,buff,sizeof(buff));
4、关闭管道:
close(fd);
5、卸载管道:remove();
int unlink(const char *pathname);
功能:将指定的pathname管道文件卸载,同时
从文件系统中删除。
参数: ptahtname 要卸载的有名管道
返回值:成功 0
失败 -1;
有名管道 ===》(与无名区别:1.open会阻塞;2.有名和无名,无名找不到,没有名字,只能用于父子间;)
1、是否需要同步,以及同步的位置。
读端关闭 是否可以写,不能写什么原因。
写端关闭 是否可以读。
结论:有名管道执行过程过必须有读写端同时存在。
如果有一端没有打开,则默认在open函数部分阻塞。
2、有名管道是否能在fork之后的亲缘关系进程中使用。
结论: 可以在有亲缘关系的进程间使用。
注意: 启动的次序可能会导致其中一个稍有阻塞。
3、能否手工操作有名管道实现数据的传送。
读: cat fifoname
写: echo "asdfasdf" > fifoname
相关文章:
嵌入式学习 (Day:27 IPC --- 进程间通信)
IPC 进程间通信 interprocess communicate (即:进程间进行数据交换) 三大类: 进程间通信的方式(共8种) 1、古老的通信方式(Linux设计时就有的) 无名管道 有名…...
Python考试复习--day2
1.出租车计费 mile,waitmap(int,input().split(,)) if mile<3:money13wait*1 elif mile>3 and mile<15:money13(mile-3)*2.3wait*1 else:money1312*2.3(mile-15)*2.3*(10.5)wait*1 print({:.0f}.format(money)) 【知识点1】: map() 函数 【知识点1】&…...
整理好了!2024年最常见 20 道 Redis面试题(九)
上一篇地址:整理好了!2024年最常见 20 道 Redis面试题(八)-CSDN博客 十七、Redis 的过期策略有哪些? Redis 的过期策略主要有三种: 定时删除:当为一个键设置了过期时间后,Redis 会…...
IDEA使用Maven打包项目的所有的依赖
要使用 Maven 命令将 Spring Boot 项目的依赖打包到 lib 文件夹中,你可以在终端中运行以下命令: mvn dependency:copy-dependencies -DoutputDirectory./lib这个命令会将项目的所有依赖(包括运行时依赖)复制到当前目录的 lib 文件…...
【C++ 】学习问题及补充
一.自定义类型不初始化直接就赋值,比如string类会怎么样 vectr<string>里已经给每个string对象已经分配好空间,为什么不初始化再赋值会报错 在C中,std::string类是一个动态字符串类,它内部管理着一个字符数组,用…...
内存泄漏案例分享3-view的内存泄漏
案例3——view内存泄漏 前文提到,profile#Leaks视图无法展示非Activity、非Fragment的内存泄漏,换言之,除了Activity、Fragment的内存泄漏外,其他类的内存问题我们只能自己检索hprof文件查询了。 下面有一个极佳的view内存泄漏例子…...
红外超声波雷达测距
文章目录 一HC-SR04介绍1HC-SR04简介及工作原理 二用HAL库实现HC-SR04测量距离1STM32CubeMX配置2keil53代码的添加 三效果 一HC-SR04介绍 1HC-SR04简介及工作原理 超声波是振动频率高于20kHz的机械波。它具有频率高、波长短、绕射现象小、方向性好、能够成为射线而定向传播等…...
AIGC 008-IP-Adapter文本兼容图像提示适配器用于文本到图像扩散模型
AIGC 008-IP-Adapter文本兼容图像提示适配器用于文本到图像扩散模型! 文章目录 0 论文工作1 论文方法2 效果 0 论文工作 这篇论文介绍了 IP-Adapter,一种 高效地将预训练的图像到图像转换模型适应到新领域 的方法。它通过在预训练模型的 输入端 添加一个…...
Java入门基础学习笔记50——ATM系统
1、项目演示; 2、项目技术实现; 1)面向对象编程: 每个账户都是一个对象,所以要设计账户类Account,用于创建账户对象封装账户信息。ATM同样是一个对象,需要设计ATM类,代表ATM管理系…...
# linux 中使用 visudo 命令,怎么保存退出?
linux 中使用 visudo 命令,怎么保存退出? 在 visudo 中保存并退出的方法取决于您使用的文本编辑器。通常情况下,visudo 会使用 vim 或 vi 或 Nano 作为默认的文本编辑器。 1、使用 Vim 或 vi 编辑器: 按下 Esc 键退出编辑模式&…...
springboot项目,@Test写法 @Before @After
某文件示例 package cn.xxx.crm.boss;import cn.xxxx.crm.manager.mq.rabbit.AliyunCredentialsProvider; import com.rabbitmq.client.AMQP; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; im…...
vue3的核心API功能:computed()API使用
常规使用方法: 这样是常规使用方法. 另一种,可写计算属性的使用方法: 这样分别定义computed的get回调函数和set回调函数, 上面例子定义了plusOne.value的值为1, 那么这时候就走了computed的set回调函数,而没有走get回调函数. 当我们打印plusOne.value的值的时候,走的是get的…...
Bootstrap5
Bootstrap5-容器 容器是Bootstrap—个基本的构建块,它包含、填充和对齐给定设备或视口中的內容。 Bootstrap 需要一个容器元素来包裏网站的内容 我们可以使用以下两个容器类: .container 类用于固定宽度并支持响应式布局的容器。.container-fluid 类用…...
宝塔部署纯Vue项目,无后端
1.打包项目 生成一个dist文件夹 2.创建云服务器根目录 3.创建站点 4.上传文件 5.访问...
spring boot3整合邮件服务实现邮件发送功能
⛰️个人主页: 蒾酒 🔥系列专栏:《spring boot实战》 目录 内容概要 开通服务 依赖引入 配置属性 创建邮件发送工具类 测试 最近发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家…...
算法刷题day54:搜索(一)
目录 引言一、池塘计数二、城堡问题三、山峰和山谷四、迷宫问题五、武士风度的牛六、抓住那头牛七、矩阵距离八、魔板 引言 针对于蓝桥杯,搜索问题还是非常之重要的,在省赛前深知暴搜的重要性,所以提前先把提高课的搜索一章给看了࿰…...
深入了解Redis的过期策略和内存淘汰机制
✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ 🎈🎈作者主页: 喔的嘛呀🎈🎈 ✨✨ 帅哥美女们,我们共同加油!一起进步&am…...
小白不知道怎么投稿?记住这个好方法
作为一名单位信息宣传员,我最初踏上这条道路时,满心憧憬着通过文字传递我们单位的精彩瞬间,让社会听见我们的声音。然而,理想与现实之间的距离,却在一次次邮箱投稿的石沉大海中渐渐清晰。那时的我,像所有“小白”一样,以为只要用心撰写稿件,通过电子邮件发给各大媒体,就能收获满…...
gRPC - Protocol Buffer 编译器安装
文章目录 Protocol Buffer 编译器安装如何安装 Protocol Buffer 编译器使用包管理器安装Linux 上,使用 apt 或 apt-get,例如:macOS 上,使用 Homebrew: 安装预编译的二进制文件(任何操作系统)其他…...
【Linux】centos7下载安装Python3.10,下载安装openssl1.1.1
目录 centos7下载安装Python(版本3.10.14) (1)网页下载python压缩包,并解压缩 (2)编译安装 Python在make altinstall时,报错及解决 (3)将安装目录和可执…...
JMeter压测秒退的三大静默杀手:线程组、超时、监听器
1. 这不是JMeter“崩了”,而是它在用报错告诉你:配置里藏着三个沉默的杀手 刚跑完第一个JMeter压测脚本,线程组设了200个用户、持续5分钟,结果3秒后就自动停了——控制台只留下一行灰底白字的 INFO o.a.j.e.StandardJMeterEngine…...
3分钟恢复Windows 11 LTSC微软商店:企业用户的完美解决方案
3分钟恢复Windows 11 LTSC微软商店:企业用户的完美解决方案 【免费下载链接】LTSC-Add-MicrosoftStore Add Windows Store to Windows 11 24H2 LTSC 项目地址: https://gitcode.com/gh_mirrors/ltscad/LTSC-Add-MicrosoftStore 还在为Windows 11 24H2 LTSC企…...
深度解析抖音直播回放下载架构设计:从FLV流捕获到多线程存储优化
深度解析抖音直播回放下载架构设计:从FLV流捕获到多线程存储优化 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fall…...
小新 Pad Pro 2022 投屏新姿势|ZUI14 小组件一键镜像,效率直接拉满
很多联想小新平板用户都知道系统自带投屏功能,但很少有人留意到ZUI14 里藏着一个超便捷的小组件投屏入口,不用翻设置、不用等搜索,桌面点一下就能快速投屏,特别适合日常办公、学习、演示等高频场景。今天分享来自联想官方知识库的…...
Super IO:Blender剪贴板导入导出神器,让3D工作流效率翻倍
Super IO:Blender剪贴板导入导出神器,让3D工作流效率翻倍 【免费下载链接】super_io blender addon for copy paste import / export 项目地址: https://gitcode.com/gh_mirrors/su/super_io 你是否厌倦了在Blender中反复点击文件菜单、浏览文件夹…...
告别繁琐标注:Windows上最轻量级实时屏幕画笔工具完全指南
告别繁琐标注:Windows上最轻量级实时屏幕画笔工具完全指南 【免费下载链接】gInk An easy to use on-screen annotation software inspired by Epic Pen. 项目地址: https://gitcode.com/gh_mirrors/gi/gInk 你是否曾在视频会议中手忙脚乱地寻找标注工具&…...
Windows与Linux跨系统数据传输:从SCP、Rsync到自动化脚本的完整指南
1. 项目概述:为什么我们需要跨系统传输数据?在混合IT环境成为常态的今天,一个典型的开发或运维场景是:你的主力工作机运行着Windows,而你的代码、应用或数据处理任务则部署在远端的Linux服务器上。无论是将本地的配置文…...
你的 FlashAttention 真的在跑吗?几个简单方法确认
之前有个朋友在昇腾 NPU 上部署模型,按文档开了 --enable-flash-attn,跑起来也没报错。但他总觉得延迟不对——跟之前没开的时候差不多。他问我:怎么确认 FlashAttention 真的生效了?不会是静默降级了吧? 这个问题问得…...
量子态相似性度量:迹距离与保真度的工程应用
1. 量子态相似性度量的工程意义 在量子计算的实际应用中,我们经常需要比较两个量子态的相似程度。比如在量子电路验证时,需要确认实际输出的量子态是否与理论预期相符;在量子纠错中,要评估噪声对量子态的影响程度;在量…...
零和博弈 vs 正和系统:用强化学习原理破解组织内耗
1. 项目概述:从办公室茶水间到算法沙盒,零和与正和到底在争什么?你有没有经历过这样的场景:部门刚拿到一笔季度奖金池,五个人分三十万。A悄悄把B的客户案例写进自己的述职PPT;C在跨组协作时故意延迟交付&am…...
