第一题
题目
使用有名管道实现两个进程之间相互通信,提示:可以使用多线程或多进程实现
执行效果
进程1
#include<head.h>
char str[100]="";
char str1[100]="";
void* fun1(void* arg)
{
int fd_w=open("./myfifo1",O_WRONLY);
if(fd_w<0)
{
ERR_MSG("open");
return NULL;
}
while(1)
{
bzero(str,sizeof(str));
fgets(str,sizeof(str),stdin);
str[strlen(str)-1]=0;
write(fd_w,str,sizeof(str));
if(strcmp(str,"quit")==0)
exit(0);
}
close(fd_w);
pthread_exit(NULL);
}
void* fun2(void* arg)
{
int fd_r=open("./myfifo2",O_RDONLY);
if(fd_r<0)
{
ERR_MSG("open");
return NULL;
}
while(1)
{
bzero(str1,sizeof(str));
read(fd_r,str1,sizeof(str1));
if(strcmp(str1,"quit")==0)
exit(0);
puts(str1);
}
close(fd_r);
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
if(mkfifo("./myfifo1",0664)<0)
{
if(errno!=17)
{
ERR_MSG("mkfifo");
return -1;
}
}
if(mkfifo("./myfifo2",0664)<0)
{
if(errno!=17)
{
ERR_MSG("mkfifo");
return -1;
}
}
umask(0);
pthread_t tid1,tid2;
if(pthread_create(&tid1,NULL,fun1,NULL)!=0)
{
printf("pthread_create fail\n");
return -1;
}
if(pthread_create(&tid2,NULL,fun2,NULL)!=0)
{
printf("pthread_create fail\n");
return -1;
}
pthread_detach(tid2);
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
return 0;
}
进程2
#include<head.h>
char str[100]="";
char str1[100]="";
void* fun1(void* arg)
{
int fd_w=open("./myfifo2",O_WRONLY);
if(fd_w<0)
{
ERR_MSG("open");
return NULL;
}
while(1)
{
bzero(str,sizeof(str));
fgets(str,sizeof(str),stdin);
str[strlen(str)-1]=0;
write(fd_w,str,sizeof(str));
if(strcmp(str,"quit")==0)
exit(0);
}
close(fd_w);
pthread_exit(NULL);
}
void* fun2(void* arg)
{
int fd_r=open("./myfifo1",O_RDONLY);
if(fd_r<0)
{
ERR_MSG("open");
return NULL;
}
while(1)
{
bzero(str1,sizeof(str));
read(fd_r,str1,sizeof(str1));
if(strcmp(str1,"quit")==0)
exit(0);
puts(str1);
}
close(fd_r);
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
if(mkfifo("./myfifo1",0664)<0)
{
if(errno!=17)
{
ERR_MSG("mkfifo");
return -1;
}
}
if(mkfifo("./myfifo2",0664)<0)
{
if(errno!=17)
{
ERR_MSG("mkfifo");
return -1;
}
}
umask(0);
pthread_t tid1,tid2;
if(pthread_create(&tid1,NULL,fun1,NULL)!=0)
{
printf("pthread_create fail\n");
return -1;
}
if(pthread_create(&tid2,NULL,fun2,NULL)!=0)
{
printf("pthread_create fail\n");
return -1;
}
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
return 0;
}