Linux——进程通信(三)命名管道

前言

我们在之前学习了匿名管道与匿名管道的应用——进程池,但是匿名管道的通信,需要有血缘关系的进程(通过fork创建的进程们),如果我想让两个毫不相干的进程进行通信,可以采样命名管道的方式(有名字,通过名字可以找到,不需要继承的方式)。

一、命名管道的原理与指令

命名管道指令创建很简单,输入指令 mkfifo + 文件名,就可以创建一个命名管道。命名管道需要被创建在磁盘上,他是有自己的路径的,因为路径是具有唯一性的,所以我们可以使用路径+文件名的方式,来让不同进程看到同一份资源

那么两个没有血缘关系的进程,就可以通过命名管道的唯一性找到他,并借此通信。原理是跟匿名管道没什么区别,匿名管道是继承下来文件,命名管道是自己打开的文件

如下,就实现了命名管道的通信,echo进程与cat进程实现了通信。

同时,在我们管道通信的过程中,fifo管道的大小一直都是0,并不会写入到文件中,这是管道的特性决定了,因为根本没必要将数据拷贝到磁盘中,在缓冲区中就可以了,你写入就写在缓冲区中,你读取也在缓冲区中读取,这是内存级别的。

二、命名管道的代码

创建命名管道,首先需要mkfifo函数,第一个参数为创建命名管道的路径与文件名,第二个参数mode为创建的权限。创建成功返回0,失败返回-1,错误码也被设置。

代码思路:现在我们需要两个进程,不再是fork出来的,因此需要写一个服务端创建管道,并打开文件,读取客户端消息,还需要一个客户端打开服务端创建的管道文件,往里面写入消息。

具体代码调用接口就好。因为是复用的文件相关函数,因此代码实现没什么难度。

server.cc

