1.基本概念
FIFO被称为命名管道。未命名的管道只能在两个相关进程间使用。
但是,通过FIFO,不相关的进程也能交换数据。
2.实质
是磁盘中创建一个节点,用来标记内核中一个pipe。
3.小例子:
(1)fifo_w.c
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<string.h>
void sys_err(char *str,int exitno){
perror(str);
exit(exitno);
}
int main(int argc,char *argv[]){
char *buf[256]="hello nihao\n";
int fd;
if(argc<2){
printf("./a.out fifoname\n");
exit(1);
}
// fd=open(argv[1],O_RDONLY);
fd=open(argv[1],O_WRONLY);
if(fd<0){
sys_err("open",1);
}
//向管道里写
write(fd,buf,strlen(buf));//strlen
close(fd);
return 0;
}
(2)fifo_r.c
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<string.h>
void sys_err(char *str,int exitno){
perror(str);
exit(exitno);
}
int main(int argc,char *argv[]){
char *buf[256];
int fd;
if(argc<2){
printf("./a.out fifoname\n");
exit(1);
}
fd=open(argv[1],O_RDONLY);
if(fd<0){
sys_err("open",1);
}
//向管道里写
int len=read(fd,buf,sizeof(buf));//strlen
write(STDOUT_FILENO,buf,len);
close(fd);
return 0;
}
开两个shell,只写未读时会阻塞。
利用命名管道不会在磁盘当中留下痕迹,其大小还是0。
只是磁盘上的一个节点,这个节点去索引内核中的一个缓冲区