A中的内容
**************************************************************************************************************
#include
#include
#include
#include
#include
#include
#include
#include
#include
//创建全局变量作为管道
int fd_chd=0;
int fd_far=0;
void * strat_tid(void *arg)
{
char brr[64]="";//用于管道2
ssize_t res=0;
//分支线程用于打印
while(1)
{
//执行读取有名管道2中的内容
memset(brr,0,sizeof(brr));
res = read(fd_chd,brr,sizeof(brr));
if(res<0)
{
perror("read");
return NULL;
}
if(strcmp(brr,"quit")==0)
{
close(fd_far);
close(fd_chd);
exit(0);
}
printf("父进程读取长度为 %ld读取到的内容%s\n",strlen(brr),brr);
}
}
int main(int argc, const char *argv[])
{
//创建有名管道
if(mkfifo("./far_talk",0777)<0)
{
if(errno!=17)
{
perror("mkfifo");
return -1;
}
}
//创建有名管道
if(mkfifo("./chd_talk",0777)<0)
{
if(errno!=17)
{
perror("mkfifo");
return -1;
}
}
//打开管道1,以写方式打开,阻塞等待读执行
fd_far=open("./far_talk",O_WRONLY);
if(fd_far<0)
{
perror("open");
return -1;
}
//打开管道2,以读方式打开,阻塞等待写执行
fd_chd=open("./chd_talk",O_RDONLY);
if(fd_chd<0)
{
perror("open");
return -1;
}
printf("打开管道完成\n");
//创建线程
pthread_t tid;
if(pthread_create(&tid,NULL,strat_tid,NULL)!=0)
{
perror("pthread_create");
return -1;
}
//分离线程
pthread_detach(tid);
ssize_t wrs=0;
char arr[64]="";//用于管道1
//管道要循环执行的内容
while(1)
{
//先向有名管道中写入
printf("A中请输入-->");
if(fgets(arr,sizeof(arr),stdin)<0) //从终端获取
{
perror("fgets");
return -1;
}
arr[strlen(arr)-1]='\0';
//将获取的内容写入管道1的写中
wrs =write(fd_far,arr,strlen(arr));
if(wrs < 0)
{
perror("write");
return -1;
}
if(strcmp(arr,"quit")==0)//结束条件
{
break;
}
printf("写入的大小 %ld,写入了什么 %s\n",strlen(arr),arr);
}
pthread_cancel(tid);
pthread_join(tid,NULL);
close(fd_far);
close(fd_chd);
return 0;
}
**************************************************************************************************************
B中的内容
**************************************************************************************************************
#include
#include
#include
#include
#include
#include
#include
#include
#include
//创建全局变量作为管道
int fd_chd=0;
int fd_far=0;
void * strat_tid(void *arg)
{
char brr[64]="";//用于管道2
ssize_t res=0;
//分支线程用于打印
while(1)
{
//执行读取有名管道fd_far中的内容
memset(brr,0,sizeof(brr));
res = read(fd_far,brr,sizeof(brr));
if(res<0)
{
perror("read");
return NULL;
}
printf("父进程读取长度为 %ld读取到的内容%s\n",strlen(brr),brr);
if(strcmp(brr,"quit")==0)
{
close(fd_far);
close(fd_chd);
exit(0);
}
}
}
int main(int argc, const char *argv[])
{
//创建有名管道
if(mkfifo("./far_talk",0777)<0)
{
if(errno!=17)
{
perror("mkfifo");
return -1;
}
}
//创建有名管道
if(mkfifo("./chd_talk",0777)<0)
{
if(errno!=17)
{
perror("mkfifo");
return -1;
}
}
//打开管道1,以读方式打开,
fd_far=open("./far_talk",O_RDONLY);
if(fd_far<0)
{
perror("open");
return -1;
}
//打开管道2,以写方式打开,
fd_chd=open("./chd_talk",O_WRONLY);
if(fd_chd<0)
{
perror("open");
return -1;
}
printf("d打开管道完成\n");
//创建线程,分支线程中用来读管道fd_far的内容,主线程用来写到管道fd_chd里
pthread_t tid;
if(pthread_create(&tid,NULL,strat_tid,NULL)!=0)
{
perror("pthread_create");
return -1;
}
//分离线程
pthread_detach(tid);
ssize_t wrs=0;
char arr[64]="";//用于管道1
//管道要循环执行的内容
while(1)
{
//先向有名管道中写入
printf("b中请输入-->");
if(fgets(arr,sizeof(arr),stdin)<0) //从终端获取
{
perror("fgets");
return -1;
}
arr[strlen(arr)-1]='\0';
//将获取的内容写入管道fd_chd的写中
wrs =write(fd_chd,arr,strlen(arr));
if(wrs < 0)
{
perror("write");
return -1;
}
if(strcmp(arr,"quit")==0)//结束条件
{
return 0;
}
printf("写入的大小 %ld,写入了什么 %s\n",strlen(arr),arr);
}
pthread_cancel(tid);
pthread_join(tid,NULL);
close(fd_far);
close(fd_chd);
return 0;
}