Linux进程间通信(二):命名管道的使用和原理

news2024/11/19 7:27:56

文章目录

    • 一、前言
    • 二、命名管道的使用

一、前言

 我们上篇博客里谈到,进程间通信的本质在于如何让两个进程看到同一份资源。匿名管道的核心思想就是让子进程继承父进程,从而让父子进程看到同一份管道文件,但这也使通信仅仅局限在具有血缘关系的进程之间。
 而命名管道的处理办法就比较直截了当了:在指定路径下创建FIFO管道文件。多个进程就像使用普通文件一样对同一份管道文件进行读写操作,由此实现进程间通信。虽然命名管道挂靠于文件系统,但是内核在传递数据的时候会和磁盘去关联,写入时向内存中写入,读取时也从内存中读取,这和匿名管道是一致的

二、命名管道的使用

在这里插入图片描述
[参数说明]:

  • pathname:指定管道文件的路径
  • mode:指定文件的读写权限。管道文件的实际权限 = mode & umask,系统默认掩码为 0002

[返回值]: 创建成功返回0,失败返回-1

[使用总结]:

  1. O_RDONLY O_WRONLY 方式打开文件
     在进行任何输入和输出操作之前,命名管道的读写端必须都被打开,否则管道会被阻塞
  2. 非阻塞式的打开文件 O_NONBLOCK
     以只读的方式打开会成功;以只写的方式打开会报ENXIO(no such device or address)的错误

[demo]:
1.Comm.hpp文件

#include <iostream>
#include <cstring>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define FIFO_PATH "./FIFO"

using namespace std;

void CreateFifo()
{
    if(access(FIFO_PATH, F_OK) != 0)  // 管道文件不存在才需要创建
    {
        if(mkfifo(FIFO_PATH, 0666) != 0)  // 创建管道文件失败
        {
            perror("mkfifo");
        }
    }
}

2.ServiceFifo文件

#include "Comm.hpp"

int main()
{
    CreateFifo();
    int fd = open(FIFO_PATH, O_RDONLY);
    while(true)
    {
        char buff[15] = {0};
        ssize_t ss = read(fd, buff, sizeof(buff));
        buff[ss] = '\0';
        cout << buff << endl;
    }
}

3.ClientFIFO.cc文件

#include "Comm.hpp"

