create.c
#include <myhead.h>
int main(int argc, const char *argv[])
{
//创建有名管道
if(mkfifo("myfifo1", 0777)){
perror("");
return -1;
}
if(mkfifo("myfifo2", 0777)){
perror("");
return -1;
}
//阻塞等待其他进程使用管道
getchar();
//销毁管道
system("rm myfifo1 myfifo2");
return 0;
}
user1.c
#include <myhead.h>
int main(int argc, const char *argv[])
{
//打开管道
int fd1,fd2;
if((fd1=open("myfifo1", O_WRONLY))==-1){//以只写的方式打开
perror("");
return -1;
}
if((fd2=open("myfifo2", O_RDONLY))==-1){//以只读的方式打开
perror("");
return -1;
}
char buf[128]="";
//创建子进程
pid_t pid=fork();
if(pid<0){
perror("");
return -1;
}else if(pid==0){//执行读取操作
while(1){
//从管道二读取
//清空数组
memset(buf,0,sizeof(buf));
//从管道读取
read(fd2,buf,sizeof(buf));
//判断对方是否关闭会话
if(strcmp(buf,"quit")==0){
printf("对方已关闭会话\n");
break;
}else{
//向终端输出
printf("%s\n",buf);
}
}
close(fd2);
}else{//执行写入操作
while(1){
//写入管道一
//从终端读取
fgets(buf,sizeof(buf),stdin);
//清除结尾的'\n'
buf[strlen(buf)-1]='\0';
//写入管道
write(fd1,buf,strlen(buf));
//判断是否关闭会话
if(strcmp(buf,"quit")==0){
printf("关闭会话\n");
break;
}
}
close(fd1);
}
return 0;
}
user2.c
#include <myhead.h>
int main(int argc, const char *argv[])
{
//打开管道
int fd1,fd2;
if((fd1=open("myfifo1", O_RDONLY))==-1){//以只读的方式打开
perror("");
return -1;
}
if((fd2=open("myfifo2", O_WRONLY))==-1){//以只写的方式打开
perror("");
return -1;
}
char buf[128]="";
//创建子进程
pid_t pid=fork();
if(pid<0){
perror("");
return -1;
}else if(pid==0){//执行读取操作
while(1){
//从管道一读取
//清空数组
memset(buf,0,sizeof(buf));
//从管道读取
read(fd1,buf,sizeof(buf));
//判断对方是否关闭会话
if(strcmp(buf,"quit")==0){
printf("对方已关闭会话\n");
break;
}else{
//向终端输出
printf("%s\n",buf);
}
}
close(fd1);
}else{//执行写入操作
while(1){
//写入管道二
//从终端读取
fgets(buf,sizeof(buf),stdin);
//清除结尾的'\n'
buf[strlen(buf)-1]='\0';
//写入管道
write(fd2,buf,strlen(buf));
//判断是否关闭会话
if(strcmp(buf,"quit")==0){
printf("关闭会话\n");
break;
}
}
close(fd2);
}
return 0;
}