进程间通信,有名管道(pipe)与无名管道(fifo)的解析与运用,以及代码实现

news2024/11/26 8:59:31

 

 🎊【进程通信与并发】专题正在持续更新中,进程,线程,IPC,线程池等的创建原理与运用✨,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏

🪔本系列专栏 -  进程通信与并发

🍻欢迎大家  🏹  点赞👍  评论📨  收藏⭐️

📌个人主页 - 勾栏听曲_0的博客📝

🔑希望本文能对你有所帮助,如有不足请指正,共同进步吧🏆

🎇善治病者,必医其受病之处;善救弊者,必塞其起弊之源。📈

无名管道(pipe)

介绍

        它在文件系统中没有名字(没有inode),它的内容在内核中,访问pipe的方式都是通过文件系统的API(read/write)

        它不能用open,但是read/write又需要一个文件描述符!!!

        所以在创建这个pipe的时候,就必须要返回文件描述符!!!

        pipe在创建时,在内核中开辟一块缓冲区,作为pipe文件的内容的存储空间,同时返回两个文件描述符(一个用来读,一个时用来写)

特点

           (1)pipe有两端,一端时用来写,一端是用来读;

           (2)按顺序读;不支持lseek(光标移动)

           (3)内容读走了,就没有啦

           (4)pipe(无名管道) 随内核持续性

接口

    头文件

#include <unistd.h>

    函数功能

       pipe用来在内核中创建一个无名管道,pipefd用来保存创建好的无名管道的两个文件描述符,pipe创建的管道,默认是"阻塞方式"

    函数原型

       int pipe(int pipefd[2]);

    函数参数

       int pipefd[2]     //数组。 

              pipefd[0] 保存读的文件描述符;

              pipefd[1] 保存写的文件描述符;

          

    函数返回值

       成功返回0 

       失败返回-1,同时errno被设置。

注意事项

    pipe(无名管道)的使用范围:只要两个进程可以获取这个pipe(无名管道)的文件描述符,就可以使用pipe(无名管道)来通信。

    pipe(无名管道)本身是全双工通信,但是两个进程使用一个管道进行全双工通信就必须要有某种方式同步,否则就可能自己读到自己写入的数据。所以在工程项目中,我们一般使用两个或以上的管道来实现全双工通信,一个读,一个写,人为的把它看成半双工通信。

    上面说到了pipe(无名管道)的使用范围,而这个使用范围一般又是进程间有亲缘关系的进程,除非通过某些方式将pipe(无名管道)告知其他进程。因此pipe(无名管道)一般都用于有亲缘关系的进程间通信。为什么呢?其原因就是pipe(无名管道)它没有名字,只能靠创建pipe(无名管道)时的文件描述符来确定pipe(无名管道)。记住这个特点,我们再看FIFO(有名管道)。

代码实例

    一下代码实现创建一个pipe(无名管道),子进程先往pipe(无名管道)中写入数据,然后再由父进程向pipe(无名管道)读取子进程写入的数据。

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>


int main(int argc, char * argv [])
{	
	int fd[2]; 
	int p = pipe(fd);
	if(p == -1)
	{
		perror("pipe failed\n");
	}

	pid_t pid = fork();
	if(pid == -1)
	{
		perror("fork failed\n");
	}
	if(pid > 0) 
	{	
		int statues;
		int w = wait(&statues);
		if(w == -1)
		{
			perror("wait failed\n");
			return -1;
		}

		char buf[6] = {0};
		int r = read(fd[0],buf,5);
		if(r != 5)
		{
			perror("read fd[0] failed\n");
		}
		printf("read's content is %s\n",buf);
	}
	else if(pid == 0)
	{	
		int w = write(fd[1],"hello",5);
		if(w != 5)
		{
			perror("write fd[1] failed\n");
		}
	
	}
	return 0;
}

有名管道(fifo)

介绍

