当前位置: 首页 > news >正文

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

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.lryc.cn/news/164912.html

相关文章:

  • 哪里可以了解轻量的工作流引擎?
  • lvs负载均衡、LVS集群部署
  • 如何应对核心员工提离职?
  • 建站系列(八)--- 本地开发环境搭建(WNMP)
  • 21天学会C++:Day8----范围for与nullptr
  • Linux——环境变量
  • Screen的详细全面安装教程及Screen的用法
  • 生成树、Prufer序列的计数问题:0912T1
  • SQL_牛客网_SQL264_求每个登陆日期的次日留存率
  • Hive 基础知识
  • 【数据结构】树的基础知识及三种存储结构
  • ABB 3BHB003688R0101接口模块
  • 精简 jre 涉坑记录
  • Java程序员学习算法路线规划总结
  • 火山引擎 ByteHouse:两个关键技术,揭秘 OLAP 引擎中的数据导入技术
  • 深挖“范围经济”穿越产业周期:TCL电子持续繁荣的密码
  • Elasticsearch:使用 ESRE 和生成式 AI 了解 TLS 日志错误
  • Swing程序设计(3)JDialog窗体
  • 类和对象(1)
  • 学会用命令行创建uni-app项目并用vscode开放项目
  • java.lang.ClassCastException: android.os.BinderProxy cannot be cast to ...
  • AIGC(生成式AI)试用 3 -- 专业主题
  • rsyslog-日志管理 logrotate-日志轮转
  • 类和对象续
  • SpringCloud:Feign实现微服务之间相互请求
  • LeetCode 1359. Count All Valid Pickup and Delivery Options【动态规划,组合数学】1722
  • [杂谈]-从硬件角度理解二进制数
  • Fast-DDS 服务发现简要概述
  • 基于spingboot的websocket订阅、广播、多人聊天室示例
  • Linux mac Windows三系统 局域网文件共享方法