Linux--进程间通讯--FIFO(open打开)

news2024/11/27 5:40:38

1. 什么是FIFO
FIFO命名管道,也叫有名管道,来区分管道pipe。管道pipe只能用于有血缘关系的进程间通信,但通过FIFO可以实现不相关的进程之间交换数据。FIFO是Linux基础文件类型中的一种,但是FIFO文件在磁盘上没有数据块,仅仅用来标识内核中的一条通道。各进程可以打开这个文件进行read/write操作,实际上是在读写内核通道,这样就实现了进程间通信。

创建FIFO的方式:

使用命令创建:mkfifo 管道名,可以理解为创建一个管道伪文件。
使用库函数创建:mkfifo()函数,并且一旦使用mkfifo()创建了一个FIFO,就可以使用open来打开它,常见的文件I/O函数都可用于FIFO。如:close、read、write、unlink等。
实际上,创建一个FIFO命名管道的时候,内核会为FIFO(伪)文件开辟一个缓冲区,操作FIFO文件就相当于操作这个缓冲区,以此来实现进程间的通信,这种通信实际上就是文件读写的操作来实现的。(可以把FIFO理解为一个文件,一个进程向该文件写数据,另一个进程从该文件中读书数据,前提是两个进程读写的是同一个FIFO文件才能实现通信)

2.当open一个FIFO时,是否设置非阻塞标志(O_NONBLOCK)的区别:

        若没有执行O_NONBLOCK(默认),只读open要阻塞到某个其他进程为写而打开此FIFO。类似的,只写open要阻塞到其他进程为读而打开它。

        若指定了O_NONBLOCK,则只读open立即返回。而只写open将出错返回-1,如果没有进程已经为读而打开该FIFO,其errno置ENXIO。
 

3.代码:

创建两个进程,一个进程向FIFO数据,一个进程从FIFO数据。

write:

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



//       int mkfifo(const char *pathname, mode_t mode);
//   ssize_t write(int fd, const void *buf, size_t count);



int main()
{

	int cnt = 0;
	char *str = "message from fifo";

	int fd = open("./ipc-file",O_WRONLY);
	printf("write open success\n");

	while(1){


		write(fd,str,strlen(str));
		sleep(2);
		cnt++;
		if(cnt == 5){
			break;



		}


	}

	close(fd);

	return 0;

}

read:

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

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

int main()
{
	int cnt = 0;
	char buf[30]={0};	

	if(mkfifo("./ipc-file",0700)==-1 && errno != EEXIST){
		printf("mkfifo fail");
		perror("why");
	}	


	int fd = open("./ipc-file",O_RDONLY);
	printf("open success\n");


	while(1){

		int nread = read(fd,buf,30);
		printf("read %d byte from fifo/n,context :%s\n",nread,buf);
		cnt++;
		if(cnt == 3){

			break;


		}
	}

	close(fd);
	return 0;

}

结果:

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

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

相关文章

快递查询、导出表格,批量操作效率更高

当我们需要查询多个快递的状态时&#xff0c;通常会感到繁琐和耗时。然而&#xff0c;现在有一种快捷的方法可以帮助我们快速批量查询快递&#xff0c;而且还可以将查询结果导出成表格&#xff0c;轻松搞定&#xff01; 首先&#xff0c;在浏览器中搜索“固乔科技”&#xff0c…

SSL证书系列--Let’s Encrypt和TrustAsia哪个好?

原文网址&#xff1a;SSL证书系列--Let’s Encrypt和TrustAsia哪个好&#xff1f;_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Let’s Encrypt和TrustAsia这两款免费SSL证书的区别。 Let’s Encrypt 简介 Let’s Encrypt是一家全球性的证书颁发机构&#xff0c;由一个非营利…

OpenCV之FCN图像分割

&#x1f482; 个人主页:风间琉璃&#x1f91f; 版权: 本文由【风间琉璃】原创、在CSDN首发、需要转载请联系博主&#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 前言 Fully Convolutional Network&#xff08;FCN&#xff09;是一种深度学习…

buu web [强网杯 2019]随便注

easy_sql 看来这是一道sql注入的题 1、起手试探 1 报错 1# 正确 ps:提交的不显示&#xff0c;想知道提交的东西就看红框的位置&#xff0c;就标了一个&#xff0c;剩下的也一样 2、 测字段数&#xff0c;到三报错&#xff0c;说明字段为二 1 order by 1# 1 order by 2…

去噪方法总结

图像降噪方法如下图&#xff1a; 空间域局部滤波 线性滤波 原图&#xff1a; 给原图加了四类噪声以后&#xff1a; 均值滤波 主要原理&#xff1a; 用像素邻域的灰度均值代替该像素的值 opencv里面有api 直接用api size 用的是7 对这四张图用均值滤波 &#xff08;上下是一一…

记录一些奇怪的报错

