Linux命名管道的创建及应用

目录

一、命名管道的定义即功能

1.1创建命名管道

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

1.3命名管道的打开规则

二、进程间命名管道的创建及使用

2.1Comm.hhp

2.2PipeServer.cc

2.3PipeClient.cc


一、命名管道的定义即功能

管道应用的一个限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信。
如果我们想在不相关的进程之间交换数据,可以使用FIFO文件来做这项工作,它经常被称为命名管道。
命名管道是一种特殊类型的文件。

匿名管道只能通过fork的方式来实现父子两个进程之间的通信,而命名管道则是可以让仁义两个进程间实现通信 ,其底层原理为让两个进程打开同一个文件,一个读一个写从而实现通信的功能,当然此文件并不是真的在磁盘中创建了一个文件而是在内存中开辟了一块缓冲区而已。

而打开同一个文件就需要找到文件,即文件的路径+文件名。而通过文件名加路径的管道就是命名管道。

1.1创建命名管道

命名管道可以从命令行上创建,命令行方法是使用下面这个命令:

$ mkfifo filename

 

命名管道也可以从程序里创建,相关函数有: 

int mkfifo(const char *filename,mode_t mode);

此时就可以看到一个开头为p的管道文件。此时就可以打开两个窗口,一边往里写一边往里读

而系统调用的mkfifo需要两个参数pathname表示要创建文件的文件名,mode则是默认权限。

创建命名管道:
int main(int argc, char *argv[])
{
 mkfifo("p2", 0644);
 return 0;
}

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

匿名管道由pipe函数创建并打开。
命名管道由mkfifo函数创建,打开用open。
FIFO(命名管道)与pipe(匿名管道)之间唯一的区别在它们创建与打开的方式不同,一但这些工作完成之后,它们具有相同的语义。

1.3命名管道的打开规则

如果当前打开操作是为读而打开FIFO时
O_NONBLOCK disable:阻塞直到有相应进程为写而打开该FIFO
O_NONBLOCK enable:立刻返回成功
如果当前打开操作是为写而打开FIFO时
O_NONBLOCK disable:阻塞直到有相应进程为读而打开该FIFO
O_NONBLOCK enable:立刻返回失败,错误码为ENXIO

如果想要在代码中删除文件可以调用unlink来进行删除操作。 0返回表示成功,-1表示失败,错误码被设置。

二、进程间命名管道的创建及使用

2.1Comm.hhp

Comm.hpp包含了文件操作所需要的头文件以及常用头文件,包含了Fifo的管道类,可以实现管道的创建及命名,以及在进程结束时及时调用析构函数来对管道进行清理回收。

#ifndef __COMM_HPP__
#define __COMM_HPP__

//头文件
#include <cstring>
#include <string>
#include <cerrno>
#include <iostream>
//调用fifo所需的头文件+opean用到的头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>//open
//调用unlink对管道进行析构的头文件
#include <unistd.h>
//define
#define Mode 0666
#define Path "./fifo"
using namespace std;

class Fifo
{
public:
    Fifo(const string &path):_path(path)//创建有名管道
    {
        umask(0);
        int n=mkfifo(_path.c_str(),Mode);
        if(n==0)
        {
            cout<<"mkfifo sucess"<<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<<"sucess"<<endl;
        }
        else
        {
            cerr<<"remove failed,errno: "<<errno<<",errstring: "<<strerror(errno)<<endl;
        }
    }
private:
    string _path;//有名管道的文件路径+文件名
};


#endif

2.2PipeServer.cc

服务器端负责创建管道并以读方式open打开:

pipeserver负责创建有名管道fifo并且以读方式进行打开,打开后会发出打开成功的信号,然后等待pipeclient往管道内部写入内容后将其读出以此来达到进程间通信的效果,如果client输入quit则一同退出。

pipeserver就类似于服务器一类的角色,负责创建通信工具和用于接收内容并进行反馈。

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