fifo是在pipe的基础上,给fifo在文件系统中创建一个inode(它会在文件系统中有一个文件名),但是fifo文件的内容却是在内核中!!!

           fifo的文件名随文件系统持续性的;

           fifo的文件内容存在于内核,随内核持续性的。

           fifo同pipe一样,出除了fifo在文件系统中有一个文件名。所以特点也与pipe(无名管道)一样。

接口

fifo文件怎么创建呢?

    通过mkfifo函数接口 

    头文件

       #include <sys/types.h>

       #include <sys/stat.h>

    函数功能

       用来在文件系统中创建一个fifo(有名管道)

    函数原型

       int mkfifo(const char *pathname, mode_t mode);

    函数参数

       const char *pathname     //要创建的有名管道,在文件系统中的名字

       mode_t mode                 //创建的有名管道的权限,有两种方式指定:

                         (1)0660 0777 ...

                         (2)S_IRUSR   

    函数返回值

        成功:返回0

       失败:返回-1,同时errno被设置。

注意事项

    FIFO(有名管道)它和PIPE(无名管道)类似,除了它再文件系统中有一个名字。它可以被多个进程打开用来读或写。当进程用FIOF来交换数据时,内核根本没有把数据写到文件系统中去,而是保存在内核的内部,因此FIFO在文件系统中没有内容,它仅作为文件系统的一个引用入口,提供一个文件名,给其它进程去open它。

    在数据交换前,FIFO的两端(read,write)必须都被打开。通常情况下,你打开FIFO的一端,会阻塞,直到另外一端也被打开。

一个进程也可能以"非阻塞"方式(O_NONBLOCK)去打开。

    在这种情况下(以“非阻塞方式”),只读打开总会成功,即便写端没有被打开;只写打开总会失败,并且errno == EENXIO,除非读端已经打开。

阻塞与非阻塞

阻塞方式: 

    阻塞地读或写 

       读的时候,如果没有数据,则read会阻塞

       写的时候,如果没有空间,则write会阻塞 

             

非阻塞方式

    以非阻塞方式读或写 

       读的时候,如果没有数据,立即返回,设置相应的错误码

       写的时候,如果没有空间,立即返回,设置相应的错误码

代码实例

    一下代码实现两个无亲缘关系的进程间使用FIFO(有名管道)进程通信。一个进程用于读,一个进程用于写。

        第一个进程,用于将数据写进管道。

#include <stdio.h>
#include <sys/stat.h>	   
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char * argv [ ])
{
	//创建一个fifo有名管道文件
	int m =  mkfifo("./test.fifo", 0660);
	if(m == -1)
	{
		perror("mkfifo failed\n");
	}
	//打开管道文件
	int fd = open("./test.fifo",O_RDWR);
	if(fd == -1)
	{
		perror("open failed\n");
	}
	
	//写数据到管道文件
	char buf[11] = "I LOVE YOU";
	int w = write(fd, buf, 11);
	if(w != 11)
	{
		perror("write failed\n");
	}
	//关闭文件
	int c = close(fd);
	if(c == -1)
	{
		perror("close failed\n");
	}
	return 0;
}

        第二个进程,用于将管道中的数据读出来。

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>

int main(int argc, char * argv [ ])
{	
	int fd = open("./test.fifo",O_RDONLY);
	if(-1 == fd)
	{
		perror("open failedn");
	}

	char buf[6] = {0};
	int r = read(fd,buf,5);
	if(r != 5)
	{
		perror("read fd failed\n");
	}
	printf("read's content is %s\n",buf);
	itn c = close(fd);
	if(c == -1)
	{
		perror("close fd failed\n");
	}
	return 0;
}

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

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

相关文章

API网关:开源Apinto网关-应用管理篇

需求痛点 在这互联网高速发展的时代&#xff0c;企业业务系统多、渠道广&#xff0c;如何管理内外部调用端系统具有极大的挑战。 数量方面&#xff1a;API网关需要对各端应用统一管理&#xff0c;例如对企业自身很多的前端应用&#xff0c;包括不限于web应用、移动APP、小程序&…

