有名管道有文件名,存在于文件系统中。在同一个系统中,数据可以在任意的进程间通信。
写入端代码:
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#define FIFO "/tmp/fifo" //tmp目录下的fifo文件
int main()
{
if(access(FIFO,F_OK))
{
int ret=mkfifo(FIFO,0777);
if(ret == -1)
{
printf("Create FIFO failed!\n");
return -1;
}
}
int fd=open(FIFO,O_RDWR|O_TRUNC); //可读可写,存在数据则清空
if(fd==-1)
{
printf("open failed\n");
return -1;
}
write(fd,"hello c++ codding!",19);
write(fd,"linux",6);
close(fd);
return 0;
}
读端代码:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define MY_FIFO "/tmp/myfifo"
int main()
{
char buffer[30]={0}; //定义缓冲区接收数据
int ret=mkfifo(FIFO,0777);
if(ret==-1)
{
printf("Create FIFO failed\n");
return -1;
}
int fd=open(FIFO,O_RDWR);
if(fd==-1)
{
printf("Open failed!\n");
return -1;
}
int i,j;
int len=lseek(fd,0,SEEK_END); //获取文件字节大小
printf("len is:%d\n".len);
lseek(fd,0,SEEK_SET); //记得把文件指针移回开头,否则待会读到的数据为空
int ret=read(fd,buffer,30);
for(i=0;i<len-1;++i)
{
if(buffer[i]=0)
{
for(j=i;j<len-1;j++) //目的是为了消除数组元素中的\0字符,防止输出不全
{
buffer[j]=buffer[j+1];
}
}
}
printf("\n");
printf("buffer is:%s\n",buffer);
printf("ret is:%d\n",ret);
close(fd);
return 0;
}
输出: