算法流程

进程A
用只读的方式打开fifo1
用只写的方式打开fifo2
循环读写。读fifo1,写fifo2
关闭两个管道
进程B
用只写的方式打开fifo1
用只读的方式打开fifo2
循环读写。从标准输入写入内容,写fifo1,读fifo2
关闭两个管道
具体步骤
创建有名管道fifo1,fifo2
wx@wx-virtual-machine:~/work/14th/fifo_talk$ mkfifo fifo1 fifo2
创建聊天进程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);
创建聊天进程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);
Makefile
all:forkA forkB
forkA:forkA.c
gcc $< -o $@
forkB:forkB.c
gcc $< -o $@
.PHONY:clean
clean:
rm -rf forkA forkB
实现对话
