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
原创粉丝点击