Linux:进程间通信之命名管道
Linux:进程间通信-CSDN博客
我们说匿名管道只能用于父子进程这样的关系通信,那么陌生进程怎么通信?
我们之前说父子进程能通信的最关键的地方就在于子进程复制了一份父进程的files_struct,从而通过文件的inode映射同一份文件来通信;而陌生的进程他们怎么看见同一份文件?
通过文件内核缓冲区
什么叫文件内核缓冲区?
来先看看一个朴素的通信:

一个进程把数据写到磁盘上的一个文件,另一个进程从磁盘中读取来完成通信
但是每次我们都要把文件从磁盘加载出来,很慢,所以我们理想的情况是这个中间文件,如果放到内存里(而不是磁盘),然后两个需要通信的进程一个从里面读,另一个从里面写,最后不用把数据刷新到磁盘里(因为是临时数据,无意义),这样就可以最大效益化的通信了
那么这两个文件怎么找到这个中间文件?
通过路径+文件名的方案
所以这个文件就要具备两个特点:
1.当该文件被打开时,不会被刷新在磁盘上,而是在内存中作为数据被临时保存
2.但是在磁盘层面上要有自己的文件名和路径,方便进程锁定
符合这两个条件的文件就是命名管道
利用命名管道进行进程间通信
命名管道的创建:mkfifo

第一个参数:创建的文件名,第二个参数:创建的管道的权限(管道也是一种文件)
成功返回0,失败返回-1
我们来写一下用命名管道来实现两个陌生进程的通信:
大体逻辑是实现一个客户端和用户端的通信
comm.h:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define MY_FIFO "./fifo"
server:
#include "comm.h"
int main(){umask(0);//防止设置权限时受umask影响//if(mkfifo(MY_FIFO,0666)<0){//创建管道文件// perror("mkfifo");// return 1;//}//printf("start");int fd=open(MY_FIFO,O_RDONLY);//打开文件if(fd<0){perror("open error");}//让我们的server提供读服务while(1){char buffer[1024]={0};ssize_t s=read(fd,buffer,sizeof(buffer)-1);if(s>0){buffer[s]=0;printf("client say:");//读取结束printf("%s",buffer);//break;}else if(s==0){printf("Client disconnected...\n");break;break;}else{perror("read error");//处理error}}close(fd);
}
client.c:
#include"comm.h"//client和server都包含fifo文件,上图可以通信
int main(){//printf("start");int fd=open(MY_FIFO,O_WRONLY);if (fd<0){perror("open error");return 1;}while(1){printf("请输入:");fflush(stdout);//刷新缓冲区char buffer[64]={0};ssize_t s=read(0,buffer,sizeof(buffer)-1);if(s>0){buffer[s]=0;printf("%s\n",buffer);write(fd,buffer,strlen(buffer));}}close(fd);return 1;
}
实现结果:


这两个进程,我们要先执行./server/.exe来生成我们的命名管道文件fifo:

再执行./client.exe,用client端来操作server端
我们来验证一下命名管道到底会不会从磁盘加载内容:
./client.exe:
./server.exe:

会先卡在这里没有反应,卡多久呢?

因为是sleep(10)当然是10s了
所以如果你一次性输入很多内容到命名管道文件里,但是server并没有读取,一般来讲数据只能在管道文件里,可是我们发现管道文件的大小是0。这说明命名管道的数据为了效率,不会刷新到磁盘 ,等一会就会刷新
为什么之前的pipe叫匿名管道,这样子通信叫命名管道?
因为这个管道文件有名字啊!有名字有路径,大家是陌生的进程也可以看见同一份命名管道文件;而匿名管道靠的是父子间进程的继承,才实现的通信

