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叫匿名管道,这样子通信叫命名管道?

因为这个管道文件有名字啊!有名字有路径,大家是陌生的进程也可以看见同一份命名管道文件;而匿名管道靠的是父子间进程的继承,才实现的通信

好了就说到这里吧。。。放一张和兔兔的合照

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

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

相关文章

Serilog文档翻译系列(五) - 编写日志事件

日志事件通过 Log 静态类或 ILogger 接口上的方法写入接收器。下面的示例将使用 Log 以便语法简洁&#xff0c;但下面显示的方法同样可用于接口。 Log.Warning("Disk quota {Quota} MB exceeded by {User}", quota, user); 通过此日志方法创建的警告事件将具有两个相…

亿发零售云解析:新零售破局与年轻群体消费趋势变化

近年来&#xff0c;随着数字化、智能化的快速发展&#xff0c;“新零售”概念逐渐成为商业领域的热门话题。相比传统零售&#xff0c;新零售通过线上与线下的深度融合&#xff0c;利用大数据、人工智能等技术&#xff0c;赋能消费者与品牌之间的互动。尤其在年轻消费群体中&…

JS 特殊运算符有哪些?

JavaScript 特殊运算符有哪些&#xff1f; 众多编程语言之中JavaScript &#xff0c;以其强大而全面的功能深受前端开发者喜爱。其丰富的运算符集&#xff0c;不仅包括了广泛应用的算术运算符、比较运算符以及逻辑运算符&#xff0c;还蕴藏着一系列较为冷门但同样功能强大的运算…

LVGL第一篇-了解lvgl显示原理以及使用C++移植

一、引言 在当今嵌入式系统与图形界面开发的广阔领域中&#xff0c;轻量级图形库 LVGL&#xff08;Light and Versatile Graphics Library&#xff09;恰似一颗璀璨耀眼的明星&#xff0c;正日益受到开发者们的热烈推崇与追逐。它以小巧精致之姿、高效卓越之能以及丰富多元之功…

Qt_事件的介绍

目录 1、理解事件 2、处理事件QEvent 3、键盘事件QKeyEvent 4、鼠标事件QMouseEvent 4.1 鼠标点击事件 4.2 鼠标释放事件 4.3 鼠标移动事件 5、滚轮事件QWheelEvent 6、定时器事件QTimerEvent 7、窗口事件QMoveEvent 8、事件分发器event 9、事件过滤器even…

峟思助力堤防工程安全:构建多功能防洪屏障

堤防工程&#xff0c;作为水利建设中至关重要的防护体系&#xff0c;不仅守护着江河、湖泊及滨海区域的安全&#xff0c;更是确保人民生命财产安全的坚固防线。在现代社会&#xff0c;随着技术的进步与安全意识的提升&#xff0c;堤防工程不仅限于传统的防洪功能&#xff0c;更…

CVPR最牛图像评价算法!

本文所涉及所有资源均在 传知代码平台可获取。 目录 概述 一、论文思路 1.多任务学习框架&#xff1a; 2.视觉-语言对应关系&#xff1a; 3.动态损失权重&#xff1a; 4.模型优化和评估&#xff1a; 二、模型介绍 三、详细实现方法 1.图像编码器和语言编码器&#xff08;Image…

Solidity语言:重点学习Solidity编程语言,这是EVM上最常用的智能合约语言。

Solidity是一种面向合约的编程语言,用于在以太坊虚拟机(EVM)上编写智能合约。它是Solidity开发者在以太坊平台上创建智能合约的主要选择之一。 学习Solidity的重点包括以下几方面: 语法和数据类型:学习Solidity的基本语法、数据类型、变量声明和函数定义等。 智能合约:了…

刷完这个笔记,17K不能再少了....

大家好&#xff0c;最近有不少小伙伴在后台留言&#xff0c;得准备面试了&#xff0c;又不知道从何下手&#xff01;为了帮大家节约时间&#xff0c;特意准备了一份面试相关的资料&#xff0c;内容非常的全面&#xff0c;真的可以好好补一补&#xff0c;希望大家在都能拿到理想…

cobaltstrike之execute-assembly内存加载—后渗透利用

