要求实现AB进程对话
A进程先发送一句话给子进程,B进程接收后打印
B进程再回复一句话给父进程,A进程接收后打印
重复1.2步骤,当收到quit后,要结束AB进程
在上述练习的前提下,实现AB进程能够随时收发数据。
提示:用多进程或者多线程实现
代码:
read代码:
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<errno.h>
#include<string.h>
int main(int argc, const char *argv[])
{
//清空umask
umask(0);
//创建fifo文件
if(mkfifo("./myfifoi_w",0664)<0)
{
//文件已经存在导致的错误是允许存在的,不需要退出进程
//所以需要将文件已经存在的错误单独提出出来,不作处理
printf("errno=%d\n",errno);
if(errno!=EEXIST) //EEXUST==17
{
perror("mkfifo");
return -1;
}
}
printf("create FIFO_w success\n");
//创建第二个fifo文件
if(mkfifo("./myfifo_r",0664)<0)
{
printf("errno=%d\n",errno);
if(errno!=EEXIST) //EEXUST==17
{
perror("mkfifo");
return -1;
}
}
printf("create FIFO_r success\n");
//以只读方式打开有名管道文件
int fd_r=open("./myfifo",O_RDONLY);
if(fd_r<0)
{
perror("open");
return -1;
}
printf("open FIFO_r success\n");
//打开有名管道文件
int fd_w=open("myfifo",O_WRONLY);
if(fd_w<0)
{
perror("open");
return -1;
}
printf("open FIFO_w SUCCUSS\n");
//创建数组
char buf[128]="";
//创建变量接读写返回值
ssize_t res=0;
//创建一个进程
pid_t pid=fork();
//父进程
if(pid>0)
{
//从管道中写数据
while(1)
{
bzero(buf,sizeof(buf));
printf("wr写:");
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1]='\0';
res=write(fd_w,buf,sizeof(buf));
if(res<0)
{
perror("write");
return -1;
}
if(strcmp(buf,"quit")==0)
{
break;
}
printf("父进程发送数据成功\n");
}
}
//子进程
else if(pid ==0)
{
while(1)
{
//从管道读取数据
sleep(1);
bzero(buf,sizeof(buf));
res=read(fd_r,buf,sizeof(buf));
if(res<0)
{
perror("read");
return -1;
}
else if (0==res)
{
fprintf(stderr,"对方进程已经退出\n");
}
printf("rd说:%s\n",buf);
if(strcmp(buf,"quit")==0)
{
break;
}
printf("父进程读取数据%s\n",buf);
}
}
else if(pid<0)
{
perror("fork");
return -1;
}
close(fd_r);
close(fd_w);
return 0;
}
write代码:
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<errno.h>
#include<string.h>
int main(int argc, const char *argv[])
{
//清空umask
umask(0);
//创建fifo文件
if(mkfifo("./myfifo1",0664)<0)
{
//文件已经存在导致的错误是允许存在的,不需要退出进程
//所以需要将文件已经存在的错误单独提出出来,不作处理
printf("errno=%d\n",errno);
if(errno!=EEXIST) //EEXUST==17
{
perror("mkfifo");
return -1;
}
}
printf("create FIFO_w success\n");
//创建管道文件
if(mkfifo("myfifo_r",0664)<0)
{
printf("errno=%d\n",errno);
if(errno!=EEXIST)
{
perror("mkfifo");
return -1;
}
}
printf("create FIFO_r success\n");
//打开用于读取数据的有名管道文件
int fd_r=open("myfifo",O_WRONLY);
if(fd_r<0)
{
perror("open");
return -1;
}
printf("open FIFO_r success\n");
//打开用于写入数据的有名管到文件
int fd_w=open("myfifo",O_RDONLY);
if(fd_w<0)
{
perror("open");
return -1;
}
printf("open FIFO_w success\n");
//创建数组
char buf[128]="";
//创建变量直接读写返回值
ssize_t res=0;
//创建一个进程
pid_t pid=fork();
//父进程
if(pid>0)
{
//读取
while(1)
{
sleep(1);
bzero(buf,sizeof(buf));
res=read(fd_w,buf,sizeof (buf));
if(res<0)
{
perror("read");
return -1;
}
else if(0==res) //写段关闭
{
fprintf(stderr,"对方进程退出\n");
break;
}
printf("wr说:%s\n",buf);
if(strcmp(buf,"quit")==0)
{
break;
}
printf("儿子接收到%s\n",buf);
}
}
else if(pid==0)
{
while(1)
{
//写入
bzero(buf,sizeof(buf));
printf("rd写:");
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1]='\0';
res=write(fd_r,buf,sizeof(buf));
if(res<0)
{
perror("write");
return -1;
}
if(strcmp(buf,"quit")==0)
{
break;
}
printf("儿子成功发送数据\n");
}
}
else if(pid<0)
{
perror("fork");
return -1;
}
close(fd_w);
close(fd_r);
return 0;
}
效果: