Linux——命名管道

Linux——命名管道

  • 命名管道
    • 命名管道和匿名管道的区别
  • 创建命名管道
    • 利用命名管道实现简单通信

我们之前学习了匿名管道,这种管道有一个缺点就是只有两个有血缘关系的进程才能够使用匿名管道,这个非常不方便。所以我们又在匿名管道的基础之上引入了命名管道,它允许两个没有血缘关系的进程进行通信。

如果有小伙伴对匿名管道还不是很了解的话,可以点击这里:

https://blog.csdn.net/qq_67693066/article/details/136371517

命名管道

命名管道(Named Pipes)是一种进程间通信(IPC,Inter-Process Communication)机制,允许在操作系统中的不同进程之间进行可靠的数据传输。它在Unix-like系统(如Linux)和Windows系统中均有实现。
在命名管道中,不同于匿名管道,通信双方不需要有直接的父子进程关系,任何一个进程可以通过管道的名字(即“命名”)来访问管道进行通信,这使得不相关的进程之间也能进行数据交换
命名管道在操作系统中表现为一种特殊类型的文件,它存在于系统的命名空间中,可以像打开文件那样被打开和读写。一旦创建,命名管道就可以在不同的进程中被打开多次,允许单向或双向的数据流传输。
在Windows系统中,命名管道可通过服务器/客户端模式进行通信,一个进程可以作为管道服务器监听并接受连接请求,而其他进程作为管道客户端连接到已命名的管道并进行通信。
在Linux系统中,命名管道也称为FIFO(First-In-First-Out),是文件系统中的一个特殊文件,具有先进先出的特性,通过文件操作接口进行读写。
无论是Windows还是Linux系统,命名管道都支持跨进程甚至是跨计算机(在网络环境下)的通信,为分布式系统中的进程间协作提供了便利。

命名管道和匿名管道的区别

命名管道(Named Pipe)和匿名管道(Anonymous Pipe)在操作系统中都是用于进程间通信(IPC)的重要机制,它们之间的主要区别如下:

  1. 名称和持久性
  • 匿名管道:没有名字,由创建它的进程自动创建并立即可用,生命周期通常与创建它的进程相关联,进程结束时管道消失。
  • 命名管道:有全局唯一的名称,在文件系统中作为一个特殊类型的文件存在,即使创建它的进程终止,只要管道文件未被删除,其他进程依然可以通过名称打开并使用这个管道进行通信。
  1. 范围和用途
  • 匿名管道:主要用于同一台计算机上的具有亲缘关系(通常是父子进程)的进程间通信,不适合跨机器或跨越长时间周期的通信。
  • 命名管道:不仅可用于同一台计算机上的进程间通信,而且支持非亲缘关系进程间的通信,甚至可以在网络环境中的不同计算机之间使用,实现了跨计算机的IPC功能。
  1. 创建和使用方式
  • 匿名管道:由操作系统在创建新进程时自动创建(如fork调用后),或者通过特定API函数(如Unix/Linux中的pipe()函数)手动创建。
  • 命名管道:需要通过系统调用如mkfifo()在文件系统中显式创建,随后其他进程通过文件路径名打开。
  1. 访问权限和安全性
  • 匿名管道:创建后只能由创建它的进程及其后代进程访问,权限控制相对简单。
  • 命名管道:可以设置权限,允许不同用户和组访问,具有更高的安全性,因为它可以根据文件系统权限进行控制。
  1. 方向性
  • 早期的匿名管道在某些实现中可能是单向的,而命名管道通常可以实现双向通信。
  1. 复用性
  • 匿名管道:一般是一对一通信,不能被多个读写进程共享(除了父子进程)。
  • 命名管道:可以被多个读写进程同时打开,实现一对多或多对多的通信。

综上所述,命名管道相比于匿名管道提供了更大的灵活性和扩展性,但也带来了额外的管理和安全性考量。

创建命名管道

在Linux下,我们可以直接敲命令行直接创建命名管道:mkfifo
在这里插入图片描述
比如我想创建一个myfifo的命名管道:
在这里插入图片描述这个时候我们就创建了一个myfifo的命名管道。那么这个命名管道有什么用呢?

利用命名管道实现简单通信

我们可以就利用我们的这个管道实现一个简单的通信,首先我们先创建两个.cc文件:
在这里插入图片描述

我们在client.cc中写下这么一段代码:

#include<iostream>
#include<stdlib.h>
#include<fcntl.h>
#include<cstring>
#include<unistd.h>


int main()
{
    //以写的方式打开管道
    int wfd = open("../myfifo",O_WRONLY);

    if(wfd == -1)
    {
        perror("open fail");
        exit(EXIT_FAILURE);
    }
    else
    {

        while(true)
        {
            //准备输入
            std::string my_information;
            std::cout<<"Please enter:";
            std::getline(std::cin, my_information); // 使用 getline 获取整行输入,包括换行符


            // 移除末尾的换行符
            if (!my_information.empty() && my_information.back() == '\n')
            {
                my_information.pop_back(); // 删除最后一个字符(如果它是换行符)
            }

            size_t length_without_newline = my_information.length();
            if(write(wfd, my_information.c_str(), length_without_newline) == -1)
            {
                perror("write fail");
                exit(EXIT_FAILURE);
            }


            std::cout << "Client say: " << my_information;
            }
    }

    return 0;
    
}