通过execute-assembly内存加载来执行文件&#xff0c;从而避免后渗透中被杀毒软件静态报毒&#xff0c;使更多的工具能够继续利用&#xff0c;常见的方式有权限维持&#xff0c;代理上线等操作 远程bin文件加载 首先尝试远程加载bin文件 使用项目https://github.com/shanekha…

IO 多路转接之 epoll

文章目录 IO 多路转接之 epoll1、IO 多路转接之 poll1.1、poll 函数1.2、poll 函数返回值1.3、Socket 就绪条件1.3.1、读就绪1.3.2、写就绪1.3.3、异常就绪 1.4、poll 的优点1.5、poll 的缺点1.6、poll 改写 select 2、IO 多路转接之 epoll2.1、epoll 函数2.2、epoll_create2.3…

视频字幕生成:分享6款专业易操作的工具,让创作更简单!

​视频字幕如何添加&#xff1f;日常剪辑Vlog视频时&#xff0c;就需要给视频添加上字幕了。字幕是一个比较重要的元素&#xff0c;它不仅可以帮助听力受损或语言障碍的人士理解内容&#xff0c;还可以让你的视频更加易于理解和吸引观众。 那么如何实现视频字幕生成&#xff0c…

Linux 进程与进程状态

目录 1.进程。 1.进程的概念 2.并行和并发 3.并行和并发的区别&#xff1a; 4.PCB&#xff08;程序控制块&#xff09; 5.进程组与会话。 6.进程状态。 1.进程。 1.进程的概念 进程是操作系统进行资源分配和调度的一个独立单位。每个进程都运行在操作系统的控制之下&…

8.进销存系统(基于springboot的进销存系统)

目录 1.系统的受众说明 2.开发技术与环境配置 2.1 SpringBoot框架 2.2 Java语言简介 2.3 MySQL环境配置 2.4 idea介绍 2.5 mysql数据库介绍 2.6 B/S架构 3.系统分析与设计 3.1 可行性分析 3.1.1 技术可行性 3.1.2 操作可行性 3.1.3经济可行性 3.4.1 数据库…

一些做题中总结的零散的python函数的简单运用

输出保留两位数的小数 将16进制&#xff08;可修改&#xff09;的数进制转换成十进制并输出 大小写转化&#xff0c;第一个是搞成全部大写的&#xff0c;第二个高成全部小写的&#xff0c;最后一个是搞成第一个是大写的其他全部是小写的 将这个n的两边空格去掉 使用print(n,end…

叶国富学得会胖东来吗?

“大家都看不懂就对了&#xff0c;如果都看得懂我就没有机会了。”昨晚&#xff0c;实体零售迎来一则重磅消息&#xff0c;名创优品获得了全国第二大连锁超市永辉超市的大股东身份。在资本市场负反馈的压力下&#xff0c;名创优品创始人叶国富有了上述回应。 消息公布后&#x…

2.以太网

局域网 局域网: Local Area Networks (LAN) 网络大小分类 局域网园区网(可以理解为企业网)城域网 广域网是一个网络连接的技术&#xff0c;并非多大范围的网络 网关 为局域网内的用户提供了一扇门&#xff0c;通过网关可以访问到别的网络。这个门&#xff0c;就叫网关 以…

解决你的IDE在使用的时候测试单元@Test在创建Scanner对象是键盘键入不了的问题;

插播一条快讯&#xff0c;我在我的ide中新创建 了project后发现我的测试单元不好使了&#xff0c;即 import org.junit.Test; 这个包在创建Scanner对象接受键盘时&#xff0c;控制台输入时没有任何反应&#xff0c;键入不了了&#xff0c;我的问题出现原因可能是我导入了JDBC…

BitSet-解决数据压缩问题

一、问题引入 假设QQ音乐服务器上有9000万首音乐&#xff0c;用户按照歌名来搜索歌曲&#xff0c;如何使得满足这一需求所需的数据占用的内存空间最小以及用户搜索歌曲速度更快 二、分析问题 1、为了满足使得数据占用的内存更小&#xff0c;可以采用映射的思路&#xff0c;按…