使用管道实现两个进程之间的通信

今天学到管道的使用,感觉挺简单的,自己实际写了下,深陷逻辑中不能自拔。
现有进程a和进程b,管道单向传输数据,两个进程链接两个管道实现初级同步。
一个进程打开管道的读,另一个进程就打开管道的写。
进程a:

int fdr=open("1",O_RDONLY);
    if(-1 == fdr)
    {
        perror("open dr");
        return -1;
    }
    int fdw=open("2",O_WRONLY);
    if(-1 == fdw)
    {
        perror("open dw");
        return -1;
    }

进程b:

int fdw=open("1",O_WRONLY);
    if(-1 == fdw)
    {
        perror("open dw");
            return -1;
    }
    int fdr=open("2",O_RDONLY);
    if(-1 == fdr)
        {
            perror("open dr");
            return -1;
        }

注意进程中打开管道的顺序必须是成对的,即是对于同一个管道,a进程是写
操作,b进程在和a同样的执行顺序下执行读操作。不然就会循环等待,接受不
到对方的信息。
为了实现双方的实时通信,需要使用 I/O多路转接模型,使用select函数,使用的头文件
sys/types.h sys/time.h unistd.h
函数的原型是 int select(int nfds,fd_set *readfds,fd_set *writefds,fd_set *exceptfds
,struct timeval *timeout)
进程a:

fd_set set;
    while(1)
    {
        FD_ZERO(&set);
        FD_SET(fdr,&set);
        FD_SET(0,&set);
       memset(buff,0,sizeof(buff));
        int ret=select(fdr+1,&set,NULL,NULL,NULL);
        if(FD_ISSET(fdr,&set))
        {
            read(fdr,buff,sizeof(buff));
            puts(buff);
        }

        if(FD_ISSET(0,&set))
        {
            read(0,buff,sizeof(buff));
        //  scanf("%s",buff);
            write(fdw,buff,strlen(buff)-1);
        }
    }
    close(fdr);
    close(fdw);

进程b:

fd_set set;
    while(1)
    {
        FD_ZERO(&set);
        FD_SET(fdr,&set);
        FD_SET(0,&set);
        memset(buff,0,sizeof(buff));
        int ret=select(fdr+1,&set,NULL,NULL,NULL);
        if(FD_ISSET(0,&set))
        {
            read(0,buff,sizeof(buff));
        //  scanf("%s",buff);
            write(fdw,buff,strlen(buff)-1);
        }
        if(FD_ISSET(fdr,&set))
        {
            read(fdr,buff,sizeof(buff));
            puts(buff);
        }
    }
    close(fdr);
    close(fdw);

**此处小心**fd_set是文件控制符的集合,需要自己创建。最后在这个实例中,实现进程的通信,
需要监听writre,即时标准输入stdin(STDIN_FILENO)。

本人知识有限,不足之处还请指出。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值