Linux FIFO (进程间通信,生产者消费者)
来源:互联网 发布:mac的windows支持软件 编辑:程序博客网 时间:2024/06/08 18:24
上一篇中我们写到了PIPE无名管道,的确是一种很方便的通信机制,但是其有一个缺点就是,PIPE是依赖于文件描述符的,并不在文件系统中维护,如果两个通信进程之间没有共同的祖先,他们就无法拿到相同的文件表项,所以没有共同祖先的两个进程是不能通过PIPE直接通信的。为此Linux提供一种称为有名管道称为FIFO来解决,FIFO是一种全双工的管道,先进先出,并且在磁盘有索引节点,这样只要进程知道FIFO文件的路径,就可以借助FIFO通信了,FIFO和PIPE的底层实现几乎是一样的。下面我们演示一下PIPE中的程序换成两个独立运行的进程用FIFO来实现生产者消费者:
#include <iostream>#include <unistd.h>#include <vector>#include <algorithm>#include <sys/types.h>#include <sys/wait.h>#include <fcntl.h>#define END_FLAG (1 << (sizeof(int)*8 - 1))using namespace std;#define FIFO_NAME "sort_fifo"int main() { int fd = open(FIFO_NAME, O_RDWR); if(fd < 0) { return -1; }#ifdef COSUMER cout<<"cosumer start\n"; int data = -1; vector<int> v; while(read(fd, &data, sizeof(data)) > 0) { if(data == END_FLAG) { break; } v.push_back(data); } cout<<"size : "<<v.size()<<endl; sort(v.begin(), v.end()); for(auto i : v) { cout<<i<<" "; } cout<<endl; cout<<"cosumer end\n";#endif#ifdef PRODUCTOR cout<<"productor start\n"; int v[] = {134, 123, 1111, -1, 0, 888, 7564, 976, 9876, 66, 99, 123, 189}; for(int i = 0; i < sizeof(v)/sizeof(v[0]); i++) { write(fd, &v[i], sizeof(v[i])); } int end = END_FLAG; write(fd, &end, sizeof(end)); cout<<"productor end\n";#endif return 0;}
g++ -std=c++11 -o cosumer fifo_productor_cosumer.cpp -DCOSUMERg++ -std=c++11 -o productor fifo_productor_cosumer.cpp -DPRODUCTORmkfifo sort_fifo
分别在两个终端运行cosumer和productor就会看见结果,cosumer输出如下:
$ ./cosumercosumer startsize : 13-1 0 66 99 123 123 134 189 888 976 1111 7564 9876cosumer end
阅读全文
0 0
- Linux FIFO (进程间通信,生产者消费者)
- Linux Pipe (进程间通信,生产者消费者)
- Linux进程间的通信,信号量的使用,生产者消费者
- Linux进程间的通信,信号量的使用,生产者消费者
- Linux进程间通信与生产者消费者问题
- Linux进程间通信(二)FIFO
- linux 进程间通信 FIFO
- Linux进程通信 FIFO
- 命名管道(FIFO) Linux进程进程间的通信之命名管道(FIFO)
- Linux下进程间通信机制:FIFO(命名管道)
- Linux环境进程间通信(一)管道和FIFO
- Linux进程间通信IPC(二)-- FIFO
- Linux下进程间通信机制:FIFO(命名管道)
- Linux环境进程间通信(一)管道和FIFO
- UNIX/Linux进程间通信IPC系列(三)FIFO
- linux进程间通信之管道(pipe与fifo)
- Linux--进程间通信(管道及有名管道FIFO)
- 深入理解Linux进程间通信(IPC)-- FIFO
- Android实现圆角边框
- 测试前沿技术
- [js高手之路]深入浅出webpack教程系列9-打包图片(file-loader)用法
- Ubuntu 安装低版本Linux内核屏幕分辨率设置问题
- c:forEache标签 List Map 遍历输出
- Linux FIFO (进程间通信,生产者消费者)
- 好的博客学习的地址【持续更新中】
- javascript函数
- UVa 202 循环小数节
- 计蒜客 Banana
- 02 Hibernate的几个类
- HDU 6201 transaction transaction transaction(SPFA算法求最长路径)
- 实现DotA的技能冷却效果
- Spring Boot入门之 HelloWorld