在server.cc中写下:

#include<iostream>
#include<stdlib.h>
#include<fcntl.h>
#include<cstring>
#include<unistd.h>


int main()
{
    //以写的方式打开管道
    int wfd = open("../myfifo",O_WRONLY);

    if(wfd == -1)
    {
        perror("open fail");
        exit(EXIT_FAILURE);
    }
    else
    {

        while(true)
        {
            //准备输入
            std::string my_information;
            std::cout<<"Please enter:"<<std::endl;
            std::getline(std::cin, my_information); // 使用 getline 获取整行输入,包括换行符


            // 移除末尾的换行符
            if (!my_information.empty() && my_information.back() == '\n')
            {
                my_information.pop_back(); // 删除最后一个字符(如果它是换行符)
            }

            size_t length_without_newline = my_information.length();
            if(write(wfd, my_information.c_str(), length_without_newline) == -1)
            {
                perror("write fail");
                exit(EXIT_FAILURE);
            }
            }
    }

    return 0;
    
}

我们打开多个窗口:
在这里插入图片描述
通过命名管道我们实现了两个程序的交流。

我们也可以通过mkfifo函数实现对管道的创建:

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h> // 包含mkfifo函数声明


int main() {
    const char *fifo_name = "/tmp/my_fifo"; // 命名管道的路径
    // 创建命名管道
    if (mkfifo(fifo_name, 0666) == -1) { // 第二个参数是权限模式
        perror("mkfifo");
        exit(EXIT_FAILURE);
    }
    printf("命名管道 '%s' 已成功创建\n", fifo_name);
    return 0;

}

在这段代码中,mkfifo(“/tmp/my_fifo”, 0666)用于在"/tmp"目录下创建一个名为"my_fifo"的命名管道,权限设置为所有用户均可读写(0666)。创建成功后,其他进程可以通过文件路径名打开并使用此命名管道进行通信。

命名管道的知识不是特别多,但是我们可以利用命名管道来创建进程池。这个应该还蛮有意思的。

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

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

相关文章

Flask python :logging日志功能使用

logging日志的使用 一、了解flask日志1.1、Loggers记录器1.2、Handlers 处理器1.3、Formatters 格式化器 二、使用日志2.1、官网上的一个简单的示例2.2、基本配置2.3、具体使用示例2.4、运行 三、写在最后 一、了解flask日志 日志是一种非常重要的工具&#xff0c;可以帮助开发…

系列学习前端之第 7 章:一文掌握 AJAX

1、AJAX 简介 AJAX 全称为 Asynchronous JavaScript And XML&#xff08;中文名&#xff1a;阿贾克斯&#xff09;&#xff0c;就是异步的 JS 和 XML。AJAX 不是新的编程语言&#xff0c;而是一种将现有的标准组合在一起使用的新方式。AJAX 可以在浏览器中向服务器发送异步请求…

flutter 弹窗之系列一

自定义不受Navigator影响的弹窗 class MyHomePage extends StatefulWidget {const MyHomePage({super.key, required this.title});final String title;overrideState<MyHomePage> createState() > _MyHomePageState(); }class _MyHomePageState extends State<MyH…

rabbitmq-c 程序实现客户端服务端

安装mq https://blog.csdn.net/zl_momomo/article/details/82986368 需要安裝rabbitmq-server 开启rabbitmq服务 systemctl start rabbitmq-server systemctl enable rabbitmq-server. 客户端 amqp_sendstring.c include <stdint.h> #include <stdio.h> #incl…

访问二维数组本质