int main()
{
    Fifo fifo(Path);//定义管道文件fifo

    int rfd=open(Path,O_RDONLY);
    if(rfd<0)
    {
        cerr<<"open failed,errno: "<<errno<<",errstring: "<<strerror(errno)<<std::endl;
        return 1;
    }
    //如果我们的写端没有打开,先读端打开,open就会阻塞,直到把写端打开,读open才会返回
    cout<<"open sucess"<<endl; 
    char buffer[1024];
    while(true)
    {
        ssize_t n=read(rfd,buffer,sizeof(buffer)-1);//文件读的时候不需要考虑/0所以sizeof-1
        if(n>0)
        {
            buffer[n]=0;//将最后一位变为0
            cout<<"client say: "<<buffer<<endl;
        }
        else if(n==0)
        {
            cout<<"client quit,me too bye bye"<<std::endl;
            break;
        }
        else
        {
            cerr<<"read failed,errno: "<<errno<<",errstring: "<<strerror(errno)<<endl;
            break;
        }
    }
    close(rfd);
    return 0;
}

2.3PipeClient.cc

pipeclient则就是供用户进行使用的端口,使用端以写方式打开管道文件,并且负责向管道内部写入数据以及内容,然后由服务器进行读取。

#include "Comm.hpp"

int main()
{
    int wfd=open(Path,O_WRONLY);
    if(wfd<0)
    {
        cerr<<"open failed,errno: "<<errno<<",errstring"<<strerror(errno)<<std::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)<<std::endl;
            break;
        }
    }
    close(wfd);
    return 0;
}

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

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

相关文章

动手学机器学习15 实战kaggle比赛

动手学机器学习15 实战kaggle比赛 1. 实战kaggle比赛&#xff1a;预测房价代码结果 2. 课程竞赛&#xff1a;加州2020年房价预测3. QA4. 用到的代码1. hashlib.sha1()2. sha1.update(data)3. train_data.iloc4. fillna(0)5. pd.get_dummies(&#xff09;6. nn.MSELoss()7. torc…

Linux网络部分——部署YUM仓库及NFS共享服务

目录 一、yum仓库服务 1. 软件仓库的提供方式 2.如何构建并使用ftp软件仓库&#xff08;与本地yum源方法一致&#xff09; 3.如何搭建使用yum在线源&#xff1f; 4.yum软件包下载如何保存&#xff1f; 二、NFS共享存储服务 1.存储类型 2.提供共享存储的组合 3.NFS网络…

带你快速了解并掌握TypeScript

TypeScript &#x1f4cc;TypeScript(简称:TS)是微软推出的开源语言 &#x1f4cc;TypeScript 是 JavaScript 的超集(JS 有的 TS 都有) &#x1f4cc;TypeScript Type JavaScript(在 JS 基础上增加了类型支持) &#x1f4cc;TypeScript 文件扩展名为 ts &#x1f4cc;TypeScri…

JMeter断言介绍

JMeter是一个功能强大的性能测试工具&#xff0c;它不仅可以模拟用户的行为&#xff0c;还可以对web应用程序的响应进行检测。其中断言就是JMeter中非常实用的功能之一。 断言是用于验证服务器响应是否正确的测试元素。它会检查服务器响应中的部分或全部内容&#xff0c;并在响…

