实现两个进程的数据传递
注意:管道文件第一次执行mkfifo() 函数被创建之后,再次执行该程序,将会导致mkfifo() 函数运行失败,因为管道文件已经存在了,再次创建没有任何意义。程序运行收到内核发送的错误码EEXIST表示文件已存在。所以在判断错误时,添加对错误码的判断。
另外,有名管道的创建只能在纯unix路径下创建
demonA负责发送数据
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<errno.h>
#include<string.h>
#define N 128
int main(int argc,const char *argv[])
{
int fd; //定义文件描述符
char buf[N] = "";
if(mkfifo("/home/qf/fifo1",0664) < 0) //创建一个有名管道fifo并设置属性
{
/* 重复创建会返回错误码EEXIST */
if(errno == EEXIST)
{
fd = open("/home/qf/fifo1",O_RDWR);
printf("fd = %d\n",fd);
}
else
{
perror("mkfifo error");
}
}
else
{
fd = open("/home/qf/fifo1",O_RDWR);//以可读写的方式打开管道文件fifo1
printf("fd = %d\n",fd); //输出文件描述符的值
}
while(1)
{
fgets(buf,N,stdin); //从终端获取数据
buf[strlen(buf)-1]='\0';
write(fd,buf,strlen(buf));//将终端的数据写入管道fifo1
/* 如果终端输入为quit退出输入 */
if(strncmp(buf,"quit",4) == 0)
{
break;
}
}
return 0;
}
demonB负责接收数据
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<errno.h>
#include<string.h>
#define N 128
int main(int argc,const char *argv[])
{
int fd;
char buf[N] = "";
if(mkfifo("/home/qf/fifo1",0664) < 0)
{
if(errno == EEXIST)
{
fd = open("/home/qf/fifo1",O_RDWR);
printf("fd = %d\n",fd);
}
else
{
perror("mkfifo error");
}
}
else
{
fd = open("/home/qf/fifo1",O_RDWR);
printf("fd = %d\n",fd);
}
while(1)
{
read(fd,buf,N); //读取管道fifo1
if(strncmp(buf,"quit",4) == 0)
{ /* 如果读取到quit则退出循环并删除管道文件fifo1 */
system("rm /home/qf/fifo1");
break;
}
printf("demonA:%s\n",buf); //打印出demonA中向管道写入的内容
}
return 0;
}
分别运行demonA与demonB,终端输入数据,则可以读取数据。输入quit进程退出,并删除管道,demonA运行结果如下(hello、world、quit为终端手动输入)。
demonB运行结果如下: