并发编程--具名管道
具名管道
文章目录
- 具名管道
- 1. 具名管道FIFO概述
- 2. 函数接口
1. 具名管道FIFO概述
具名管道是跟匿名管道相对而言的,从外在形态上来看,具名管道更接近普通文件,有文件名、可以open打开、支持read()/write()等读写操作。
具名管道通常又被称为FIFO(First In First Out),这其实所所有管道的基本特性,那就是放入的数据都是按顺序被读出,即所谓先进先出的逻辑。
先进先出的具名管道
当然,管道并不是普通文件,具名管道特性:
- 与PIPE一样不支持定位操作lseek()
- 与PIPE一样秉持相同的管道读写特性
- 使用专门的接口来创建:mkfifo()(匿名管道是pipe())
- 在文件系统中有对应节点,支持使用 open() 打开管道(匿名管道不具备)
- 支持多路同时写入(匿名管道不具备)
2. 函数接口
以下是创建具名管道的函数接口
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
- 注意1:pathname即具名管道的名称,若是新建的管道文件,则需保证创建路径位于Linux系统内,尤其是虚拟机中操作的时候,不可将管道文件创建在共享文件夹中,因为共享文件夹是windows系统,不支持管道文件。
- 注意2:mode是文件权限模式,例如0666,注意权限须为八进制,且实际管道的权限还受系统 umask 的影响。
以下是两个程序通过管道互相通信的示例代码:
// 进程A,创建管道并向管道写入字符串"data from FIFO."
int main()
{
// 创建具名管道
mkfifo("/tmp/fifo", 0666);
// 向管道写入数据
int fd = open("/tmp/fifo", O_RDWR);
char *msg = "data from FIFO";
write(fd, msg, strlen(msg));
close(fd);
return 0;
}
// 进程B,从管道读出数据
int main()
{
// 从管道读出数据
int fd = open("/tmp/fifo", O_RDWR);
char buf[50];
bzero(buf, 50);
read(fd, buf, 50);
printf("%s\n", buf);
close(fd);
return 0;
}
- 注意3:具名管道一旦没有任何读者和写者,系统判定管道处于空闲状态,会释放管道中的所有数据。