要求实现AB进程对话
A进程先发送一句话给B进程,B进程接收后打印
B进程再回复一句话给A进程,A进程接收后打印
重复上述步骤,当收到quit后,要结束AB进程
//A进程程序:
#include <head.h>
//-----------------A------------------
int main(int argc, const char *argv[])
{
//创建管道文件
//1
if((mkfifo("./_fifo1_",0664))<0)
{
if(errno!=17)
{
perror("mkfifo");
return -1;
}
}
printf("mkfifo success\n");
//2
if((mkfifo("./_fifo2_",0664))<0)
{
if(errno!=17)
{
perror("mkfifo");
return -1;
}
}
printf("mkfifo success\n");
//用读写方式打开管道文件
int fd_r;
int fd_w;
//1
fd_r=open("_fifo1_",O_RDWR);
if(fd_r<0)
{
perror("open");
return -1;
}
printf("open _fifo_ success\n");
//2
fd_w=open("_fifo2_",O_RDWR);
if(fd_w<0)
{
perror("open");
return -1;
}
printf("open _fifo_ success\n");
char talk[128]="";
ssize_t res=0;
//循环发送接收
while(1)
{
//先发送
bzero(talk,sizeof(talk));
printf("A to B says:");
fgets( talk ,sizeof(talk),stdin);
talk[strlen(talk)-1]=0;
res=write(fd_w,talk,sizeof(talk));
if(res<0)
{
perror("write");
return -1;
}
//判断是否写入为quit
if(!(strcmp(talk,"quit")))
{
printf("END\n");
break;
}
printf("talk finished\n");
//发送完接收A
res=read(fd_r,talk,sizeof(talk));
if(res<0)
{
perror("read");
return -1;
}
//判断是否读入为quit
if(!(strcmp(talk,"quit")))
{
printf("END\n");
break;
}
printf("listen finished\n");
fputs(talk,stdout);
printf("\n");
}
return 0;
}
//B进程程序
#include <head.h>
//----------------------B-------------------
int main(int argc, const char *argv[])
{
//创建管道文件
//1
if((mkfifo("./_fifo1_",0664))<0)
{
if(errno!=17)
{
perror("mkfifo");
return -1;
}
}
printf("mkfifo success\n");
//2
if((mkfifo("./_fifo2_",0664))<0)
{
if(errno!=17)
{
perror("mkfifo");
return -1;
}
}
printf("mkfifo success\n");
//用读写方式打开管道文件
int fd_r;
int fd_w;
//1
fd_r=open("_fifo2_",O_RDWR);
if(fd_r<0)
{
perror("open");
return -1;
}
printf("open _fifo_ success\n");
//2
fd_w=open("_fifo1_",O_RDWR);
if(fd_w<0)
{
perror("open");
return -1;
}
printf("open _fifo_ success\n");
ssize_t res=0;
char talk[128]="";
//循环发送接收
while(1)
{
//先接收
res=read(fd_r,talk,sizeof(talk));
if(res<0)
{
perror("read");
return -1;
}
if(!(strcmp(talk,"quit")))
{
printf("END\n");
break;
}
printf("listen finished\n");
fputs(talk,stdout);
printf("\n");
//接收完发送B
bzero(talk,sizeof(talk));
printf("B to A says:");
fgets( talk ,sizeof(talk),stdin);
talk[strlen(talk)-1]=0;
res=write(fd_w,talk,sizeof(talk));
if(res<0)
{
perror("write");
return -1;
}
if(!(strcmp(talk,"quit")))
{
printf("END\n");
break;
}
printf("talk finished\n");
}
return 0;
}
附加题:在第一题的基础上实现,A能随时发信息给B,B能随时接收A发送的数据,反之亦然。
//A与B程序相同
#include <head.h>
typedef struct
{
int fd_r;
int fd_w;
char *str;
}Trans;
void *Athread (void *arg);
void *Bthread (void *arg);
//-----------------A------------------
int main(int argc, const char *argv[])
{
//创建管道文件
//1
if((mkfifo("./_fifo1_",0664))<0)
{
if(errno!=17)
{
perror("mkfifo");
return -1;
}
}
printf("mkfifo success\n");
//2
if((mkfifo("./_fifo2_",0664))<0)
{
if(errno!=17)
{
perror("mkfifo");
return -1;
}
}
printf("mkfifo success\n");
//用读写方式打开管道文件
int fd_r;
int fd_w;
//1
fd_r=open("_fifo1_",O_RDWR);
if(fd_r<0)
{
perror("open");
return -1;
}
printf("open _fifo_ success\n");
//2
fd_w=open("_fifo2_",O_RDWR);
if(fd_w<0)
{
perror("open");
return -1;
}
printf("open _fifo_ success\n");
//准备线程数据
char talk[128]="";
Trans Tothread={fd_r,fd_w,talk};
//创建线程A用于发送信号
pthread_t Atid,Btid;
if((pthread_create(&Atid,NULL,Athread,&Tothread))!=0)
{
printf("pthread A create failed\n");
return -1;
}
printf("pthread A created\n");
//创建线程B用于接收信号
if((pthread_create(&Btid,NULL,Bthread,&Tothread))!=0)
{
printf("pthread B create failed\n");
return -1;
}
printf("pthread B created\n");
//等待线程退出
while(1)
{
if(!(strcmp(talk,"quit")))
{
pthread_cancel(Atid);
pthread_cancel(Btid);
break;
}
}
pthread_join(Atid,NULL);
pthread_join(Btid,NULL);
return 0;
}
void *Athread (void *arg)
{
//接收线程数据
int fd_r=((Trans *)arg)->fd_r;
int fd_w=((Trans *)arg)->fd_w;
char *talk=((Trans *)arg)->str;
ssize_t res=0;
//循环发送接收
while(1)
{
//先发送
bzero(talk,sizeof(talk));
printf("A to B says:");
fgets( talk ,sizeof(talk),stdin);
talk[strlen(talk)-1]=0;
res=write(fd_w,talk,sizeof(talk));
if(res<0)
{
perror("write");
return NULL;
}
//判断是否写入为quit
if(!(strcmp(talk,"quit")))
{
printf("END\n");
break;
}
printf("talk finished\n");
}
}
void *Bthread (void *arg)
{
//接收线程数据
int fd_r=((Trans *)arg)->fd_r;
int fd_w=((Trans *)arg)->fd_w;
char *talk=((Trans *)arg)->str;
ssize_t res=0;
while(1)
{
res=read(fd_r,talk,sizeof(talk));
if(res<0)
{
perror("read");
return NULL;
}
//判断是否读入为quit
if(!(strcmp(talk,"quit")))
{
printf("END\n");
break;
}
printf("listen finished\n");
fputs(talk,stdout);
printf("\n");
}
}