有名管道FIFO

news2024/11/15 11:00:42

目录

  • 1、概述
  • 2、通过命令创建有名管道
  • 3、通过函数创建有名管道
  • 4、有名管道读写操作
  • 5、有名管道注意事项

1、概述

管道,由于没有名字,只能用于亲缘关系的进程间通信。为了克服这个缺点,提出了命名管道(FIFO),也叫有名管道、FIFO文件。命名管道(FIFO)不同于无名管道之处在于它提供了一个路径名与之关联,以 FIFO 的文件形式存在于文件系统中,这样,即使与 FIFO 的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过 FIFO 相互通信,因此,通过 FIFO 不相关的进程也能交换数据。

命名管道(FIFO)和无名管道(pipe)有一些特点是相同的,不一样的地方在于:

  1. FIFO 在文件系统中作为一个特殊的文件而存在,但 FIFO 中的内容却存放在内存中
  2. 当使用 FIFO 的进程退出后,FIFO 文件将继续保存在文件系统中以便以后使用。
  3. FIFO 有名字,不相关的进程可以通过打开命名管道进行通信。

2、通过命令创建有名管道

在这里插入图片描述

3、通过函数创建有名管道

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>

//通过mkfifo函数创建一个管道的名字fifo
int main(void){
	int ret=-1;
	//创建一个有名管道,管道的名字fifo
	ret=mkfifo("fifo",0644);
	if(-1 == ret){
		perror("mkfifo");
		return 1;
	}
	printf("创建一个有名管道ok...\n");
    return 0;
}

在这里插入图片描述

4、有名管道读写操作

一旦使用mkfifo创建了一个FIFO,就可以使用open打开它,常见的文件I/O函数都可用
于fifo。如:close、read、write、unlink等。删除FIFO严格遵循先进先出(first in first out),对管道及FIFO的读总是从开始处返回数据,对它们的写则把数据添加到末尾。它们不支持诸如lseek()等文件定位操作。

read.c文件

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

#define SIZE 128
//读有名管道
int main(){
	int fd =-1;
	int ret=-1;
	char buf[SIZE];
	
	//1.以只读的方式打开一个管道文件
	fd = open("fifo",O_RDONLY);
	if(-1==fd){
		perror("open");
		return 1;
	}
	printf("以只读方式打开一个管道ok...\n");
	
	//2.循环读管道
	while(1){
		memset(buf,0,SIZE);
		ret=read(fd,buf,SIZE);
		if(ret<=0){
			perror("read");
			break;
		}
		printf("buf: %s\n",buf);
		sleep(1);
	}
	//3.关闭文件
	close(fd);
	return 0;
}      

write.c文件

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

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

#define SIZE 128
//写有名管道
int main(){
	int i=0;
	int fd =-1;
	int ret=-1;
	char buf[SIZE];
	//1.以只写的方式打开一个管道文件
	fd = open("fifo",O_WRONLY);
	if(-1==fd){
		perror("open");
		return 1;
	}
	printf("以只写方式打开一个管道ok...\n");
	//2.写管道
	while(1){
		memset(buf,0,SIZE);
		sprintf(buf,"hello itcast %d",i++);
		ret=write(fd,buf,strlen(buf));
		if(ret<=0){
			perror("write");
			break;
		}
		printf("write fifo: %d\n",ret);
		sleep(1);
	}
	//3.关闭文件
	close(fd);
	return 0;
}    

Makefile文件

all: read write

read:read.c
	gcc $< -o $@

write:write.c
	gcc $< -o $@

.PHONY:clean
clean:
	rm -rf read write

在这里插入图片描述
在这里插入图片描述

5、有名管道注意事项

  1. 一个为只读而打开一个管道的进程会阻塞直到另外一个进程为只写打开该管道
  2. 一个为只写而打开一个管道的进程会阻塞直到另外一个进程为只读打开该管道

读管道:

  • Ø 管道中有数据,read返回实际读到的字节数。
  • Ø 管道中无数据
    (1)u 管道写端被全部关闭,read返回0 (相当于读到文件结尾)
    (2)u 写端没有全部被关闭,read阻塞等待

