嵌入式学习 (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)将安装目录和可执…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