AI边缘计算智能分析网关灭火器缺失检测与告警的实现过程

AI智能分析网关基于边缘智能&#xff0c;部署了多种AI深度学习算法&#xff0c;可对接入的多路视频流进行智能检测、智能识别等&#xff0c;包括人脸检测与识别、车辆检测与识别、车牌识别、烟火识别、安全帽识别、区域入侵检测等。今天我们来介绍下关于灭火器缺失检测与告警的…

基于Yolov5/Yolov7的DRConv动态区域感知卷积,即插即用,涨点显著!

1.Dynamic Region-Aware Convolution 论文:https://arxiv.org/pdf/2003.12243.pdf 本文提出了一种新的卷积算法,称为动态区域卷积算法(DRConv) ,该算法能够自动将滤波器分配到相应的空间区域,因此,DRConv具有强大的语义表示能力,并完美地保持了平移不变性。 DRConv的…

在IIS7下使用ASP连接ACCESS数据库时提示如下错误的处理方法

“/”应用程序中的服务器错误。 未在本地计算机上注册“microsoft.jet.oledb.4.0”提供程序。 这是由于使用的Win2008系统是64位的&#xff0c;以前Win2003是32位。有以下两种解决方法&#xff1a; 1、修改连接数据库的代码&#xff1a; 如原代码是 DataPath "App_Data…

Eclipse代码提示突然失灵的解决方案

不知道改动了啥&#xff0c;突然间Eclipse的代码提示就失效了&#xff0c;发现缺少后极不方便。 使用快捷键&#xff1a;Alt/ 提示 No Default Proposals 为什么使用快捷键&#xff1a;Alt/ 会提示“No Default Proposals。”呢&#xff1f; 网上提示可能是热键冲突 但是一套…

可调直动差压卸荷阀DDRV-100、DBRV-100

优点&#xff1a; 及时响应压力变化。 低压升。 潜在调节&#xff08;抗震动&#xff09;。 调整位置可锁定。 铝制操作手柄和填料压盖。 坚硬化处理。 可调直动式卸荷阀 ZRV-63 0类 可调直动式卸荷阀 DRV2-080 系列8 可调直动式卸荷阀 DRV-080_*_H 系列8 直动可调式…

微服务架构详解(一)

目录 1.微服务简介 2.微服务技术选型 3.微服务核心组件 3.1.注册中心 3.1.1.注册中心对比 3.2.服务网关 3.2.1.主流API网关对比 3.3.分布式配置中心 3.4.服务容错&#xff08;服务熔断&#xff09; 3.5.负载均衡 3.5.1.负载均衡有好几种实现策略&#xff0c; 3…

读取配置文件(properties、yaml)的八种方法

基础&#xff1a; 一、通过普通的I/O流读取配置文件(BufferedReader) 1、properties文件 2、测试类 public class TestReadProperties {Testpublic void IOReadProperties() throws IOException {// 把配置文件的内容封装进mapMap<String, Object> map new HashMap&l…

视频可视化搭建项目,通过简单拖拽方式快速生产一个短视频

一、开源项目简介 《视搭》是一个视频可视化搭建项目。您可以通过简单的拖拽方式快速生产一个短视频&#xff0c;使用方式就像易企秀或百度 H5 等 h5 搭建工具一样的简单。目前行业内罕有关于视频可视化搭建的开源项目&#xff0c;《视搭》是一个相对比较完整的开源项目&#…

矿井下无人值守变电所电力监控系统的探讨与产品选型

摘要&#xff1a;为了探讨井下无人值守变电所的电力监控系统技术&#xff0c;以西山煤电马兰矿为背景&#xff0c;详细阐述了井下无人值守变电所电力监控系统技术的各项基本参数&#xff0c;如额定工作电压及整机输入视在功率、交换机或监控分站的传输口、高压配电装置的传输口…

(二)ElasticSearch 辅助工具 Kibana 介绍与安装