好了就说到这里吧。。。放一张和兔兔的合照
相关文章:
Linux:进程间通信之命名管道
Linux:进程间通信-CSDN博客 我们说匿名管道只能用于父子进程这样的关系通信,那么陌生进程怎么通信? 我们之前说父子进程能通信的最关键的地方就在于子进程复制了一份父进程的files_struct,从而通过文件的inode映射同一份文件来通…...
UE4_后期处理七—仿红外线成像效果
效果图展示: 参考文档:https://dev.epicgames.com/documentation/zh-cn/unreal-engine/using-fresnel-in-your-unreal-engine-materials?application_version5.4 二、所用知识点扩充 在创建电影或过场动画时,你常常需要想办法更好地突显角…...
静态路由和默认路由(实验)
目录 一、实验设备和环境 1、实验设备 2、实验环境 (1)实验拓扑图 (2)实验命令列表 二、实验记录 1、直连路由与路由表查看 步骤1:建立物理连接并运行超级终端。 步骤2:在路由器上查看路由表。 2、静态路由配置 步骤1:配…...
TCP: Textual-based Class-aware Prompt tuning for Visual-Language Model
文章汇总 存在的问题 原文:具有图像特定知识的图像条件提示符号在提升类嵌入分布方面的能力较差。 个人理解:单纯把"a photo of {class}"这种提示模版作为输入是不利于text encoder学习的 动机 在可学习的提示和每一类的文本知识之间建立…...
2024年软考网络工程师中级题库
1【考生回忆版】以下不属于5G网络优点的是(A) A.传输过程中消耗的资源少,对设备的电池更友好 B.支持大规模物联网,能够连接大量低功耗设备,提供更高效的管理 C.引入了网络切片技术,允许将物理网络划分为多个虚拟网络…...
CSS的盒子模型(Box Model)
所有HTML元素都可以看作盒子,在CSS中盒子模型是用来设计和布局的,CSS盒子模型本质上是一个盒子,分装周围的HTML元素包括:外边距,边框,内边距和实际内容。 Margin(外边距) 清除边框…...
用OpenSSL搭建PKI证书体系
1 创建PKI结构目录 mkdir 07_PKI cd 07_PKI mkdir 01_RootCA 02_SubCA 03_Client2 创建根CA cd 01_RootCA mkdir key csr cert newcerts touch index.txt index.txt.attr echo 01 > serial2.1 创建根CA密钥对 2.1.1 生成 长度为2048 bit 的RSA私钥。 cd key openssl gen…...
scp 命令:在两台主机间远程传输文件
一、命令简介 scp 命令使用 SSH 加密的方式在本地主机和远程主机之间复制文件。 二、命令参数 格式 scp [选项] 发送方主机和目录 接收方主机和目录注意:左边是发送方,右边是接收方。固定格式。 示例 #示例1 scp ~/test.txt soulio172.1…...
家用迷你洗衣机哪款质量高?五大热销高分单品强势来袭
迷你内衣洗衣机一般是为婴儿宝宝,或者一些有特殊需要的用户而设计使用的,宝宝衣物换洗频繁,而且对卫生方面的除菌要求高,而为避免交叉感染,所以一般不适合和大人的衣物放在一起洗,因此对于有宝宝的家庭来说…...
rpm 命令:RedHat底层包管理器
一、命令简介 rpm 是 Red Hat Package Manager 的缩写,是 Red Hat、CentOS、Fedora 等基于 Red Hat 的 Linux 发行版中用于管理和安装软件包的工具。它能够安装、卸载、升级、查询和验证软件包。 相关命令: rpm 是基础,提供了底层的软…...
Xilinx 使用DDS实现本振混频上下变频
文章目录 一、什么是混频?二、为什么要进行混频?三、Matlab实现混频操作四、FPGA实现混频上下变频操作4.1 例化IP4.2 仿真验证 一、什么是混频? 混频(Mixing)是信号处理中的一个核心概念,混频的本质是将两个…...
ClickHouse-Kafka Engine 正确的使用方式
Kafka 是大数据领域非常流行的一款分布式消息中间件,是实时计算中必不可少的一环,同时一款 OLAP 系统能否对接 Kafka 也算是考量是否具备流批一体的衡量指标之一。ClickHouse 的 Kafka 表引擎能够直接与 Kafka 系统对接,进而订阅 Kafka 中的 …...
PTA L1-071 前世档案
L1-071 前世档案(20分) 网络世界中时常会遇到这类滑稽的算命小程序,实现原理很简单,随便设计几个问题,根据玩家对每个问题的回答选择一条判断树中的路径(如下图所示),结论就是路径终…...
解决mac下 Android Studio gradle 下载很慢,如何手动配置
抓住人生中的一分一秒,胜过虚度中的一月一年! 小做个动图开篇引题 前言 平时我们clone git 上项目,项目对应gradle版本本地没有,ide编译会自动下载,但是超级慢可能还下载失败,下面讲解下此问题如 如下图所示ÿ…...
第三篇 第17章 工程计量与支付
第三篇 工程计价 第17章 工程计量与支付 17.1 工程计量 17.1.1 工程计量的原则 承包人完成合同工程且应予计量的工程数量确定计量周期可以月为单位,也可以按其他时间节点、工程形象进度分段计量因承包人原因造成的超出合同工程范围施工或返工的工程量、发包人不予计量 17.1…...
[半导体检测-1]:半导体检测概述
前言: 半导体检测是半导体产业链中不可或缺的一环,它贯穿于产品生产制造流程的始终,对于提高产线良率、提升产品竞争实力具有关键作用。以下是对半导体检测的详细概述: 一、什么是半导体检测 半导体检测是指运用专业技术手段&a…...
公共字段自动填充
问题分析 总会有些公共字段,例如创建时间和创建人 实现思路 对mapper定义注解,使用切面思想来判断是不是更新和新增操作对于指定的操作来更新公共字段 自定义操作类型 package com.sky.enumeration;/*** 数据库操作类型*/ public enum OperationType {/*…...
超详细 Git 教程:二十篇博客,三万字干货
Git 是最流行的版本管理工具,可以说是任何程序员都应该掌握的工具。 当然,其他人也可以学习它用来进行版本控制 为此,我将之前学习 Git 时的笔记整理了下(预计有二十篇),作为博客发出来,希望能帮…...
“出参”和“入参”的命名由来
有些开发者会用“入参”和“出参”来描述函数、方法或接口的参数和返回值。尽管我们基本都知道“入参”就是方法的参数,“出参”就是返回值。但是对于一些起步就是JAVA的开发者来说,可能并不清楚这两个名词的由来。这篇文章就来分享一下关于“入参”和“…...
webrtc gclient sync报错问题解决
报错信息 strp_current_url current_url[:-4] if current_url.endswith( ^^^^^^^^^^^^^^^^^^^^ AttributeError: ‘NoneType’ object has no attribute ‘endswith’ gclient syncsrc/base (ERROR) ---------------------------------------- [0:00:00] Started. ----------…...
嵌入式pRNG:基于WDT与LFSR的轻量级硬件熵随机数生成器
1. pRNG库概述:面向嵌入式系统的轻量级熵收集型伪随机数生成器pRNG(Pseudo-Random Number Generator)是一个专为资源受限微控制器设计的开源伪随机数生成库,其核心设计哲学是在极小内存开销下,通过硬件时序抖动提取物理…...
SystemVerilog内存操作实战:手把手教你实现AXI VIP中的backdoor读写
SystemVerilog内存操作实战:AXI VIP中的backdoor读写技术解析 在硬件验证领域,AXI总线协议因其高性能和灵活性已成为行业标准。验证工程师经常需要与AXI VIP(Verification IP)交互,其中内存操作是最基础也最关键的环节…...
手把手教你用XCVU3P和FMC+接口搭建高性能PCIe载板(附原理图下载)
基于XCVU3P与FMC的高性能PCIe载板开发实战指南 在当今高速数据处理领域,FPGA因其并行计算能力和可重构特性成为关键器件。Xilinx UltraScale系列的XCVU3P芯片配合FMC扩展接口,为开发者提供了强大的硬件加速平台。本文将深入解析如何从零开始构建一个支持…...
Avalonia跨平台开发踩坑记:我的第一个带最小化/关闭按钮的MVVM应用
Avalonia跨平台开发实战:从零构建MVVM窗口控制应用 第一次接触Avalonia时,我被它"一次编写,多平台运行"的承诺所吸引。作为一个长期使用WPF的开发者,跨平台桌面应用开发一直是个痛点。但当我真正开始用Avalonia实现一个…...
OpenClaw任务编排:GLM-4.7-Flash驱动复杂工作流
OpenClaw任务编排:GLM-4.7-Flash驱动复杂工作流 1. 为什么需要任务编排? 去年我接手了一个重复性极高的数据整理工作——每周需要从十几个不同来源收集数据,清洗后生成可视化报告。最初尝试用Python脚本自动化,但随着需求变化&a…...
QGIS 3.28 保姆级配置指南:从中文界面到高德底图,手把手搞定智驾地图工作流
QGIS 3.28 智能驾驶地图工程师开箱指南:从零构建高精度工作流 刚拿到工牌的智能驾驶地图工程师小李,面对全新的QGIS界面有些手足无措。作为空间数据处理的核心工具,QGIS的配置直接决定了后续高精地图生产的效率与精度。本文将带你完成从软件…...
5分钟搞定:用OpenAI Function Calling自动生成Python函数(附Gmail API实战代码)
5分钟实战:用OpenAI Function Calling生成Gmail自动化脚本 每次对接Gmail API都要翻文档写重复代码?试试这个方案——用自然语言描述需求,让AI直接生成可运行的生产级代码。下面这段完整代码就是AI生成的成果,包含错误处理、类型…...
【24年最新算法】首发CPO-XGBoost回归+交叉验证 基于冠豪猪优化算法-XGBoost多变量回归预测
✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…...
终极文档处理方案:AnythingLLM如何实现PDF/TXT/DOCX全格式智能解析
终极文档处理方案:AnythingLLM如何实现PDF/TXT/DOCX全格式智能解析 【免费下载链接】anything-llm 这是一个全栈应用程序,可以将任何文档、资源(如网址链接、音频、视频)或内容片段转换为上下文,以便任何大语言模型&am…...
探索Unity全功能的开源方案:UniHacker跨平台功能扩展工具深度指南
探索Unity全功能的开源方案:UniHacker跨平台功能扩展工具深度指南 【免费下载链接】UniHacker 为Windows、MacOS、Linux和Docker修补所有版本的Unity3D和UnityHub 项目地址: https://gitcode.com/GitHub_Trending/un/UniHacker Unity作为游戏开发领域的行业标…...
