Linux--进程间的通信-命名管道

前文:
Linux–进程间的通信-匿名管道
Linux–进程间的通信–进程池

命名管道的概念

命名管道是一种进程间通信(IPC)机制,运行不同进程之间进行可靠的、单向或双向的数据通信

特点和作用:

  1. 跨平台性:在WIndows和Linux系统中都有实现,因此具有良好的跨平台性。
  2. 简单易用: 使用命名管道进行通信相对简单。
  3. 安全性:命名管道充分利用了操作系统提供的安全特性,如WIndows的访问控制列表(ACL),从而确保通信的安全性。

命名管道的模拟实现

在这里插入图片描述
mkfifo是用于创建命名管道的命令,它的作用是在文件系统中创建一个特殊类型的文件,该文件可被多个进程用于进程间的通信。

在这里插入图片描述
这是mkfifo函数。

代码

Comm.hpp: 这里面包含了一个有关命名管道的类,包括管道的创建和销毁。

#ifndef __COMM_HPP__
#define __COMM_HPP__

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

using namespace std;

#define Mode 0666
#define Path "./fifo"

class fifo
{
public:
    fifo(const string & path)
    :_path(path)
    {
        umask(0);
        int n=mkfifo(_path.c_str(),Mode);
        if(n==0)
        {
            cout<< "mkfifo success" << endl;
        }
        else
        {
            cerr << "mkfifo failed, errno: " << errno << ", errstring: " << strerror(errno) << endl;
        }
    }
    ~fifo()
    {
        int n=unlink(_path.c_str());
        if (n == 0)
        {
            cout << "remove fifo file " << _path << " success" << endl;
        }
        else
        {
            cerr << "remove failed, errno: " << errno << ", errstring: " << strerror(errno) << endl;
        }
    }
private:
    string _path; //文件路径
};

#endif

PipeCilent.cc: 这是客户端(写端),将数据写入到命名管道文件;

#include"Comm.hpp"

int main()
{
    int wfd=open(Path,O_WRONLY);
    if(wfd<0)
    {
        cerr << "open failed, errno: " << errno << ", errstring: " << strerror(errno) << endl;
        return 1;
    }

    string inbuffer;
    while(true)
    {
        cout<<"Please Enter Your Message# ";
        getline(cin,inbuffer);
        if(inbuffer=="quit") break;
        ssize_t n=write(wfd,inbuffer.c_str(),inbuffer.size());
        if(n<0)
        {
            cerr << "write failed, errno: " << errno << ", errstring: " << strerror(errno) << endl;
            break;
        }
    }

    close(wfd);
    return 0;
}

PipeServer.cc: 服务端(读端),需要对管道创建一个对象,读取管道中的内容。

#include "Comm.hpp"
#include<unistd.h>

int main()
{
    fifo ff(Path);

    int rfd=open(Path,O_RDONLY);
    if(rfd<0)
    {
        cerr << "open failed, errno: " << errno << ", errstring: " << strerror(errno) << endl;
        return 1;
    }

    //如果写端没有打开,那么open函数会受到阻塞,相当于命名管道与写端没有通信,
    //open函数打开管道文件后如果没有连接写端就会等待
    cout<<"open success"<<endl;

    char buffer[1024];
    while(true)
    {
        ssize_t n=read(rfd,buffer,sizeof(buffer)-1);
        if(n>0)
        {
            buffer[n]=0;
            cout << "client say : " << buffer << endl;
        }
        else if(n==0)
        {
            cout << "client quit, me too!!" << endl;
            break;
        }
        else
        {
            cerr << "read failed, errno: " << errno << ", errstring: " << strerror(errno) << endl;
            break;
        }
    }

    close(rfd);
    return 0;
}

解释

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