先从一维数组讲起 int main() {int arr[5] { 1,2,3,4,5 };for (int i 0; i < 5; i) {printf("%d",arr[i]); //对数组进行访问}return 0; } 其实 arr [ i ] * (arr i) 这两个是完全相等的&#xff0c;在c语言指针&#xff08;1&#xff09;8.数组名与 …

STM32F103 CubeMX 使用USB生成键盘设备

STM32F103 CubeMX 使用USB生成键盘设备 基础信息HID8个数组各自的功能 生成代码代码编写添加申明信息main 函数编写HID 修改1. 修改报文描述符2 修改 "usbd_hid.h" 中的申明文件 基础信息 软件版本&#xff1a; stm32cubmx&#xff1a;6.2 keil 5 硬件&#xff1a;…

Redis中的事件(三)

时间事件 事件的调度与执行 因为服务器中同时存在文件事件和时间事件两种事件类型&#xff0c;所以服务器必须对这两种事件进行调度&#xff0c;决定何时应该处理文件事件&#xff0c;何时有应该处理时间事件&#xff0c;以及花多少事件来处理它们等等。事件的调度和执行由ae…

uniApp中使用小程序XR-Frame创建3D场景(2)加载模型

上篇文章讲述了如何将XR-Frame作为子组件集成到uniApp中使用&#xff0c;只完成了简单的环境搭建&#xff0c;这篇文章讲解如何加载3D模型。 1 加入模型加载标签 在XR-Frame框架中&#xff0c;加载资源都是在wxml文件的标签中实现的。下面是wxml中完整的代码 index.wxml &l…

(二)Eureka服务搭建,服务注册,服务发现

1.Eureka注册中心 假如我们的服务提供者user-service部署了多个实例&#xff0c;如图&#xff1a; 存在几个问题&#xff1a; order-service在发起远程调用的时候&#xff0c;该如何得知user-service实例的ip地址和端口&#xff1f;有多个user-service实例地址&#xff0c;…

手机和键盘的数字键盘排序为什么是不同的?

不知道你有没有注意有一个问题。我们的手机输入法中的数字键盘&#xff0c;电脑上通用的数字键盘&#xff0c;计算器上的数字键盘等排序是不同的&#xff0c;从观察者角度看&#xff0c;0-9的数字排列有从上到下的排列&#xff0c;还有从下到上的排列。为什么会出现不同的排列方…

HWOD:句子逆序

一、题目 描述 将一个英文语句以单词为单位逆序排放。例如I am a boy逆序排放后为boy a am I。所有单词之间用一个空格隔开。语句中除了英文字母外&#xff0c;不再包含其他字符。 数据范围 输入的字符串长度满足 1<n<1000 输入 输入一个英文语句&#xff0c;每个…

【电力监控保护】AM5SE-IS防孤岛保护装置/35kV、10kV、380V分布式光伏并网供电/什么是孤岛效应/孤岛效应的危害

什么是孤岛效应&#xff01;&#xff01;&#xff01; 安科瑞薛瑶瑶18701709087 在电力系统中&#xff0c;孤岛效应指的是当电网突然断电时&#xff0c;并网光伏发电系统仍然保持对电网中部分线路的供电状态。这种情况下&#xff0c;这些线路与其他电网断开&#xff0c;形成了…

HarmonyOS页面布局方式

Column&Row组件的使用 1 概述 一个丰富的页面需要很多组件组成&#xff0c;那么&#xff0c;我们如何才能让这些组件有条不紊地在页面上布局呢&#xff1f;这就需要借助容器组件来实现。 容器组件是一种比较特殊的组件&#xff0c;它可以包含其他的组件&#xff0c;而且…

亚马逊美国站CPC认证婴儿门栏和围栏安全标准cpsc办理

美国ASTM F1004-19认证属于婴幼儿门栏和围栏安全标准 ASTM F1004-19婴幼儿门栏和围栏安全标准 2020年7月6日&#xff0c;美国消费品安全委员会发布了最终法规16 CFR 1239&#xff0c;为婴幼儿门栏和围栏建立了安全标准。该法规合并及修订了最新版本的ASTM F1004-19《婴幼儿扩展…

【分布式】——降级熔断限流

降级&熔断&限流 ⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记仓库&#x1f449;https://github.com/A-BigTree/tree-learning-notes 个人主页&#x1f449;https://www.abigtree.top ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点…

API网关-Apisix路由配置教程(数据编辑器方式)

文章目录 前言一、端口修改1. apisix 端口修改2. dashboard 端口修改3. 登录密码修改 二、常用插件介绍1. 常用转换插件1.1 proxy-rewrite插件1.1.1 属性字段1.1.2 配置示例 2. 常用认证插件2.1 key-auth插件2.1.1 消费者端字段2.1.2 路由端字段2.1.3 配置示例 2.2 basic-auth插…

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记11:数字电位器MCP4017

系列文章目录 嵌入式|蓝桥杯STM32G431&#xff08;HAL库开发&#xff09;——CT117E学习笔记01&#xff1a;赛事介绍与硬件平台 嵌入式|蓝桥杯STM32G431&#xff08;HAL库开发&#xff09;——CT117E学习笔记02&#xff1a;开发环境安装 嵌入式|蓝桥杯STM32G431&#xff08;…

高速行者,5G工业路由器助力车联网无缝通信

随着5G技术的飞速发展&#xff0c;智能制造正迎来一个全新的时代。5G工业路由器作为车联网的核心设备&#xff0c;正在发挥着关键的作用。它不仅提供高速稳定的网络连接&#xff0c;还支持大规模设备连接和高密度数据传输&#xff0c;为车辆之间的实时通信和信息交换提供了强有…

GitLab更新失败(CentOS)

使用yum更新GitLab&#xff0c;出现如下错误提示&#xff1a; Error: Failed to download metadata for repo gitlab_gitlab-ce: repomd.xml GPG signature verification error: Bad GPG signature 编写如下脚本&#xff1a; for pubring in /var/cache/dnf/gitlab_gitlab-?…

java Web会议信息管理系统 用eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 jsp 会议信息管理系统是一套完善的web设计系统&#xff0c;对理解JSP java SERLVET mvc编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,eclipse开发&#xff0c;数据库为Mysql5.0&am…