/****************************
*文件名: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;
}
注意可以用一个程序执行,但是参数要反一下,如上图。其中writefifo和readfifo为要创建的有名管道名称,可以用ls查看