Linux-命名管道

文章目录

  • 前言
  • 一、命名管道接口函数介绍
  • 二、使用步骤


前言

上章内容,我们介绍与使用了管道。上章内容所讲的,是通过pipe接口函数让操作系统给我们申请匿名管道进行进程间通信。在这里插入图片描述
并且这种进程间通信一般只适用于父子进程之间,那么对于两个没有“血缘”关系的进程,我们还能通过怎样的方式来进行通信呢?

本章内容主要讲解命名管道的通信,而命名管道,顾名思义,既然匿名管道是没有名字的管道,那么命名管道就是有名字的管道。


一、命名管道接口函数介绍

在这里插入图片描述

先来讲讲函数名:mk - make fifo - first in first out(先进先出),因为管道的buffer就是先进先出的策略,所以函数名为mkfifo。

第一个参数 const char* pathname: 这个参数是作为你要生成的命名管道的路径与名字。不过要注意的是,这个文件的路径最好是你有权限去进行访问,不然可能会出现各种问题。

第二个参数 mode_t mode: 因为既然你要生成一个命名管道文件,那么你就需要给它制定文件的访问权限。

二、使用步骤

使用步骤与匿名管道比较相似,只是多了需要自己调用mkfifo函数的过程

//   # fifo.hpp
#ifndef _FIFO_COM
#define _FIFO_COM


#include<iostream>
#include<cstdio>
#include<assert.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
#include<cstdio>
#include<string.h>
#include<string>


#define PATH_NAME "./fifo.ipc"
std::string END_STR("end");
#endif

//  Server端
#include "fifo.hpp"
#include "Log.hpp"

int main()
{
    // 1.申请命名管道
    int ret = mkfifo(PATH_NAME, 0666);
    if (ret == -1)
    {
        perror("mkfifo");
        exit(1);
    }
    int a = 0;
    Log(Debug) << "Server: make named_pipe success!  Step1" << std::endl;

    // 2.打开命名管道文件
    // Server端进行写操作
    int fd = open(PATH_NAME, O_WRONLY);
    if (fd == -1)
    {
        perror("open");
        exit(2);
    }
    Log(Debug) << "Server: open named_pipe success!   Step2" << std::endl;

    // 3.开始写
    std::string buffer;
    while (1)
    {
        std::cout << "Please Enter Message Line ,End enter 'end' :> ";
        std::getline(std::cin, buffer);
        if(buffer == END_STR) break;
        write(fd, buffer.c_str(), buffer.size());
    }

    //.关闭命名管道
    close(fd);
    Log(Debug) << "Server: close fc done!   Step3" << std::endl;
    return 0;
}
//  Client端
#include "fifo.hpp"
#include "Log.hpp"
int main()
{
    // 1.打开命名管道文件
    // Client端进行读
    int fd = open(PATH_NAME, O_RDONLY);
    if (fd == -1)
    {
        perror("open");
        exit(2);
    }
    char buffer[1024];
    Log(Debug) << "Client: open named_pipe success!  Step1" << std::endl;
    // sleep(5);
    //  开始进行读
    while (1)
    {
        memset(buffer, '\0', sizeof(buffer));
        int n = read(fd, buffer, sizeof(buffer) - 1);
        if (n == 0)
        {
            // 读到了文件末尾
            Log(Debug) << "Read done!" << std::endl;
            break;
        }
        else if (n > 0)
        {
            std::cout << "Server say: " << buffer << std::endl;
        }
    }

    close(fd);
    unlink(PATH_NAME);
    Log(Debug) << "Client: close named_pipe success!  Step2" << std::endl;
    Log(Debug) << "Client: close fd done!   Step3" << std::endl;
    return 0;
}

//   Log.hpp 日志
#include <iostream>
#include <time.h>
#include <string>

#define Debug 0
#define Error 1

const std::string com[] = {
    "Debug",
    "Error"};

std::ostream &Log(int command)
{
    std::cout << "[" << (unsigned)time(nullptr) << "]:"
              << "[" << com[command] << "]" <
        " ";
    return std::cout;
}

