当前位置: 首页 > news >正文

并发编程--具名管道

具名管道

文章目录

  • 具名管道
      • 1. 具名管道FIFO概述
      • 2. 函数接口

1. 具名管道FIFO概述

具名管道是跟匿名管道相对而言的,从外在形态上来看,具名管道更接近普通文件,有文件名、可以open打开、支持read()/write()等读写操作。

具名管道通常又被称为FIFO(First In First Out),这其实所所有管道的基本特性,那就是放入的数据都是按顺序被读出,即所谓先进先出的逻辑。

img
先进先出的具名管道

当然,管道并不是普通文件,具名管道特性:

  • 与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:具名管道一旦没有任何读者和写者,系统判定管道处于空闲状态,会释放管道中的所有数据。

相关文章:

  • HarmonyOS-应用程序框架基础
  • 应用于电池模块的 Fluent 共轭传热耦合
  • 【源码分析】Nacos服务注册源码分析-客户端
  • 解决load()文件报错zipfile.BadZipFile: File is not a zip file
  • 给easygui添加字体设置功能(tyysoft增强版)
  • WEB UI自动化测试中,元素定位的八大定位方式详解
  • 事务与异步方法(@Async)协同工作
  • python中print函数的flush如何使用
  • 什么是状态管理?有何种方式可以实现?它们之间有什么区别?
  • ChatGPT-4
  • MyBatis操纵数据库-XML实现(补充)
  • C语言指针与数组深度解析
  • 【ASMbits--常用算术运算指令】
  • 《从零手写Linux Shell:详解进程控制、环境变量与内建命令实现 --- 持续更新》
  • 掌握Windows命令提示符中的万能符:*号的全方位使用指南
  • 2.2[frontEnd]ESLint
  • 语音识别 FireRedASR-AED模型主要特点
  • Gitee重新远程连接仓库(Linux)
  • Spring boot+mybatis的批量删除
  • 模运算的艺术:从基础到高阶的算法竞赛应用
  • 赛力斯拟赴港上市:去年扭亏为盈净利59亿元,三年内实现百万销量目标
  • 最近这75年,谁建造了上海?
  • 朝鲜派兵库尔斯克是否有助于解决乌克兰危机?外交部回应
  • 国家发改委答澎湃:将建立和实施育儿补贴制度,深入实施提振消费专项行动
  • 三杀皇马剑指四冠,硬扛到底的巴萨,赢球又赢人
  • 洗冤录·巴县档案|道咸年间一起家暴案