FIFO常被称为命名管道,以区分pipe,pipe只能用于“有血缘关系”的进程间通信。但通过FIFO,不相关的进程也能交换数据。
FIFO是linux基础文件类型中的一种(文件类型为p,可通过ls -l查看文件类型),但FIFO文件在磁盘上没有数据块,文件大小为0,仅仅用来标识内核中一条通道。进程可以打开这个文件进行read/write,实际上是在读写内核缓冲区,这样就实现了进程间通信。
创建FIFO管道
进程间通信流程
- 进程A
- 创建一个fifo文件,使用mkfifo命令或者函数
- 使用 open fifo文件,获得一个文件描述符fd
- 写fifo文件--------write(fd,"xxx",...)
- 关闭fifo文件 ----close(fd);
- 进程B
- 打开fifo文件,获得文件描述符fd
- 读fifo文件---read(fd,buf,sizeof(buf));
- 关闭fifo文件----close(fd)
1 //fifo完成两个进程间通信的测试 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<unistd.h> 6 #include<sys/stat.h> 7 #include<fcntl.h> 8 #include<sys/types.h> 9 10 int main() 11 { 12 //创建fifo文件 13 int ret = mkfifo("./myfifo",0777); 14 if(ret<0) 15 { 16 perror("mkfifo error"); 17 return -1; 18 } 19 20 //打开文件 21 int fd = open("./myfifo",O_RDWR); 22 if(fd<0){ 23 perror("open error"); 24 return -1; 25 } 26 27 //写fifo文件 28 write(fd,"hello world",strlen("hello world")); 29 30 //关闭文件 31 //close(fd); 32 33 // getchar(); 34 35 return 0; 36 37 38 } ~
1 //fifo完成两个进程间通信的测试 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<unistd.h> 6 #include<sys/stat.h> 7 #include<fcntl.h> 8 #include<sys/types.h> 9 10 int main() 11 { 12 //创建fifo文件 13 #if 0 14 int ret = mkfifo("./myfifo",0777); 15 if(ret<0) 16 { 17 perror("mkfifo error"); 18 return -1; 19 } 20 #endif 21 //打开文件 22 int fd = open("./myfifo",O_RDWR); 23 if(fd<0){ 24 perror("open error"); 25 return -1; 26 } 27 28 char buf[64]; 29 memset(buf,0x00,sizeof(buf)); 30 //写fifo文件 31 int n=read(fd,buf,sizeof(buf)); 32 printf("n==[%d],buf==[%s]",n,buf); 33 //关闭文件 34 close(fd); 35 36 37 return 0; 38 39 40 }