需要特别注意的是:对于管道文件,必须读写两端都打开管道文件(也就是都进行open管道文件),否则读端或者写端就会被堵塞在open函数。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mysql原理--redo日志1

1.redo日志是个啥 我们知道 InnoDB 存储引擎是以页为单位来管理存储空间的&#xff0c;我们进行的增删改查操作其实本质上都是在访问页面&#xff08;包括读页面、写页面、创建新页面等操作&#xff09;。我们前边唠叨 Buffer Pool 的时候说过&#xff0c;在真正访问页面之前&a…

RH850P1X芯片学习笔记-Flash Memory

文章目录 FeaturesClock Supply Block DiagramFlash SizeMemory ConfigurationRegistersRegister Base AddressList of RegistersRegister Reset Condition 与Flash Memory相关的操作模式Functional OverviewOption BytesOPBT0 — Option Byte 0OPBT1 — Option Byte 1OPBT2 —…

WEB 3D技术 three.js 点光源

本文的话 我们来设置一下点光源 点光源其实最直观的就是可以做萤火虫 也可以做星光 点点的效果 我们可以直接在官网中搜索 Pointlight 大家可以在官网这里看一下 其实 SpotLight 聚关灯中的属性 Pointlight 点光源也有的 我们先编写代码如下 import ./style.css import * a…

盘点一个AI解答疑难代码的问题

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 湖水无端浸白云&#xff0c;故人书断孤鸿没。 大家好&#xff0c;我是皮皮。 一、前言 前几天在Python白银交流群【上海新年人】问了一个Pandas代码解读…

Linux前后端项目部署

目录 1.jdk&tomcat安装 配置并且测试jdk安装 修改tomcat 配置文件 登入tomcat 发布 安装mysql 导入sql数据 发布项目war包 redis安装 nginx安装 配置nginx域名映射 部署前端项目 centos 7的服务安装 安装jdk 安装tomcat 安装Mysql 安装redis 安装nginx 前后…

linux安装minio

目录 1、服务器创建minio文件 2、进入minio下的bin下 3、授予服务端和客户端文件可执行权限 4、设置用户名和密码 5、启动minio服务 6、查看minio版本 ​7、访问minio控制台 1、服务器创建minio文件 # 创建minio应用程序目录 mkdir -p /opt/minio/bin # 创建minio数据目…

虹软人脸识别白屏

1.修改jdk为1.8 2.编译版本ndk修改 ndk {abiFilters armeabi-v7a, arm64-v8a} 3.local.properties增加ndk路径 ndk.dirH\:\\Android\\SDK\\ndk\\21.1.6352462 4.最重要的一步:检查依赖库是否存在前一定要先检查有么有读取本地文件权限,下面的代码即使是放到点击事件的回调…

码农的周末日常---一月的第二周

上周总结 开发任务按规划完成 参加新版本的需求分析会议&#xff0c;基本了解新功能的实现 开始阅读一本新书《Head first Java》 2024/01/13 天气晴 温度适宜 蓝蓝的天&#xff0c;暖暖的阳光&#xff0c;不晒鞋可惜了&#xff0c;赶紧掏出我那正宗莆田和anta晒…

python爬虫小练习——爬取豆瓣电影top250

爬取豆瓣电影top250 需求分析 将爬取的数据导入到表格中&#xff0c;方便人为查看。 实现方法 三大功能 1&#xff0c;下载所有网页内容。 2&#xff0c;处理网页中的内容提取自己想要的数据 3&#xff0c;导入到表格中 分析网站结构需要提取的内容 代码 import requests…

Black Hole Alliance发展蓝图:从数字化到生态建设

Black Hole Alliance 以WEB3.0生态产业为核心&#xff0c;以强大的技术及社区为依托&#xff0c;确立了 " 区块链 生态产业 AI与Web3融合​ " 的底层架构&#xff0c;将区块链技术与全球生态产业有机融合&#xff0c;以价值交换网络为切入点及立足点&#xff0c;链…