写管道:

  • Ø 管道读端全部被关闭, 进程异常终止(也可使用捕捉SIGPIPE信号,使进程终止)
  • Ø 管道读端没有全部关闭:
    (1)u 管道已满,write阻塞
    (2)u 管道未满,write将数据写入,并返回实际写入的字节数。

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

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

相关文章

风向变了!全域电子架构争夺战打响,玩家如何抢夺“软”黄金?

进入2023年&#xff0c;智能汽车已经进入了硬件快速革新的全新周期。从分布式架构到功能集成的域控制架构&#xff0c;再到如今的中央集中式电子架构&#xff0c;新一轮的产业链格局重塑已经启动。 在8月30日举办的2023年度&#xff08;第十五届&#xff09;高工智能汽车开发者…

Web3 社交平台如何脱颖而出?我们和 PoPP 聊了聊

能够颠覆 Web2 传统模式的社交产品有着怎样的特征&#xff1f;PoPP 作为专注于 Web3 的私域流量变现平台&#xff0c;为开发者和用户提供了社交产品发展的新路径&#xff0c;让社区用户充分实现互动交流&#xff0c;着力于创作内容的激励与变现。事实上&#xff0c;面对 Web3 社…

沐风老师3DMAX厨房橱柜生成器KitchenCabinetGenerator教程

3DMAX厨房橱柜生成器插件使用方法 3DMAX橱柜生成器KitchenCabinetGenerator是一个在3dMax中自动创建三维橱柜模型的高效脚本。它有多种风格的台面、门和橱柜&#xff0c;可以灵活地应用于Archviz项目&#xff0c;同时为3D艺术家节省大量时间。 【适用版本】 1.3dMax2018 – 20…

如何辨别不同等级的小红书美妆博主?

在当下的社交媒体时代&#xff0c;美妆博主已经成为了各大平台上备受关注的群体。他们以其出色的妆容技术、对美妆产品的独到见解以及精心打造的个人形象&#xff0c;吸引了大批粉丝的关注。今天给大家分享下&#xff0c;如何辨别不同等级的小红书美妆博主&#xff1f; 一、首先…

谷歌将在印度和日本推出生成式AI搜索服务SGE;OpenAI手把手官方教学

&#x1f989; AI新闻 &#x1f680; 谷歌将在印度和日本推出生成式AI搜索服务SGE 摘要&#xff1a;谷歌宣布其生成式AI搜索服务SGE将首次登陆印度和日本&#xff0c;并需通过加入Search Labs才能使用该功能。日本用户可使用日语&#xff0c;印度用户可选择使用英语或印地语。…

Ubuntu18.04系统下通过ROS控制Kinova真实机械臂

一、Kinova官方Development center控制 1.通过USB连接机械臂和电脑 2.Development center路径&#xff1a;文件夹Other Locations—Computer—opt—JACO-SDK—GUI—Development center(双击打开即可) 3.我们实验室自己搭建的双臂kinova机器人&#xff0c;通过Virtual Joystic…

RT-Thread 线程管理(一)

线程管理 在日常生活中&#xff0c;要完成一个大任务&#xff0c;一般会将它分解成多个简单、容易解决的小问题&#xff0c;小问题逐个被解决&#xff0c;大问题也就随之解决了。 在多线程操作系统中&#xff0c;也同样需要开发人员把一个复杂的应用分解成多个小的、可调度的…

视频一键对讲式消防报警柱

视频一键对讲式消防报警柱 一键对讲式消防报警柱是一种集报警、对讲、定位等多功能于一体的紧急报警设备。它通常安装在公共场所或大型建筑物内&#xff0c;用于紧急情况下的火灾报警和求助通话。 一键对讲式消防报警柱的主要特点如下&#xff1a; 1. 火灾报警功能&#xff1…

Java入坑之反射研究

一、快速入门 1.1反射概述 JAVA反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意一个方法和属性&#xff1b;这种动态获取的信息以及动态调用对象的方法的功能称为…

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)十一:通用表单组件封装实现