[NSSRound#1 Basic]basic_check

[NSSRound#1 Basic]basic_check 开题什么都没有&#xff0c;常规信息搜集也无效 发现题目允许PUT的两种做法&#xff1a; 1、 CURL的OPTIONS请求方法查看允许的请求方式 curl -v -X OPTIONS http://node4.anna.nssctf.cn:28545/index.php2、 kali自带的nikto工具扫描网址 Nik…

vscode调试typescript(单文件)

环境 tsc: Version 5.4.5 ts-node: v10.9.2 node: v20.12.0 步骤 1.创建文件夹&#xff0c;下方创建一个index.ts。 function test() {let str: string Hello world.console.log(str) } test()2.安装ts调试插件。 3.点击VSCode的运行和调试Tab&#xff08;第三个&#xff…

el-dialog设置el-head固定

0 效果 1 代码 ::v-deep .adTextDetailDialogClass .el-dialog__body{max-height: calc(100vh - 150px);overflow: auto;border-top:1px solid #dfdfdf;border-bottom:1px solid #dfdfdf; } ::v-deep .adTextDetailDialogClass .el-dialog{position: fixed;height:fit-content;…

Leetcode—155. 最小栈【中等】

2024每日刷题&#xff08;130&#xff09; Leetcode—155. 最小栈 实现代码 class MinStack { public:MinStack() {}void push(int val) {if(st.empty()) {st.emplace(val, val);} else {st.emplace(val, min(val, st.top().second));}}void pop() {if(st.empty()) {return;}…

接口数据脱敏实现方案

背景 敏感信息如手机号、身份证、邮箱等信息需要脱敏后展示给前台&#xff0c;如果需要查看&#xff0c;则需要申请权限&#xff0c;查询时需要记录操作日志。 方案 通过JsonSerializer和注解&#xff0c;在json序列化的时候做脱敏操作 此处使用redis存储了加密后的key和明…

查看pytorch与cuda对应版本

查看cuda版本 打开cmd,输入nvidia-smi&#xff0c;即可可以看到cuda的版本了 2. pytorch与cuda版本对应关系 可以参考这篇文章&#xff0c;写的非常详细&#xff1a;https://blog.csdn.net/FL1768317420/article/details/134769203

预测市场?预测股票?如何让预测有更高的准确率?

我们发现在足球赛中&#xff0c;只要知道一个简单的讯息&#xff08;主队过去的获胜机率超过一半&#xff09;&#xff0c;预测力就会明显好过随便乱猜。如果再加上第二个简单的讯息&#xff08;胜负纪录较佳的队伍会略占优势&#xff09;&#xff0c;可以再进一步提升预测力。…

遇事不决,阿尔萨斯(Arthas)

文章目录 一、cat log.log | grep 流水号 引发的惨案二、Collections.sort排序long型强转int型引发的惨案 一、cat log.log | grep 流水号 引发的惨案 接口报错&#xff0c;查看日志是空指针&#xff0c;但是没有详细的报错信息。 以为是日志打印格式的问题&#xff0c;遂改变…

2024年软件测试最新Web安全测试(文末送电子书)_电子书下载 安全测试,腾讯软件测试开发面试经验

网上学习资料一大堆&#xff0c;但如果学到的知识不成体系&#xff0c;遇到问题时只是浅尝辄止&#xff0c;不再深入研究&#xff0c;那么很难做到真正的技术提升。 需要这份系统化的资料的朋友&#xff0c;可以戳这里获取 一个人可以走的很快&#xff0c;但一群人才能走的更…

Spring AI实战之一:快速体验(OpenAI)

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 关于Spring AI Spring Boot、Spring Cloud、Spring Data&#xff0c;作为一名Java程序员&#xff0c;相信您对这些概览早已耳熟能详&#xff0c;或者天天在用…

本地搭建springboot服务并实现公网远程调试本地接口

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

重发被恶意举报的主食冻干测评,速看可能再被删!PR、希喂和SC真实对比PK!

要给猫咪提供高品质主食&#xff0c;主食冻干是不二之选。主食冻干不仅含肉量高、吸收消化率高&#xff0c;还有着丰富的、普通猫粮无法提供的各类营养素&#xff0c;满足猫咪微量元素的需求。可以说是营养与生骨肉喂养媲美&#xff0c;又能完美避开生骨肉细菌超标带来的一系列…

KaiwuDB 解析器之语义解析

KaiwuDB 解析器介绍 解析器是数据库系统的重要组成部分之一&#xff0c;主要的功能是将客户端输入的 SQL 语句分解为语法单元&#xff0c;然后将这些语法单元转化成数据库内部可识别的数据结构&#xff0c;最终生成数据库可以执行的计划。 KaiwuDB 的一条 SQL 执行的整个生命…

go导入包时提示no required module provides package解决方法

原因&#xff0c;这个包在你的本机没有安装 如redis包的提示为 could not import github.com/gomodule/redigo/redis (no required module provides package "github.com/gomodule/redigo/redis")解决方法&#xff1a; go get github.com/gomodule/redigo/redis

PHP+MySQL组合开发 自定义商城系统源码 带完整的安装代码包以及安装部署教程

随着电子商务的蓬勃发展&#xff0c;越来越多的企业和个人希望拥有自己的在线商城系统。小编给大家分享一款基于PHP和MySQL技术栈&#xff0c;开发的一套自定义商城系统源码。该系统旨在帮助用户快速搭建稳定、高效的电子商务平台&#xff0c;并提供灵活的自定义功能&#xff0…

日本站群服务器的优点以及适合该服务器的业务类型?

日本站群服务器的优点以及适合该服务器的业务类型? 日本站群服务器是指位于日本地区的多个网站共享同一台服务器的架构。这种服务器架构有着诸多优点&#xff0c;使其成为许多企业和网站管理员的首选。以下是日本站群服务器的优点以及适合该服务器的业务类型的分析&#xff1…