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:

cpp 复制代码
#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:

cpp 复制代码
#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;

}

结果:

相关推荐
爱装代码的小瓶子34 分钟前
Linux下的权限与文件
linux·运维·服务器
ggaofeng1 小时前
linux中mount的本质是什么?自己如何实现一个伪文件系统
linux·mount·自己实现伪文件系统
敲上瘾1 小时前
Linux系统C++开发环境搭建工具(二)—— etcd 使用指南
linux·c++·etcd
励志不掉头发的内向程序员2 小时前
【Linux系列】解码 Linux 内存地图:从虚拟到物理的寻宝之旅
linux·运维·服务器·开发语言·学习
woshihonghonga2 小时前
停止Conda开机自动运行方法
linux·人工智能·conda
遇见火星5 小时前
Ubuntu Docker 容器化部署教程
linux·ubuntu·docker
ybb_ymm7 小时前
mysql8在linux下的默认规则修改
linux·运维·数据库·mysql
半梦半醒*7 小时前
zabbix安装
linux·运维·前端·网络·zabbix
武文斌7710 小时前
复习总结最终版:单片机
linux·单片机·嵌入式硬件·学习
驱动探索者10 小时前
贝尔实验室发展史:20世纪科技圣殿的辉煌与沉浮
linux