linux脚本实现多重管道,C、Linux两个有名管道实现双工通信

/****************************

*文件名:myfifo_duplex.c

*作者:翟晓树

*时间:20.6.18

*环境:linux,gcc

*编写思路:创建两个有名管道和两个进程,进程1往管道1中写数据、从管道2中读数据,进程2反之

*涉及函数:mkfifo, fork, read, open

*****************************/

#include

#include

#include

#include

#include

#include

#define N 64

int main(int argc, const char * argv[])

{

char buf[N];

int ret; //用来接收函数的返回值

int fd1, fd2; //文件描述符

ret = access(argv[1],F_OK); //判断管道1是否已存在

if(ret < 0)

{

ret = mkfifo(argv[1],0664); //不存在则创建有名管道1,设置权限0644

if(ret < 0)

{

perror("open");

exit(-1); //创建失败则退出程序

}

}

ret = access(argv[2],F_OK); //判断管道2是否已存在

if(ret < 0)

{

ret = mkfifo(argv[2],0664); //不存在则创建,有名管道2,设置权限为0644

if(ret < 0)

{

perror("open");

exit(-1);

}

}

//打开两个管道

fd1 = open(argv[1],O_RDWR);

fd2 = open(argv[2],O_RDWR);

//判断是否成功打开

if(fd1 < 0)

{

perror("open");

exit(-1);

}

printf("fd1=%d\n",fd1); //打印文件描述符1

if(fd2 < 0)

{

perror("open");

exit(-1);

}

printf("fd2=%d\n",fd2); //打印文件描述符2

ret = fork(); //创建一个进程

if(pid < 0)

{

perror("pid");

exit(-1);

}

else if(ret == 0) //子进程从管道2读,往管道1写

{

while( 1 )

{

ret = read(fd2, buf, N); //读管道2内容写到buf中

if(ret < 0)

{

perror("read");

exit(-1);

}

printf("%s", buf); //打印内容

}

}

else //父进程往管道1写,从管道2读

{

while( 1 )

{

printf(">>");

fgets(buf, N, stdin); //获取(标准输入)屏幕输入到buf中

ret = write(fd1, buf, N); //buf内容写入管道1

if(ret < 0)

{

perror("write");

exit(-1);

}

}

}

close(fd1); //关闭管道

close(fd2); //关闭管道

return 0;

}

c82aef9e6618979683dcd91c660f37d3.png

788ce000cb7b1167526f1fb47f0ed675.png

注意可以用一个程序执行,但是参数要反一下,如上图。其中writefifo和readfifo为要创建的有名管道名称,可以用ls查看

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值