linux ipc——fifo
1、概念
命名管道:
2、用途
命名管道用的最多的地方就是进程间通信,它的原理是通过文件映射的方式实现的,进程间数据的传输直接在内存中进行,所以它的效率是很高的。
3、特点
6个,3-5同无名管道。
①存在文件系统(支持open、close、read、write)
②fifo文件存在于文件系统,但内容存在于内存,故大小受限制,缓冲区大小为4kb
③有名字
④数据无格式
⑤一次性操作
⑥执行完io操作之后,fifo文件继续存在与文件系统中
4、使用方法
FIFO文件的创建
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo( const char *pathname, mode_t mode);
参数:
pathname:FIFO的路径名+文件名。
mode:mode_t类型的权限描述符。
返回值:
成功:返回 0
失败:如果文件已经存在,则会出错且返回-1。
5、举例
1 #include <stdio.h> 2 3 #include <sys/types.h> 4 5 #include <sys/stat.h> 6 7 #include <fcntl.h> 8 9 #include <string.h> 10 11 int main(int argc,char*argv[]) 12 13 { 14 15 int fd; 16 17 int ret; 18 19 char buf[200]=""; 20 21 ret = mkfifo("my_fifo", S_IRUSR|S_IWUSR); 22 23 if(ret < 0) 24 25 { 26 27 perror("mkfifo"); 28 29 } 30 31 fd= open("my_fifo",O_RDWR|O_CREAT); 32 33 if(fd < 0) 34 35 { 36 37 perror("open"); 38 39 } 40 41 bzero(buf,sizeof(buf));// memset(buf,0,sizeof(buf)); 42 43 strcpy(buf,"hello china\n"); 44 45 ret=write(fd,buf,strlen(buf)); 46 47 if(ret < 0) 48 49 perror("write to fifo"); 50 51 bzero(buf,sizeof(buf));// memset(buf,0,sizeof(buf)); 52 53 ret=read(fd,buf,sizeof(buf)); 54 55 if(ret < 0) 56 57 perror("read from fifo"); 58 59 printf("buf read form my_fifo is %s\n",buf); 60 61 62 63 } 64 65 66 67