Linux Pipe (进程间通信,生产者消费者)

PIPE是Linux下可以用来实现进程间通信的一种手段,当我们调用pipe系统调用时,将会产生一对文件描述符,fd[0]可以用来读,fd[1]用来写,fd[1]写的数据将会在fd[0]中读到,我们称之为管道。进程之间可以依赖管道的方式实现进程间通信,pipe是半双工的,所以如果要实现pipe之间互相通信的话,需要建立2对pipe。下面我们演示用pipe实现父进程生产数字,子进程消费数字并排序的一个程序。

#include <iostream>
#include <unistd.h>
#include <vector>
#include <algorithm>
#include <sys/types.h>
#include <sys/wait.h>

#define END_FLAG (1 << (sizeof(int)*8 - 1))

using namespace std;

enum PIPE_FD_TYPE {
    PIPE_READ = 0,
    PIPE_WRITE
};

int main() {
    int pipe_fd[2] = {-1, -1};
    if(pipe(pipe_fd) != 0) {
        exit(0);
    }
    int pid = -1;
    if((pid = fork()) == -1) {
        exit(0);
    }

    //child
    if(pid == 0) {
        cout<<"child start\n";
        int data = -1;
        vector<int> v;
        while(read(pipe_fd[PIPE_READ], &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<<"child end\n";
    }

    //parent
    if(pid != 0) {
        cout<<"parent 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(pipe_fd[PIPE_WRITE], &v[i], sizeof(v[i]));
        }
        int end = END_FLAG;
        write(pipe_fd[PIPE_WRITE], &end, sizeof(end));
        int status = -1;
        waitpid(-1, &status, 0);//等待子进程结束
        cout<<"paranet end\n";
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值