六十天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机制之一。

相关推荐
jugt1 小时前
CentOS 7.9安装Nginx1.24.0时报 checking for LuaJIT 2.x ... not found
linux·运维·centos
多多*2 小时前
LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考
linux·开发语言·redis·python·bootstrap·lua
何双新3 小时前
第21讲、Odoo 18 配置机制详解
linux·python·开源
21号 13 小时前
9.进程间通信
linux·运维·服务器
Gaoithe8 小时前
ubuntu 端口复用
linux·运维·ubuntu
德先生&赛先生9 小时前
Linux编程:1、文件编程
linux
程序猿小D9 小时前
第16节 Node.js 文件系统
linux·服务器·前端·node.js·编辑器·vim
多多*10 小时前
微服务网关SpringCloudGateway+SaToken鉴权
linux·开发语言·redis·python·sql·log4j·bootstrap
IT界小黑的对象12 小时前
virtualBox部署ubuntu22.04虚拟机 NAT+host only 宿主机ping不通虚拟机
linux·运维·服务器
SilentCodeY12 小时前
Ubuntu 系统通过防火墙管控 Docker 容器
linux·安全·ubuntu·系统防火墙