六十天Linux从0到项目搭建(第二十三天)(命名管道)

1 命名管道(FIFO)的文件唯一性与进程间通信

命名管道(也称为FIFO)是一种特殊的文件类型,它允许无亲缘关系的进程通过文件系统进行通信。以下是命名管道如何保证不同进程访问同一资源的机制:

文件唯一性保证机制

  1. 路径名作为全局标识符

    • 命名管道在文件系统中有一个唯一的路径名

    • 所有进程通过这个路径名访问同一个管道资源

    • 例如:/tmp/my_pipe 对所有进程都指向同一个FIFO

  2. 创建与访问方式

    复制代码
    #include <sys/stat.h>
    int mkfifo(const char *pathname, mode_t mode);
    • 第一个创建管道的进程使用mkfifo()系统调用

    • 后续进程只需使用常规的open()函数打开同一路径

  3. 内核维护的单一实例

    • 虽然看起来像普通文件,但内核会确保:

      • 只有一个管道实例与特定路径名关联

      • 所有打开该路径的进程访问的是同一个内核缓冲区

进程间通信实现前提

  1. 通信准备阶段

    • 进程A创建命名管道:

      复制代码
      $ mkfifo /tmp/my_pipe
      或
      $ mkfifo("/tmp/my_pipe", 0666);
    • 进程B通过相同路径打开同一管道

  2. 打开特性

    • 只读打开会阻塞,直到另一个进程以写方式打开

    • 只写打开会阻塞,直到另一个进程以读方式打开

    • 可以使用O_NONBLOCK标志非阻塞打开

  3. 通信过程示例

    复制代码
    // 进程A (写入端)
    int fd = open("/tmp/my_pipe", O_WRONLY);
    write(fd, "Hello", 6);
    
    // 进程B (读取端)
    int fd = open("/tmp/my_pipe", O_RDONLY);
    char buf[20];
    read(fd, buf, sizeof(buf));

关键注意事项

  1. 持久性

    • 命名管道会持续存在于文件系统中,直到被显式删除

    • 即使没有进程使用,管道文件仍然存在

    • 需要手动删除:unlink("/tmp/my_pipe")

  2. 权限控制

    • 通过文件权限位(创建时设置的mode参数)控制访问

    • 典型权限:0666(允许所有用户读写)

  3. 与匿名管道的区别

    特性 命名管道(FIFO) 匿名管道
    标识 文件系统路径 文件描述符
    进程关系 任意进程 必须有关联
    生命周期 持久性 随进程结束
    创建方式 mkfifo() pipe()

命名管道通过文件系统路径名这一全局命名空间,为无关进程提供了可靠的通信通道,是Unix/Linux系统中重要的IPC机制之一。

相关推荐
欢鸽儿41 分钟前
理解Vivado的IP综合策略:“Out-of-Context Module Runs
linux·ubuntu·fpga
HappyGame021 小时前
Linux多线程编程
linux
躺着数星星1 小时前
Linux中安装es
linux·elasticsearch·jenkins
带土11 小时前
32位ubuntu14.0.4安装chrome
linux·chrome
欢鸽儿1 小时前
Vivado综合通关指南:从IP打包失败到工具崩溃的四重考验
linux·ubuntu·fpga
9毫米的幻想1 小时前
【Linux系统】—— 程序地址空间
java·linux·c语言·jvm·c++·学习
梦想blog3 小时前
漏洞修复 CentOS x86_64 OpenSSH 升级操作文档
linux·运维·centos·ssh·漏洞修复
林开落L7 小时前
Linux 进程信号:从进阶特性到实战应用(下)
linux·运维·服务器·进程信号
口嗨农民工11 小时前
win10默认搜索APP和window设置控制命板
linux·服务器·c语言
qq_4557608513 小时前
cmake命令行工具介绍
linux·服务器