进程间的通信之命名管道(FIFO)
来源:互联网 发布:全球酒店排名 知乎 编辑:程序博客网 时间:2024/06/10 19:59
1.命名管道:
FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存储于文件系统中。命名管道是一个存在与硬盘上的文件,因此,即使进程与创建FIFO的进程不存在亲缘关系,可以在任何两个进程之间通信,只要可以访问该路径,就能够通过FIFO 相互通信。值得注意的是,FIFO(first input first output)总是按照先进先出的原则工作,第一个被写入的数据将首先从管道中读出。
2.命名管道的创建与读写
(1)shell下使用命令
mknod namedpipe
(2)系统函数:在文件系统中创建一个文件
int mknod(const char *path,mode_t mod,dev_t dev);
int mkfifo(const char*path,mode_t mod)
//path是创建命名管道的全局路径,各进程都可以访问;
mod为创建的模式(读写权限)。
(3)操作:
因为命名管道是一个存在与内存的特殊文件,所有首先要open();
打开的方式有读写(O_RDWR),只读(O_RDONLY),只写(O_WRONLY)
注意:只读,调用open的函数的进程将会被阻塞直到有写方打开管道;
同样,只写,调用open的函数的进程将会被阻塞直到有读方打开管道;
(4)具体代码:
write端的代码
#include<stdio.h>#include<unistd.h>#include<sys/types.h>#include<fcntl.h>#include<sys/stat.h>#include<string.h>int main(){ int fd=open("./fifo",O_WRONLY) ; if(fd<0) return 2; else { char buff[128]; while(1) { printf("please Enter:"); fflush(stdout); ssize_t s=read(0,buff,sizeof(buff)); if(s>0) buff[s]='\0'; write(fd,buff,strlen(buff)); } close(fd); } return 0;}
read端的代码
#include<stdlib.h>#include<stdio.h>#include<fcntl.h>#include<sys/stat.h>#include<string.h>#include<unistd.h>#include<sys/types.h>int main(){ umask(0); if(mkfifo("./fifo",0666|S_IFIFO)<0)//创建pipe { printf("mkfifo erro\n"); return 1; } else{ int fd=open("./fifo",O_RDONLY); //open pipe sleep(10); if(fd<0) return 2; else { char buff[128]; while(1) { ssize_t s=read(fd,buff,sizeof(buff)-1); if(s==0) { close(fd); exit(0); } if(s>0) { buff[s]='\0'; printf("%s",buff); } } close(fd); } } return 0;}
0 0
- 命名管道(FIFO) Linux进程进程间的通信之命名管道(FIFO)
- 进程间的通信之命名管道(FIFO)
- 进程间通信之命名管道FIFO
- 进程间通信--命名管道(fifo)
- 进程间的通信(二)命名管道fifo
- 进程间通信--管道、命名管道、FIFO
- 进程间通信之命名管道FIFO通信
- 【进程间通信】普通管道和命名管道(FIFO)
- 进程通信之命名管道(FIFO)
- 进程通信之命名管道(FIFO)
- Linux进程间通信之命名管道(FIFO)
- 进程间通信--FIFO命名管道
- 【Linux】进程间通信-命名管道FIFO
- 进程间通信___命名管道(FIFO)
- 【Linux】进程间通信-命名管道FIFO
- 进程间通信(5) - 命名管道(FIFO)
- 【Linux进程间通信】 - 命名管道FIFO
- 进程间通信-命名管道FIFO
- pandas基本命令操作
- 2017智慧树 伟大的红楼梦测试答案题库
- 字符串反转
- HNOI2017-伤感之中充满希望
- LinkedList类的实现
- 进程间的通信之命名管道(FIFO)
- path模块
- 输入三个坐标,判断能否构成三角形,如果能,输出其周长和面积。
- BZOJ3224[Tyvj 1728 普通平衡树]题解--Treap
- 分类游戏
- Ball HDU
- 比特币基于区块链开发的一种技术,这种数值货币本身有什么价值
- 动态的页面包含指令和静态的页面包含指令之间的区别
- ACM刷题之codeforces————Ya Rajaie and Books