命名管道和匿名管道的区别:
匿名管道主要用于有血缘关系的进程间的通信,无法用于两个没有联系的进程而命名管道可以在文件系统中通过路径名来进行使用;并且命名管道开辟的管道本质是一个文件,相对于匿名管道,管道空间比较大;创建方式不同:通过调用不同的系统调用来进行创建;所在位置不同:匿名管道会在内存中创建,而命名管道会在文件系统中创建;

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

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

相关文章

ue4打包多模块

首先&#xff0c;每个模块&#xff0c;包含插件内的模块在内&#xff0c;都要用IMPLEMENT_MODULE(类名, 模块名)的方式&#xff0c;模块名就是带.build.cs的第一个单词。 build.cs里就说了这个模块该怎么用&#xff0c;用c#编写。 打包中要考虑到target.cs,将工程中相应的模块…

Linux服务器磁盘满了如何清理

生产环境中&#xff0c;磁盘很容易被日志文件沾满&#xff0c;如何查找和清理呢&#xff1f; 分享一下个人的经验&#xff1a; 1.先查询到哪个磁盘占用的最多 使用命令&#xff1a;df -h 2.查询/目录下磁盘占用情况 使用命令&#xff1a;du -sh * 3.同理进入占用磁盘比较大…

聊聊binlog是什么

1. 上一讲思考題解答:redo日志刷盘策略的选择建议 先给大家解释一下上一讲的思考題&#xff0c;我给大家的一个建议&#xff0c;其实对于redo日志的三种刷盘策略&#xff0c;我们通常建议是设置为1 也就是说&#xff0c;提交事务的时候&#xff0c;redo日志必须是刷入磁盘文件…

接口测试之用Fiddler对手机app进行抓包

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

基于FPGA的OMEGA东京奥运会计时器

截至2019年共举办了31届奥运会&#xff0c;其中27届的计时设备都由欧米茄&#xff08;OMEGA&#xff0c;Ω&#xff09;提供&#xff0c;今年的东京奥运会将会是第28届。 瑞士计时公司&#xff08;Swiss Timing&#xff09;基于火星Mars ZX2核心板打造了为奥运会等大型体育赛事…

Redis教程——数据类型(哈希、集合)

上篇文章我们学习了Redis教程——数据类型&#xff08;字符串、列表&#xff09;&#xff0c;这篇文章学习Redis教程——数据类型&#xff08;哈希表、集合&#xff09; 哈希表Hash 哈希表是一个string类型的field(字段)和value(值)的映射表&#xff0c;hash特别适合用于存储…

web轮播图

思路&#xff1a; 例如&#xff1a;有5张轮播的图片&#xff0c;每张图片的宽度为1024px、高度为512px.那么轮播的窗口大小就应该为一张图片的尺寸&#xff0c;即为&#xff1a;1024512。之后将这5张图片0px水平相接组成一张宽度为&#xff1a;5120px,高度依然为&#xff1a;5…

问题解决:pip install __命令安装不了Python库

项目环境&#xff1a; 我的环境&#xff1a;Window10&#xff0c;Python3.7&#xff0c;Anaconda3-2.4.0&#xff0c;Pycharm2023.1.3 问题描述①&#xff1a; pip install 命令安装不了需要的安装的Python库&#xff0c;以PyMuPDF为例 1 socket.timeout: The read operation t…

ICASSP 2024会议现场第四弹 晚会上韩风歌舞惊喜连连

会议之眼 快讯 在科技的浪潮中&#xff0c;ICASSP 2024会议作为全球信号处理领域的风向标&#xff0c;今日在充满活力韩国迎来了它的第五天日程&#xff01;会场中热烈的讨论和灵感迸发的交流&#xff0c;让会场仿佛成为一座思想的熔炉&#xff0c;不断燃烧着创新的火花&#…

2024经常用且免费的10个网盘对比,看看哪个比较好用!

网盘在我们的工作和学习中经常会用到&#xff0c;也是存储资料的必备工具&#xff0c;有了它&#xff0c;我们就不用走到哪都带着移动硬盘了&#xff0c;而目前市场上的主流网盘还有数十款&#xff0c;其中有免费的也有付费的&#xff0c;各家不一&#xff0c;今天小编就来为您…

