使用有名管道实现两个进程之间相互通信。
有名管道的创建1
#include <head.h>
int main(int argc, const char *argv[])
{//创建有名管道
if(mkfifo("./myfifo",0664)!=0)
{
perror("mkfifo error");
return -1;
}
getchar();//阻塞程序
system("rm myfifo");
return 0;
}
有名管道的创建2
#include <head.h>
int main(int argc, const char *argv[])
{//创建有名管道
if(mkfifo("./myfifo2",0664)!=0)
{
perror("mkfifo2 error");
return -1;
}
getchar();//阻塞程序
system("rm myfifo2");
return 0;
}
进程一
#include<head.h>
int main(int argc, const char *argv[])
{
//创建一个子进程
pid_t cpid=fork();
if(cpid>0)//父进程
{
//打开管道文件
int rfd;
if((rfd=open("./myfifo",O_RDONLY))==-1)
{
perror("open error");
return -1;
}
//向循环文件中写入数据
char buf[128]="";
while(1)
{
bzero(buf,sizeof(buf));
read(rfd,buf,sizeof(buf));
//如果输入的是quit,则退出程序
if(strcmp(buf,"quit")==0)
{
printf("写进程序已经退出,读进程也要退出了\n");
break;
}
printf("读取的数据:%s\n",buf);
}
//关闭文件
close(rfd);
}
else if(cpid==0)//子进程
{
//打开管道文件
int wfd;
if((wfd=open("./myfifo2",O_WRONLY))==-1)
{
perror("open error");
return -1;
}
//向循环文件中写入数据
char buf[128]="";
while(1)
{
bzero(buf,sizeof(buf));
printf("请输入>>");
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1]=0;
write(wfd,buf,sizeof(buf));
//如果输入的是quit,则退出程序
if(strcmp(buf,"quit")==0)
{
printf("写进程序退出\n");
break;
}
}
//关闭文件
close(wfd);
}
else if(cpid<0)
{
perror("fork");
return -1;
}
return 0;
}
进程二
#include<head.h>
int main(int argc, const char *argv[])
{
//创建一个子进程
pid_t cpid=fork();
if(cpid>0)
//打开管道文件
{int wfd;
if((wfd=open("./myfifo",O_WRONLY))==-1)
{
perror("open error");
return -1;
}
//向循环文件中写入数据
char buf[128]="";
while(1)
{
bzero(buf,sizeof(buf));
printf("请输入>>");
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1]=0;
write(wfd,buf,sizeof(buf));
//如果输入的是quit,则退出程序
if(strcmp(buf,"quit")==0)
{
printf("写进程序退出\n");
break;
}
}
//关闭文件
close(wfd);
}
else if(cpid==0)//子进程
{
//打开管道文件
int rfd;
if((rfd=open("./myfifo2",O_RDONLY))==-1)
{
perror("open error");
return -1;
}
//向循环文件中写入数据
char buf[128]="";
while(1)
{
bzero(buf,sizeof(buf));
read(rfd,buf,sizeof(buf));
//如果输入的是quit,则退出程序
if(strcmp(buf,"quit")==0)
{
printf("写进程序已经退出,读进程也要退出了\n");
break;
}
printf("读取的数据:%s\n",buf);
}
//关闭文件
close(rfd);
}
else if(cpid<0)
{
perror("fork");
return -1;
}
return 0;
}