#include <iostream>
#include <cstring>
#include <cerrno>
#include <cstdlib>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>using namespace std;#define FILENAME "fifo"int main()
{//创建命名管道int n = mkfifo(FILENAME,0666); if(n<0){cerr<<"错误码:"<<errno<<",错误原因:"<<strerror(errno)<<endl;return 1;}//打开文件int fd = open(FILENAME,O_RDONLY);if(fd < 0){cerr<<"错误码:"<<errno<<",错误原因:"<<strerror(errno)<<endl;return 2;}//读取信息char buff[1024];while(true){ssize_t rn = read(fd,buff,sizeof(buff)-1);if(rn > 0){buff[rn] = '\0';cout<<"客户端说:"<<buff<<endl;}} }

client.cc 

#include <iostream>
#include <cstring>
#include <cerrno>
#include <cstdlib>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>using namespace std;
#define FILENAME "fifo"
int main()
{//打开文件int fd = open(FILENAME,O_WRONLY);if(fd<0){cerr<<"错误码:"<<errno<<",错误原因:"<<strerror(errno)<<endl;return 1;}//写入消息string message;while(true){getline(cin,message);ssize_t wn = write(fd,message.c_str(),message.size());if(wn<0){cerr<<"错误码:"<<errno<<",错误原因:"<<strerror(errno)<<endl;break;}}close(fd);return 0;
}   

Makefile,由于我们需要两个进程共同协作,因此采样依赖的方式,先依赖上要形成的可执行文件,这样我们就可以一次生成两个可执行程序了。

.PHONY:all
all:server clientserver:server.ccg++ -o $@ $^ -std=c++11client:client.ccg++ -o $@ $^ -std=c++11.PHONY:clean
clean:rm -f server client

执行这两个可执行程序,成功进行进程通信。

 

 

 

 

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go语言中的锁与管道的运用

目录 1.前言 2.锁解决方案 3.管道解决方案 4.总结 1.前言 在写H5小游戏的时候&#xff0c;由于需要对多个WebSocket连接进行增、删、查的管理和对已经建立连接的WebSocket通过服务端进行游戏数据交换的需求。于是定义了一个全局的map集合进行连接的管理&#xff0c;让所有…

80后深圳设计师原创设计 妙解中小学生午休难题

3月17日至21日&#xff0c;深圳国际智能家居博览会在宝安国际会展中心举办。智慧校园展区成为焦点&#xff0c;吸引了众多目光。智荟康科技展出的午休课桌椅产品&#xff0c;为解决中小学生“趴睡”问题而研发&#xff0c;创新实用&#xff0c;在智慧校园展区中备受好评。 &…

Leetcode 79. 单词搜索

心路历程&#xff1a; 做完这道题才发现是回溯&#xff0c;一开始想的是递归&#xff0c;判断完第i个字符后&#xff0c;只需要挨个判断第i1个字符在不在第i个字符的邻域。后来发现由于不能重复使用元素&#xff0c;所以需要维护一个visited列表&#xff0c;并且在遍历所有可能…

蓝桥杯---代分数

import java.util.Scanner;public class top4 {//全排列分数的那个题目//首先进行n个数的全排列//然后将这n个数字拆分为3个数字&#xff0c;即插入两个板子//然后判断等式是否成立&#xff08;判断条件就是在if里面去进行相关的判断是吗&#xff1f;&#xff1f;&#xff09;s…

Spring项目部署到linux上

目录 一、环境配置 1、数据准备 2、程序配置文件修改 二、打包项目 三、上传jar包到服务器 四、开放端口号 五、运行程序 六、查看日志 七、常见问题 1、服务未启动 2、端口号已被占用 3、端口未开放 一、环境配置 1、数据准备 需要先在linux环境下的数据库中创建…

Go语言之函数、方法、接口

一、函数 函数的基本语法&#xff1a; func 函数名&#xff08;形参列表&#xff09;&#xff08;返回值列表&#xff09; {执行语句...return 返回值列表 } 1.形参列表&#xff1a;表示函数的输入 2.函数中的语句&#xff1a;表示为了实现某一功能的代码块 3.函数可以有返回…

【Linux】进程排队的理解进程状态的表述僵尸进程和孤儿进程的理解

一、进程排队的理解 进程不是一直运行的&#xff0c;进程可能会在等待某种软硬件资源。即使把进程加载到CPU中&#xff0c;也不是一直会运行的。而进程排队&#xff0c;一定是在等待某种软硬件资源&#xff08;可以是CPU&#xff0c;键盘&#xff0c;磁盘&#xff0c;网卡等等设…

rabbitmq-spring-boot-start配置使用手册

rabbitmq-spring-boot-start配置使用手册 文章目录 1.yaml配置如下2.引入pom依赖如下2.1 引入项目resources下libs中的jar包依赖如下2.2引入maven私服依赖如下 3.启动类配置如下4.项目中测试发送消息如下5.项目中消费消息代码示例6.mq管理后台交换机队列创建及路由绑定关系如下…

深入探讨Python中的文件操作与文件IO操作【第141篇—Python实现】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 深入探讨Python中的文件操作与文件IO操作 在Python编程中&#xff0c;文件操作和文件IO操作…

ES集群和分片以及脑裂

文章目录 概要一、概念二、节点角色三、master节点脑裂四、参考 概要 在工作中不可避免会用到ES&#xff0c;而用到ES就不得使用其集群模式了。 单节点的话不得不面临两个重大缺陷&#xff1a;单点故障&#xff08;高可用&#xff09;和海量数据存储搜索。 ES通过集群模式解决…

JSR规范系列(6)——Jakarta EE 9 规范

Jakarta EE 9 规范 Jakarta EE 9 规范 JSR规范系列&#xff08;1&#xff09;——Java版本、JSR规范和JCP社区流程概述 JSR规范系列&#xff08;2&#xff09;——JavaSE规范、JavaEE规范、JSR规范全面整理——截止201908 JSR规范系列&#xff08;3&#xff09;——Java EE 6规…

● 647. 回文子串 ● 516.最长回文子序列 ● 动态规划总结篇

● 647. 回文子串 1.dp数组含义。 之前的题目&#xff0c;差不多都是求什么就怎么定义dp数组&#xff0c;最后返回dp的最后一个元素。但是这里如果定义一维数组dp[i]是[0,i]范围的回文子串的个数的话&#xff0c;怎么根据dp[i-1]得到dp[i]&#xff1f;发现很难找到递归关系…

Linux之gcc_makefile

一、提要 1. 预处理&#xff08;进行宏替换) 2. 编译&#xff08;生成汇编) 3. 汇编&#xff08;生成机器可识别代码&#xff09; 4. 链接&#xff08;生成可执行文件或库文件) 五六十年代&#xff0c;我们编程大多是二进制编程&#xff0c;也就是使用打孔纸带喂给机器 再往后&…

118.Qt入门,实现一个图片查看软件

需要用到的控件 QLabelQLineEditQPushButton 需要实现的功能 打开目录选择图片显示图片的名字显示图片 QLabel基本用法 void setText(const QString &);//设置文本QString text() const;//获取文本void setPixmap(const QPixmap &);设置大小 使用父类QWidget的方法设置…

窗口函数(sample database classicmodels _No.8 )

窗口函数&#xff08;sample database classicmodels _No.8 &#xff09; 准备工作&#xff0c;可以去下载 classicmodels 数据库具体如下 点击&#xff1a;classicmodels 也可以去 下面我的博客资源下载 https://download.csdn.net/download/tomxjc/88685970 文章目录 窗口函…

什么品牌洗地机清洁效果最好?洗地机品牌十大排名:前四名口碑公认

有使用过洗地机的朋友&#xff0c;相信对此都深有感触&#xff0c;洗地机的一洗一吸&#xff0c;清洁效果非常棒&#xff0c;地面的污渍、垃圾、粉尘都坚持不了几秒钟&#xff0c;分分钟可以让家里地面焕然一新&#xff0c;简直不要太香。但是&#xff0c;洗地机那么多&#xf…

Unity类银河恶魔城学习记录11-2 p104 Inventoty源代码

此章节相对较难理解&#xff0c;有时间单独出一章讲一下 Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili InventoryItem.cs…

FMQL45 XADC

通过PL自带的XADC可以读写温度&#xff0c;电压等&#xff0c;但是总是读的不对。开始查找FM_QL_bsp里面少了一个部分就是pl&#xff01;添加&#xff0c;在ewp已经修改了&#xff0c;但是文件不存在&#xff0c;现在给补上了&#xff0c;有点奇怪&#xff0c;有的项目会自动生…

网络安全-护网行动1

1.什么事hvv行动 2021年攻击队伍 100队伍&#xff0c;不设定攻击路径&#xff0c;在不违法和不破坏防守单位的前提下可以使用任何工具&#xff0c;如社会工程、钓鱼等 攻击方&#xff1a; 又公安部提供统一的攻击平台&#xff0c;场景、规则 防守方&#xff1a;也有自己的平台…

Python入门(小白友好)

知识图谱 搭建环境 安装Python:Download Python | Python.org 安装PyCharm:Download PyCharm: The Python IDE for data science and web development by JetBrains 注意:专业版本是收费的,新手小白使用社区版(community)即可 创建第一个项目: 一些PyCharm的设置(也适用…