有名管道实现聊天

算法流程
进程A
  1. 用只读的方式打开fifo1

  1. 用只写的方式打开fifo2

  1. 循环读写。读fifo1,写fifo2

  1. 关闭两个管道

进程B
  1. 用只写的方式打开fifo1

  1. 用只读的方式打开fifo2

  1. 循环读写。从标准输入写入内容,写fifo1,读fifo2

  1. 关闭两个管道

具体步骤

  1. 创建有名管道fifo1,fifo2

wx@wx-virtual-machine:~/work/14th/fifo_talk$ mkfifo fifo1 fifo2
  1. 创建聊天进程A

        //1.只读打开fifo1
        fdr = open("fifo1",O_RDONLY);
        if(-1 == fdr)
        {
                perror("open");
                return 1;
        }
        printf("只读方式打开管道1.。。。。\n");

        //2.只写打开fifo2
        fdw = open("fifo2",O_WRONLY);
        if(-1 == fdw)
        {
                perror("open");
                return 1;
        }
        printf("只写方式打开管道2.。。。。\n");

        //3.循环体
        while(1)
        {
                //读管道1
                memset(buf,0,SIZE);
                ret = read(fdr,buf,SIZE);
                if(ret <= 0)
                {
                        perror("read");
                        break;
                }
                printf("read:%s\n",buf);

                //写管道2
                memset(buf,0,SIZE);
                fgets(buf,SIZE,stdin);
                //去掉换行符
                if('\n' == buf[strlen(buf)-1])
                {
                        buf[strlen(buf)-1] = '\0';
                }
                ret = write(fdw,buf,strlen(buf));
                if(ret <= 0)
                {
                        perror("write");
                        break;
                }
                printf("write ret:%d\n",ret);
        }

        //4.关闭
        close(fdr);
        close(fdw);
  1. 创建聊天进程B

        //1.只写打开fifo1
        fdw = open("fifo1",O_WRONLY);
        if(-1 == fdw)
        {   
                perror("open");
                return 1;
        }   
        printf("只写方式打开管道1.。。。。\n");

        //2.只读打开fifo2
        fdr = open("fifo2",O_RDONLY);
        if(-1 == fdr)
        {   
                perror("open");
                return 1;
        }   
        printf("只读方式打开管道2.。。。。\n");

        //3.循环体
        while(1)
        {   
                //写管道1
                memset(buf,0,SIZE);
                fgets(buf,SIZE,stdin);
                //去掉换行符
                if('\n' == buf[strlen(buf)-1])
                {   
                        buf[strlen(buf)-1] = '\0';
                }
                ret = write(fdw,buf,strlen(buf));
                if(ret <= 0)
                {
                        perror("write");
                        break;
                }
                printf("write ret:%d\n",ret);

                //读管道2
                memset(buf,0,SIZE);
                ret = read(fdr,buf,SIZE);
                if(ret <= 0)
                {
                        perror("read");
                        break;
                }
                printf("read:%s\n",buf);
        }

                //4.关闭
                close(fdr);
                close(fdw);
  1. Makefile

all:forkA forkB

forkA:forkA.c
    gcc $< -o $@

forkB:forkB.c
    gcc $< -o $@


.PHONY:clean
clean:
    rm -rf forkA forkB
  1. 实现对话

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值