一、本章内容 本章实现通用表单组件,根据实体配置识别实体属性,并自动生成编辑组件,实现对应数据填充、校验及保存等逻辑。 1. 详细课程地址: 待发布 2. 源码下载地址: 待发布 二、界面预览 三、开发视频 3.1 B站视频地址:

【Pandas 入门-5】Pandas 画图

Pandas 画图 除了结合 matplotlib 与 seaborn 画图外&#xff0c;Pandas 也有自己的画图函数plot&#xff0c;它的语法一般为&#xff1a; DataFrame.plot(xNone,yNone, kindline,subplotsFalse, titleNone)x横坐标数据y纵坐标数据kind默认是线图&#xff0c;还可以是‘bar’…

旅行旅游景点门票价格路线展示h5小程序开源版开发

旅行旅游景点门票价格路线展示h5小程序开源版开发 景点门票价格查询&#xff1a;用户可以通过输入景点名称或地址来查询该景点的门票价格。景点路线推荐&#xff1a;根据用户的出发地和目的地&#xff0c;提供最佳的旅游路线推荐。路线规划&#xff1a;用户可以在地图上选择多…

基于ssm+vue网上拍卖系统源码和论文

基于ssmvue网上拍卖系统源码和论文114 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 研究目的和意义: 1、研究目的 随着网络技术的不断发展和人们购物意识的不断革新&#xff0c;网上购物成为一种主流的购…

技术领导力实战笔记25

25&#xff5c;用心做好“鼓励式”管理 激发正能量 授权 分工作&#xff1a; 老人干新事&#xff0c;新人干老事&#xff0c;强者干难事&#xff0c;弱者干细事 新人干老事 所谓新人&#xff0c;是对业务产品不了解&#xff0c;对工作流程不清晰的岗位新人。对于新人来说&…

开发高效智能美妆算法:美颜SDK的关键技术解析

在当今社交媒体和视频直播的时代&#xff0c;人们越来越关注如何在虚拟世界中展现最佳的自己。美颜技术在此背景下应运而生&#xff0c;而其中的关键技术在开发高效智能美妆算法方面扮演了重要角色。本文将深入探讨美颜SDK的关键技术&#xff0c;揭示其背后的原理与创新。 一…

微信小程序字符串转时间的坑

目录 一、测试环境 二、问题现象 三、总结 先说结论&#xff0c;字符串转时间支持yyyy/MM/dd格式&#xff0c;我们常见的yyyy-MM-dd格式有兼容性问题。处理方式: new Date(dateString.replace(/-/g, "/")) 一、测试环境 微信版本8.0.40&#xff0c;手机苹果XR&…

go学习part20(2)反射细节

1.反射细节 1) reflect.Value.Kind&#xff0c;获取变量的类别&#xff0c;返回的是一个常量&#xff08;看手册) 2&#xff09;Type是类型,Kind是类别 Type和Kind可能是相同的&#xff0c;也可能是不同的. 比如: var num int 10 num的Type是int , Kind也是int 比如: var…

1Java:JDK是什么

1Java是介于编译型语言和解释型语言之间 编译型语言&#xff1a;c c先编译成机器码&#xff0c;再执行 解释型语言&#xff1a;pytn 解释器直接加载源码运行&#xff0c;但是运行效果低 Java是将代码编译成一张字节码,优点 针对不同平台编写虚拟机&#xff0c;不同平台的虚拟…

【ctf题目系列】ctfwiki pwn类型

categories: ctf ret2shellcode [rootningan ret2shellcode]# ./ret2shellcode No system for you this time !!! 123 bye bye ~[rootningan ret2shellcode]#checksec检查 [rootningan ret2shellcode]# checksec ret2shellcode [!] Could not populate PLT: future feature …

二维数组创建方式比较

暑假跟着地质队去跑山了&#xff0c;到现在还没结束&#xff0c;今天休息的时候突然刷到了一篇关于C二维数组创建方面的文章&#xff0c;我觉得还是非常不错滴&#xff0c;就将其中提到的新方法和我已经使用过的三种方法进行了比较&#xff0c;发现该方法提高了二维数组的分配、…