有名管道(命名管道)

有名管道,或称FIFO文件,是实现进程间通信的一种方式,允许任何两个进程通过它进行通信。FIFO文件不同于普通文件,其读取后内容消失。创建和操作FIFO文件涉及`mkfifo`、`unlink`、`open`、`close`、`read`和`write`等函数。举例中展示了如何创建两个进程,一个用于写入FIFO文件,另一个用于读取并打印数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有名管道又称为FIFO 文件,我们对有名管道的操作可以采用操作文件的方法,如使用 open read
write 等,有名管道适用于任何两个进程间通信。
FIFO 文件和普通文件的对比
1.读取FIFO文件的进程只能以“O_RDONLY”方式 打开FIFO 文件
2.写FIFO文件的进程只能以“O_WRONLY”的方式 打开FIFO文件。
3.FIFO文件里面的内容被读取后,就消失了,但是普通文件的内容读取后还存在。
学习有名管道的操作:
1.创建管道(fifo 文件)->mkfifo
2.删除管道 unlink
3.打开管道 open
4.关闭管道 close
5.读/写管道 read/write


函数接口:
### 创建和使用 Named Pipe 的方法 #### 1. 命名管道的概念 命名管道是一种用于进程间通信(IPC, Inter-Process Communication)的机制,允许不相关的进程之间进行数据传递。与匿名管道不同,命名管道可以在不同的进程中使用,并且可以通过文件系统路径访问。 #### 2. 在 Linux/Unix 中创建 Named Pipe 在 Linux 和 Unix 系统中,可以使用 `mkfifo` 命令或者编程接口来创建命名管道。 ##### 使用命令行工具创建 通过以下命令可以直接创建一个命名管道: ```bash mkfifo mypipe ``` 这将在当前目录下创建名为 `mypipe` 的命名管道[^1]。 ##### 编程方式创建 也可以通过 C 或其他支持 POSIX API 的语言调用 `mkfifo()` 函数来实现: ```c #include <sys/types.h> #include <sys/stat.h> int main() { char *path = "/tmp/mypipe"; mode_t mode = 0666; // 设置权限为 rw-rw-rw- mkfifo(path, mode); // 创建命名管道 return 0; } ``` 此代码片段展示了如何通过程序化的方式创建一个具有指定权限的命名管道[^3]。 #### 3. 在 Windows 中创建 Named Pipe Windows 提供了一套专门的 API 来处理命名管道的操作。通常情况下,会涉及到以下几个主要函数: - **CreateNamedPipe**: 创建并初始化一个新的命名管道实例。 - **ConnectNamedPipe**: 将客户端连接到服务器端的命名管道上。 - **ReadFile / WriteFile**: 对命名管道执行读写操作。 下面是一个简单的例子展示如何设置基本的服务端逻辑: ```cpp #include <windows.h> #include <tchar.h> #include <stdio.h> #define PIPE_NAME "\\\\.\\pipe\\MyPipe" int _tmain() { HANDLE hPipe; while (true) { printf("\nCreating an instance of %s...\n", PIPE_NAME); // Create a named pipe. hPipe = CreateNamedPipe( TEXT(PIPE_NAME), // pipe name PIPE_ACCESS_DUPLEX, // read/write access PIPE_TYPE_MESSAGE | // message-type pipe PIPE_READMODE_MESSAGE | // message-read mode PIPE_WAIT, // blocking mode PIPE_UNLIMITED_INSTANCES, // max instances BUFSIZE, // output buffer size BUFSIZE, // input buffer size NMPWAIT_USE_DEFAULT_WAIT, // client time-out NULL // default security attribute ); if (hPipe != INVALID_HANDLE_VALUE){ break; } Sleep(1); } ConnectNamedPipe(hPipe, NULL); DWORD dwWritten; TCHAR chBuf[] = _T("Default message from server."); WriteFile(hPipe, chBuf, (_tcslen(chBuf)+1)*sizeof(TCHAR), &dwWritten, NULL); CloseHandle(hPipe); return 0; } ``` 该示例演示了如何配置服务端以等待来自客户端的消息请求以及响应消息。 #### 4. 数据交互流程概述 一旦命名管道被成功建立起来之后,两个独立的应用程序就可以分别作为生产者和消费者角色来进行信息交换。具体来说就是一方负责往里面放入数据(`write`)而另一方则从中取出这些数据(`read`)完成整个过程[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值