int main()
{
    int fd = open(FIFO_PATH, O_WRONLY);
    int cnt = 0;
    while(true)
    {
        char msg[15] = "hello world";
        write(fd, msg, sizeof(msg));
        sleep(1);
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/110894.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

比Sqoop功能更加强大开源数据同步工具DataX实战

文章目录概述定义与Sqoop对比框架设计支持插件核心架构核心优势部署基础环境安装从stream读取数据并打印到控制台读取MySQL写入HDFS读取HDFS写入MySQL执行流程概述 定义 DataX 官网地址 https://maxwells-daemon.io/ DataX GitHub源码地址 https://github.com/alibaba/DataX D…

SaaS是什么?企业采购SaaS有什么好处?

简单的来讲讲我们对SaaS的理解吧。过去通常来说&#xff0c;我们采购企业使用的产品&#xff0c;通常有比如传统的软件包下载、按照自己的需求找开发商定制、如果有自研能力的团队可以自己去开发。但是这样就比如带来很多问题&#xff1a; 比如业务规则更新了怎么办&#xff1…

Protobuf 了解

Protocol Buffers 是一种结构数据序列化方法&#xff0c;可以将C中定义的存储类的内容与二进制序列串相互转换&#xff0c;主要用于数据传输或数据存储&#xff0c;可类比XML、JSON&#xff0c;而XML、JSON基于文本格式&#xff0c;protobuf是二进制格式&#xff0c;所以比XML、…

【论文阅读总结】inception v4与Inception-ResNet总结

Inception-v4, Inception-ResNet和Residual connections对学习的影响1.摘要2.引言3.文献综述4.体系结构的选择4.1 Pure Inception4.2 Residual Inception Blocks【残差Inception 块】4.3 Scaling of the Residuals【残差的缩放】4.3.1实验发现4.3.1.1实验发现14.3.1.2实验发现2…

ERP容灾备份维护工作有哪些?服务器容灾备份

ERP维护工作有哪些&#xff1f;这是公司信息化专员工作职责&#xff1a;信息规划  1、参与 公司信息化系统总体构架&#xff0c;建立健全公司信息化各项管理制度和标准业务流程&#xff0c;组织公司各业务部门不断进行业务流程的梳理、优化和创新&#xff0c;推动信息化的持续…

408 考研《操作系统》第三章第二节:内存管理、覆盖和交换 、连续分配管理方式、动态分区分配算法

文章目录1. 内存管理的概念1.1 内存保护1.2 总结2. 覆盖与交换2.1 覆盖技术2.2 交换技术2.3 总结&#xff1a;3. 连续分配管理方式3.1 单一连续分配3.2 固定分区分配3.3 动态分区分配3.4 总结4. 动态分区分配算法4.1 首次适应算法4.2 最佳适应算法4.3 最坏适应算法4.4 邻近适应…

米尔基于ARM架构核心板的国产化EtherCAT主站控制器解决方案

EtherCAT是由德国BECKHOFF自动化公司于2003年提出的实时工业以太网技术。它具有高速和高数据有效率的特点&#xff0c;支持多种设备连接拓扑结构。其从站节点使用专用的控制芯片&#xff0c;主站使用标准的以太网控制器。 EtherCAT是一种工业以太网技术&#xff0c;看到的大多…

【RocketMQ】RocketMQ实例--顺序消息

1、应用场景 一、以证券股票交易撮合场景为例&#xff0c;对于出价相同的交易单&#xff0c;坚持按照先出价先交易的原则&#xff0c;下游处理订单的系统需要严格按照出价顺序来处理订单。 二、以数据库变更增量同步场景为例&#xff0c;上游源端数据库按需执行增删改操作&…

RK3568烧录系统

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、烧录工具二、烧录步骤单独烧录烧录整个固件总结前言 前面我们已经学会了编译系统&#xff0c;包括一键编译和单独编译&#xff0c;其中单独编译适合我们做驱…

ENSP 路由器到本地(现实)PC的FTP实验

前言&#xff1a; 在一个风和日丽的下午&#xff0c;我同事突然问我ENSP和本地PC怎么上传和下载文件&#xff1f;我本以为这个很简单&#xff0c;然后我开始了面向百度编程&#xff0c;但是网上的大多数都是ENSP里面的路由器、服务器和PC间的FTP实验&#xff0c;而不是到本地&…

嵌入式经典通信总线协议:SPI协议

目录 一、spi简介 二、SPI特性 三、spi四种工作方式 四、实现代码 1.选择开发板 2.选择SPI 3.设置硬件片选使能和通讯方式&#xff0c;其他根据需要选择 4. 生成代码 一、spi简介 SPI 是英语Serial Peripheral interface的缩写&#xff0c;顾名思义就是串行外围设备接口…

GIT:如何删除仓库中的.idea .DS_Store target文件/文件夹并设置下次不上传

0. 引言 我们常常会有在git仓库初始化时&#xff0c;忘记设置.gitignore文件导致一些非工程文件上传到仓库中了&#xff0c;导致整个仓库的不美观&#xff0c;甚至影响其他开发同事配置代码。这时候我们就需要删除这些指定文件&#xff0c;那么如何操作呢&#xff0c;这一章我…

php学生成绩管理系统,在线录入、统计学生成绩,多种图表展示对比学生成绩

教学质量是学校教学的生命线&#xff0c;只有能够客观分析自己教学成败得失的教师才是一个合格的老师。这是一款注重优化成绩采集方法、丰富成绩分析维度的小学成绩统计系统&#xff0c;力争做到符合教师工作习惯、使用方法简单、数据分析多样、分析结果科学&#xff0c;为教师…

垃圾回收机制之v8引擎

v8的内存分配 &#xff08;栈&#xff08;执行环境&#xff09;跟堆&#xff09; 堆内存负责垃圾回收机制&#xff0c;只有新生代和老生代两部分 新生代&#xff1a;对等分的&#xff08;严格&#xff09; 老生代&#xff1a; 都是由新生代转变的&#xff08;连续的空间&…

Vue 实现 html 表格 (grid) 单元格编辑功能 2

第一版表格编辑实现是刚学VUE时硬凑出来 点击详见 经过网上的不断学习&#xff0c;代码精简功能增强&#xff0c;克服了上一个版本的两个bug。 欢迎没有下载积分的朋友欢迎复制转载。 主要功能&#xff1a; 由于取消了 vue 循环的 key 更新&#xff0c;故单元格不需要点击两…

Redis常见面试题(六)

目录 1、Redis支持的Java客户端有哪些? 2、Redisson是什么框架? 3、Redis和Redisson有什么关系? 4、Jedis和Redisson对比有什么优缺点? 5、Redis为什么不提供Windows版本? 6、Redis怎么在Windows下使用? 7、Redis如何设置密码访问? 8、Redis如何分析慢查询操作?…

前端线上问题如何调试

记录Vue开发过程中遇到的问题&#xff0c;测试环境以及本地显示都没有问题&#xff0c;但是一上线就出现问题&#xff0c;于是对于这个问题进行排查&#xff0c;在此记录排查问题的步骤以及方法&#xff0c;希望对大家有帮助。 错误信息&#xff1a;Uncaught TypeError: Canno…

Redis常见面试题(七)

目录 1、什么是缓存预热? 2、什么是缓存热备? 3、什么是缓存雪崩? 4、如何解决缓存雪崩? 5、什么是缓存穿透? 6、如何解决缓存穿透? 7、什么是缓存击穿? 8、如何解决缓存击穿? 9、什么是缓存抖动? 10、如何解决缓存抖动? 11、什么是缓存无底洞? 12、如何…

如何让一个 C 语言项目调用另一个 C++ 项目中某些类所提供的接口?

目前問題是這樣的&#xff1a;有兩個項目 一個項目是用 C 寫的 裏面提供了一個輸入輸出接口 後來從外面弄來了另外一個項目 用 C 寫的 現在需要將 C 項目中所使用的原有接口替換為使用我們的 C 項目中提供的接口 求問能夠實現否&#xff1f; 在项目开发过程中&#xff0c;我们底…

XGBoost总结

1.算法原理 XGBoost是boosting算法的其中一种。Boosting算法的思想是将许多弱分类器集成在一起形成一个强分类器。因为XGBoost是一种提升树模型&#xff0c;该算法思想就是不断地添加树&#xff0c;不断地进行特征分裂来生长一棵树&#xff0c;每次添加一个树&#xff0c;其实…