错误&#xff1a;AttributeError: module distutils has no attribute version 解决方案&#xff1a; 第一步&#xff1a;pip uninstall setuptools 第二步&#xff1a;conda install setuptools58.0.4 错误&#xff1a;ModuleNotFoundError: No module named _distutils_hac…

Java定时器

对于定时器的设定&#xff0c;想必大家在不少网站或者文章中见到吧&#xff0c;但是所谓的定时器如何去用Java代码来bianx呢&#xff1f;&#xff1f;感兴趣的老铁&#xff0c;可以看一下笔者这篇文章哟~~ 所谓的定时器就是闹钟&#xff01;&#xff01; 设定一个时间&#x…

计算机毕业设计 高校课程评价系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

Vray渲染与窗口呈现不一致怎么办?

3D场景渲染过程中&#xff0c;可能大多情况下&#xff0c;大家都会选择Vray渲染器。它是最流行的渲染引擎之一。 但是&#xff0c;在渲染过程中&#xff0c;大家还是会遇到vray渲染和窗口不一致的问题。 在渲染过程中&#xff0c;窗口显示和实际渲染结果不同步的情况。不仅影响…

【DevOps核心理念基础】1. 什么是 devops

一、什么 devops? 1.1 定义 1.2 作用 1.3 核心 1.4. 软件开发流程 1.5. DevOps的核心定义 1.6. 具备的能力 二、DevOps流程中的几个关键概念 2.1 持续集成 2.2 持续交付 2.3 持续部署 2.4 总结 三、DevOps和敏捷开发的演进 一、什么 devops? 1.1 定义 Developme…

基于YOLOv8模型的80类动物目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOv8模型的80类动物目标检测系统可用于日常生活中检测与定位车辆目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数…

基于springboot+vue的大学社团管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

如何实现微服务

一、问题拆解 1.1、客户端如何访问这些服务 原来的Monolithic方式开发&#xff0c;所有的服务都是本地的&#xff0c;UI可以直接调用&#xff1b;现在按功能拆分成独立的服务&#xff0c;跑在独立的虚拟机上的Java进程了。客户端UI如何访问他的&#xff1f; 后台有N个服务&a…

golang面试题:对未初始化的的chan进行读写,会怎么样?为什么?

问题 对未初始化的的 chan 进行读写&#xff0c;会怎么样&#xff1f;为什么&#xff1f; 怎么答 读写未初始化的 chan 都会阻塞。 举例 写未初始化的 chan package main // 写未初始化的chan func main() {var c chan intc <- 1 }// 输出结果 fatal error: all gorou…

[译] MySQL-恢复被删除的Performance Schema 数据库

原文地址&#xff1a;https://blog.sqlauthority.com/2021/12/23/mysql-recover-dropped-performance-schema-database/ 原文作者&#xff1a;Pinal Dave 登录后复制今天早些时候我在一个在线论坛上看到有用户在找如何恢复被删除的Performance Schema 数据库的方法。 老实说&a…

【Java】什么是过滤器链(FilterChain )?哪些场景可以使用过滤器链?

文章目录 前言1、创建过滤器2、修改 web.xml3、运行项目并查看结果 前言 在一个 Web 应用程序中可以注册多个 Filter 程序&#xff0c;每个 Filter 程序都可以针对某一个 URL 进行拦截。如果多个 Filter 程序都对同一个 URL 进行拦截&#xff0c;那么这些 Filter 就会组成一个…

基于腾讯文档进行应届生个人求职记录

1. 新建一个腾讯文档 电脑登录QQ&#xff0c;点击“腾讯文档”功能键。 2. 可以选择下载客户端&#xff0c;也可以直接进入网页版。&#xff08;本人使用网页版&#xff09; 3. 点击新建&#xff0c;选择在线表格。 4. 编辑表名&#xff0c;表内容。 5. 设置文档权限&#xf…

青大数据机构【2013】

关键字&#xff1a; 邻接表空间复杂度、求无向图连通分量&#xff08;BFS、DFS&#xff09;、B树根节点最小关键字、平均查找长度最小的排序、二叉树排序叶子结点次序不变、不同次序建立二叉排序树及中序遍历、直接插入排序特点、强连通分量、邻接矩阵邻接表 一、单选&#x…

vue2中使用富文本编辑器tinyMCE全过程

第一步&#xff1a;安装TinyMCE $npm install tinymce5.10.0 -S $npm install tinymce/tinymce-vue3.0.1 -S 第二步&#xff1a;在node_modules中找到tinymce文件夹将内部文件移入pubilc/tinymce文件夹中在index.html文件中引入tinymce.min.js 注意&#xff1a;不把js文件放…

Java 基本类型和包装类

Java 是基于对象的&#xff0c;所以我们都需要以对象的想法来进行思维。 但 Java 又提供了 8 个基本类型&#xff0c;这 8 个基本类型基本上都和数字有关&#xff0c;是直接可以使用的类型。 基本类型大小包装器类型boolean/Booleanchar16bitCharacterbyte8bitByteshort16bitS…