背景
匿名管道的缺点在于只能用于有血缘关系的进程间通信。若要让两个毫不相干的进程进行通信,需要使用命名管道。
存储机制
要实现非血缘进程通信,首先需确保双方能访问同一个管道文件。命名管道通过文件系统路径实现唯一性,存储在文件系统中,拥有独立的文件路径和 inode,但数据不会写入磁盘,而是发生在内存级缓冲区中。
纯内存级缓冲区的通信方法包括:匿名管道、共享内存、消息队列。
建立命名管道
命令行创建
命名管道可以直接在命令行创建:
mkfifo "管道名"
创建后向管道写入数据,若没有读取端,写入操作会阻塞。查看文件大小通常为 0,说明数据未刷盘。读取结束后数据消失。删除管道使用 unlink 命令。
mkfifo 函数实现通信
函数原型:
int mkfifo(const char *filename, mode_t mode);
以下代码封装了命名管道的初始化和清理逻辑。
头文件封装类:
#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <stdio.h>
#define FIFO_FILE "./myfile"
#define MODE 0664
enum { FIFO_CREAT_FILE = 1, FIFO_DELETE_FILE, FIFO_OPEN_FILE };
class Init {
:
() {
n = (FIFO_FILE, MODE);
(n == ) {
();
(FIFO_CREAT_FILE);
}
}
~() {
m = (FIFO_FILE);
(m == ) {
();
(FIFO_DELETE_FILE);
}
}
};