NLP论文阅读记录 - 2021 | WOS 抽象文本摘要:使用词义消歧和语义内容泛化增强序列到序列模型

文章目录 前言0、论文摘要一、Introduction二.前提三.本文方法3.1 总结为两阶段学习3.1.1 基础系统 3.2 重构文本摘要 四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结果4.6 细粒度分析 五 总结思考 前言 Abstractive Text Summarization: Enhancing Sequen…

Spring boot - Task Execution and Scheduling @Async

SpringBoot的任务执行器 Spring Boot通过auto-configuration机制自动创建了任务执行器Task Execution&#xff0c;因此在SpringBoot项目中&#xff0c;你不需要任何配置、也不需要自己创建Task Execution就可以直接使用它。 Spring Boot通过auto-configuration机制创建的任务…

6、C语言:输入与输出

输入输出 标准输入输出getchar&putchar函数printf函数sprintf函数格式化输入——scanf函数 文件访问文件读写 错误处理&#xff1a;stderr和exit行输入和行输出常用函数字符串操作函数字符类别测试和转换函数存储管理函数数学函数随机数发生器函数其他 标准输入输出 getch…

读写分离的手段——主从复制,解决读流量大大高于写流量的问题

应用场景 假设说有这么一种业务场景&#xff0c;读流量显著高于写流量&#xff0c;你要怎么优化呢。因为写是要加锁的&#xff0c;可能就会阻塞你读请求。而且其实读多写少的场景还很多见&#xff0c;比如电商平台&#xff0c;用户浏览n多个商品才会买一个。 大部分人的思路可…

BDD(Behavior-Driven Development)行为驱动开发介绍

为什么需要BDD&#xff1f; “开发软件系统最困难的部分就是准确说明开发什么” (“The hardest single part of building a software system is deciding precisely what to build” — No Silver Bullet, Fred Brooks) 。 看一下下面的开发场景&#xff1a; 场景一&#xf…

第 13 章图

文章目录 13.1 图基本介绍13.1.1 为什么要有图13.1.2 图的举例说明 13.2 图的表示方式13.2.1 邻接矩阵13.2.2 邻接表 13.3 图的快速入门案例13.4 图的深度优先遍历介绍13.4.1 图遍历介绍13.4.2 深度优先遍历基本思想13.4.3 深度优先遍历算法步骤13.4.4 深度优先算法的代码实现 …

4D 毫米波雷达:智驾普及的新路径(二)

4 4D 毫米波的技术路线探讨 4.1 前端收发模块 MMIC&#xff1a;级联、CMOS、AiP 4.1.1 设计&#xff1a;级联、单芯片、虚拟孔径 4D 毫米波雷达的技术路线主要分为三种&#xff0c;分别是多级联、级联 虚拟孔径成像技术、以及 集成芯片。&#xff08; 1 &#xff09;多级…

跟着暄桐林曦老师读《宝贵的人生建议》,重视心这颗种子

暄桐林曦老师在《见道明心的笔墨》读书课上讲到&#xff1a;人要在心这颗种子上去进化。当人的动机和果实都清静时&#xff0c;才能在内心具足里转化出更多可能性&#xff0c;进入正面的循环里。“宽以待人&#xff0c;严以律己&#xff0c;反之&#xff0c;则人人身处地狱”&a…

基于Java SSM框架实现体育竞赛成绩管理系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现体育竞赛成绩管理系统演示 摘要 体育竞赛是各种体育体育项目比赛的总称。是在裁判员的主持下&#xff0c;按统一的规则要求&#xff0c;组织与实施的体育员个体或体育队之间的竞技较量&#xff0c;是竞技体育与社会发生关联&#xff0c;并作用于社会的媒…

Javascript——vue下载blob文档流

<el-table-column label"操作" fixed"right" width"150" showOverflowTooltip><template slot-scope"scope"><el-button type"text" v-has"stbsd-gjcx-down" class"edit-button" click&…
最新文章