前几天我们简单的介绍了进程间通讯的一种渠道——管道,我们有说道管道的概念,管道的通讯原理,还提到了管道的两种类型:有名管道和无名管道,今天我们就来说说有名管道吧
基本概念:
有名管道在文件目录中有一个文件标示(管道文件)。实际不占据磁盘空间。数据缓存在内存上(只有使用时内存才开辟,由于在内存上,因此管道文件的属性中所占空间大小为0字节;当两个进程间一读一写完成后,管道文件也立即在内存清空)
FIFO为管道文件
-
管道的操作:
-
创建: 命令方式:mkfifo 函数方式:mkfifo();
-
打开: open(char *path , int flag);
-
读数据: read(int fd , char *buff , intsize);
定义一个buff,将fd里的数据读入buff里;
-
写数据: write(int fd ,char *buff ,int size);
定义一个buff,将buff里的数据写入fd里
-
关闭: close(int fd);
-
阻塞运行函数:
函数调用以后并不会立即返回,需要等待某些条件的发生才会返回
Open,read,write函数在操作文件时不会阻塞,但在操作管道文件时会出现阻塞
-
Open:如果一个进程以只写的方式打开一个文件时,open函数就会阻塞,直到另一个进程以只读的方式打开管道文件时open才会返回,进程才会接着执行;如果一个进程以只读的方式打开一个文件时,open函数就会阻塞,直到另一个进程以只写的方式打开管道文件时open才会返回,进程才会接着执行;
-
Read:read也会阻塞,直到写入数据或者所有写端都关闭才不会阻塞,read读写数据后会将内存上的已读数据清空;
-
Write:当管道满的时候就会阻塞