1、什么是 kibana &#xff1f; Kibana 是一个针对Elasticsearch的开源分析及可视化平台&#xff0c;用来搜索、查看交互存储在Elasticsearch索引中的数据。使用Kibana&#xff0c;可以通过各种图表进行高级数据分析及展示。 Kibana让海量数据更容易理解。它操作简单&#xff…

怎么使用chatgpt,GPT的使用方式解析

怎么使用Chatgpt&#xff1f;这是很多人心中的疑惑&#xff0c;更多的人只是听说过chatgpt的大名&#xff0c;但是具体连见都没见过gpt&#xff0c;那么接下来小编就来给大家详细的介绍一下吧。 一.了解chatgpt ChatGPT是一个由人工智能和自然语言处理技术构建的聊天机器人。通…

[pytorch]FixMatch代码详解-数据加载

原文 FixMatch: Simplifying Semi-Supervised Learning with Consistency and Confidence. 这里还有一个译制版的很方便阅读 FixMatch&#xff1a;通过一致性和置信度简化半监督学习 代码 pytorch的代码有很多版本&#xff0c;我选择了比较简单的一个&#xff1a; unoffi…

记一次某应用虚拟化系统远程代码执行

漏洞简介 微步在线漏洞团队通过“X漏洞奖励计划”获取到瑞友天翼应用虚拟化系统远程代码执行漏洞情报(0day)&#xff0c;攻击者可以通过该漏洞执行任意代码&#xff0c;导致系统被攻击与控制。瑞友天翼应用虚拟化系统是基于服务器计算架构的应用虚拟化平台&#xff0c;它将用户…

xxl-job 7.32版本 安装部署

文章目录 前言xxl-job 7.32版本 安装部署1. xxl-job 是什么2. 特性3. xxl-job 部署安装3.1. 下载源码3.2. 部署:3.2.1. 初始化调度数据库3.2.2. 配置调度中心 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作…

GDOUCTF2023-部分re复现

目录 [GDOUCTF 2023]Check_Your_Luck [GDOUCTF 2023]Tea [GDOUCTF 2023]doublegame [GDOUCTF 2023]Check_Your_Luck 打开题目是一串代码&#xff0c;明显的z3约束器求解 直接上脚本 import z3 from z3 import Reals z3.Solver() vReal(v) xReal(x) yReal(y) wReal(w) zRea…

cocosLua 之文本相关

Text 用于创建系统或ttf文本&#xff0c; 类结构&#xff1a; #mermaid-svg-bMIqhf5X7M9uF2Ba {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-bMIqhf5X7M9uF2Ba .error-icon{fill:#552222;}#mermaid-svg-bMIqhf5X7…

走进社区客户端测试 | 得物技术

0.引言 社区 C 端质量体系建设思考&#xff1f; 询问一下 ChatGPT 1、关于社区客户端 1.1 社区端上功能 得物首页 搜索、发布、关注流、推荐流、沉浸式单列流、活动 tab、其他二级频道 tab 动态详情页 图文、视频、专栏、点评 私域 个人/他人主页、通讯录好友、微博好友…

不得不用ChatGPT的100个理由……

❝ 最近无论在哪&#xff0c;很多人都在吹ChatGPT无所不能&#xff0c;动不动就是AI要颠覆人类&#xff0c;很多人害怕有一天AI会取代自己&#xff0c;我认为明显是多虑了…… ❝ 当然&#xff0c;也有很多小白试用了ChatGPT之后&#xff0c;并没有感觉到他很强大&#xff0c;主…

车载以太网解决方案

近年来&#xff0c;为了满足智能网联汽车的开发要求&#xff0c;车载以太网技术开始逐渐进入人们的视野。而以太网技术已经成为下一代车载络架构的趋势之一&#xff0c;其发展之迅猛&#xff0c;使得各主机厂纷纷产生了浓厚的兴趣并投入研发。 一 为什么使用车载以太网 | 对高…