ins视频批量下载,instagram批量爬取视频信息【爬虫实战课1】

简介 Instagram 是目前最热门的社交媒体平台之一,拥有大量优质的视频内容。但是要逐一下载这些视频往往非常耗时。在这篇文章中,我们将介绍如何使用 Python 编写一个脚本,来实现 Instagram 视频的批量下载和信息爬取。 我们使用selenium获取目标用户的 HTML 源代码,并将其保存…

Unity解决:导出安卓apk 安装时报错:应用未安装:软件包似乎无效

Unity2018.4.36 导出安卓apk 安装时报错&#xff1a;应用未安装&#xff1a;软件包似乎无效 解决办法&#xff1a;因为安装到安卓12 需要添加添加过滤规则 在AS工程AndroidManifest.xml 添加过滤规则即可。 android:exported"true"

爬虫 | 网易新闻热点数据的获取与保存

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本项目是一个简单的网络爬虫&#xff0c;用于从网易新闻的热点新闻列表中提取标题和对应的链接&#xff0c;并将提取到的数据保存到一个 CSV 文件中。 目录 一、技术栈 二、功能说明 三、注意事项 四、代码解析 1. 导入所需…

[天梯赛] 图上的动态规划与Dijkstra

题目 刚开始的思路 一开始是想到了要用Dijkstra&#xff0c;但是不知道如何找到多条路径的信息&#xff08;刚开始是想把所有最短路找到之后再比较找到最大的救援队数量&#xff09; 正确的思路 在Dijkstra的过程中&#xff0c;分两种情况&#xff1a; 找到更短路径进行更新…

geolife笔记/python笔记:trackintel.io.read_geolife

此函数解析 geolife_path 目录中可用的所有 geolife 数据 trackintel.io.read_geolife(geolife_path, print_progressFalse) 参数&#xff1a; geolife_path (str) 包含 geolife 数据的目录路径 print_progress (Bool, 默认为 False)如果设置为 True&#xff0c;则显示每个…

【python从入门到精通】-- 第五战:函数大总结

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;python从入门到精通&#xff0c;魔法指针&#xff0c;进阶C&#xff0c;C语言&#xff0c;C语言题集&#xff0c;C语言实现游戏&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文…

js BOM模型常用方法梳理

1、Bom定义 BOM是操作浏览器的模型&#xff0c;主要是对浏览器的一些操作。 2、获取浏览器窗口的尺寸 window.innerHeight:获取窗口的高度。 window.innerWidth:湖区窗口的宽度&#xff0c;只在window浏览器下使用。 3、弹出层 alert:弹出框。 confirm:确认框。返回值有true …

Redis中的Lua脚本(三)

Lua脚本 EVAL命令的实现 EVAL命令的执行过程可以分为以下三个步骤: 1.根据客户端给定的Lua脚本&#xff0c;在Lua环境中定义一个Lua函数2.将客户端给定的脚本保存到lua_scripts字典&#xff0c;等待将来进一步使用3.执行刚刚在Lua环境中定义的函数&#xff0c;以此来执行客户…

2.核心概念与安装配置

核心概念与安装配置 文章目录 核心概念与安装配置1、核心概念Docker整体架构及底层通信原理 2、安装DockerCentos安装Docker引擎阿里云镜像加速Docker run的过程 3、Docker相关命令 1、核心概念 镜像&#xff08;image&#xff09; Docker 镜像&#xff08;Image&#xff09;就…

Linux 搭建私有yum源仓库

一、环境准备 IP系统版本作用192.168.140.155CentOS 7.9.2009yum源仓库192.168.140.153CentOS 7.9.2009测试 准备两台服务器&#xff0c;一台作为yum源仓库&#xff0c;另一台作为测试使用。 二、搭建yum源服务器 &#xff08;无法连接外网的情况&#xff0c;需要去官网下载镜…