LINUX系统编程:命名管道

匿名管道的通信只能在,有血缘关系的进程中,本质就是,子进程会拷贝一份父进程的文件描述符表,父子进程就可以看到操作系统的同一块资源(文件),以这块资源为媒介进行通信。

命名管道,就是以路径为标识符,让两个不相干的进程,看到同一块资源(文件),以这个文件进行通信。

管道文件

mkfifo fifo 创建一个名位fifo的管道文件

这个是LINUX命令,还有个系统调用也叫mkfifo

文件的类型为p,pipe管道的意思,ubuntu为了标识管道文件,特地在文件后边加了一个|

一个文件是 文件的内容 + 文件的属性,但是管道文件是没有内容的,他只有缓冲区。

像匿名管道就是先写到缓冲区,再刷新到文件中,在读取到缓冲区,才能被读端读到。

命名管道,直接就可以使用缓冲区进行通信,不用再刷新到文件中。

系统调用mkfifo

pathname就是要创建的文件名,mode就是要创建文件的权限。

创建一个名为pathname,特殊的先进先出的文件。mode指定FIFO文件的权限。创建文件的权限被进程的权限掩码所影响,被创建文件的权限是(mode& ~umask)

创建成功返回0,创建错误-1返回,错误码被设置。

ClintServer通信

先打开服务端,创建一个命名管道,打开客户端,客户端向服务端发送信息,服务端读取,服务关闭删除管道文件。

//common.hpp
#pragma once
#include <iostream>
#include <string>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <cerrno>
#include <unistd.h>
#include <fcntl.h>
using namespace std;
#define path "./fifo"//文件的名称
#define mode 0666 //创建文件的权限啊
class fifo
{
public:
    fifo()
    {
        umask(0);//为了不守系统的umask影响
        int ret = mkfifo(_path.c_str(),mode);
        if(ret == 0)
        {
            cout<<"mkfifo sucess"<<endl;
        }
        else if(ret == -1)
        {
            cout<<"mkfifo fail,errno:"<<errno<<"errstirng:"<< strerror(errno)<<endl;
        }
    }
    
    ~fifo()
    {
        int ret = unlink(_path.c_str());//删除管道文件
        if(ret == 0)
        {
            cout<<"unlink sucess"<<endl;
        }
        else if(ret == -1)
        {
            cout<<"unlink fail,errno:"<<errno<<"errstirng:"<< strerror(errno)<<endl;
        }
    }
private:
    string _path = path;
};
//客户端
#include"Common.hpp"

//客户端写
int main()
{
    int wfd = open(path,O_WRONLY);
    if(wfd != -1)
    {
        cout<<"open scuess"<<endl;
    }
    else
    {
         cout<<"open fail,errno:"<<errno<<"errstirng:"<< strerror(errno)<<endl;
    }

    string in;
    while (true)
    {
        cout << "Please Enter Your Message# ";    
        getline(cin,in);
        if(in == "quit")
        {
            cout<<"quit now"<<endl;
        }

        size_t n = write(wfd,in.c_str(),in.size());
        if(n < 0)
        {
             cout<<"write fail,errno:"<<errno<<"errstirng:"<< strerror(errno)<<endl;
             break;
        }

    }
    close(wfd);
    return 0;
}

//服务端
#include"Common.hpp"

//服务端读
int main()
{
    fifo f;
    int rfd = open(path,O_RDONLY);
    if(rfd != -1)
    {
        cout<<"open scuess"<<endl;
    }
    else
    {
         cout<<"open fail,errno:"<<errno<<"errstirng:"<< strerror(errno)<<endl;
    }
    char buffer[1024];
    while(true)
    {
        size_t n = read(rfd,buffer,sizeof(buffer)-1);
        if(n > 0)
        {
            buffer[n] = '\0';
            cout<<"clint say:"<<buffer<<endl;
        }
        else if(n == 0)
        {
            cout<<"clint closed serve quit now"<<endl;
            break;
        }
        else
        {
            cout<<"read fail,errno:"<<errno<<"errstirng:"<< strerror(errno)<<endl;
            break;
        }
    }
    close(rfd);
    return 0;
}

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

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

相关文章

C++ (week4):Linux基础

文章目录 零、Linux简介1.配置环境2.Linux历史3.Linux模型 一、vim二、Linux命令行 (shell命令)1.常用命令与快捷键(1)常用命令①man命令&#xff1a;查看帮助手册 (2)快捷键 2.用户子系统(1)Linux用户(2)用户命令 3.文件子系统命令(1)目录命令1.创建文件&#xff1a;mkdir2.删…

15、24年--信息系统管理——管理要点

1、数据管理 数据管理使指通过规划、控制与提供数据和信息资产的职能,包括开发、执行和监督有关数据的计划、策略、方案、项目、流程、方法和程序,以获取、控制、保护、交付和提高数据和信息资产价值。 DCMM定义了数据战略、数据治理、数据架构、数据应用、数据安全、…

分布式数据库HBase入门指南

目录 概述 HBase 的主要特点包括: HBase 的典型应用场景包括: 访问接口 1. Java API: 2. REST API: 3. Thrift API: 4. 其他访问接口: HBase 数据模型 概述 该模型具有以下特点&#xff1a; 1. 面向列: 2. 多维: 3. 稀疏: 数据存储: 数据访问: HBase 的数据模型…

Java入门基础学习笔记47——ArrayList

什么是集合呢&#xff1f; 集合是一种容器&#xff0c;用来装数据的&#xff0c;类似数组。 有数组&#xff0c;为什么还要学习集合呢&#xff1f; 数组定义完成并启动后&#xff0c;长度就固定了。 而集合是大小可变&#xff0c;开发中用的最多的。 集合的特点&#xff1a;大…

WSL调用docker

WSL&#xff08;windows subsystem linux&#xff09;是window系统的原生linux子系统&#xff0c;用于代码开发很方便。 希望在wsl里面运行docker&#xff0c;首先要安装docker在WSL中使用&#xff0c;大部分人的第一想法肯定是用以下命令行安装&#xff08;个人不推荐&#x…

Log360:护航安全,远离暗网风险

暗网有时候就像是一个神秘的地下世界&#xff0c;是互联网的隐蔽角落&#xff0c;没有任何规则。这是一个被盗数据交易、网络犯罪分子策划下一步攻击的地方。但仅仅因为它黑暗&#xff0c;不意味着你要对潜在的威胁视而不见。 暗网 这就是ManageEngine Log360的用武之地&…

Wireshark 4.2.5:发现 QUIC 和 VXLAN 协议的新功能

Wireshark 是一种先进且广泛使用的网络协议分析仪&#xff0c;最近发布了新版本 4.2.5&#xff0c;它提供了许多新功能和改进。 Wireshark 4.2.5 发行说明 什么是 Wireshark&#xff1f; Wireshark 是世界上最流行的网络协议分析器。它用于故障排除、分析、开发和教育。 Wiresh…

小短片创作-组装场景(一)

1、项目基础设置 通过第三人称模板&#xff0c;创建1个项目 1.自动曝光&#xff1a;关闭&#xff0c;因为要做专业的小短片&#xff0c;曝光需要手动控制。 2.扩展自动曝光中的默认亮度范围&#xff1a;启用 3.全局光照系统&#xff1a;选择屏幕空间光照&#xff08;SSGI&am…

react antd中transfer穿梭框组件中清除搜索框内容

如图&#xff1a;需要清除search搜索框内容 antd的transfer穿梭框组件未提供入口修改input框的值。 2种方法修改。 1、直接操作dom元素设置值&#xff08;不推荐&#xff09; useEffect(() > {const searchInput document.querySelector(.ant-transfer-list-search input)…

【ai】chatgpt的plugin已经废弃

发现找不到按钮,原来是要申请: https://openai.com/index/chatgpt-plugins/ 发现申请已经跳转了,好像是废弃了? 不接受新插件了,但是openai的api 是可以继续用的。 https://openai.com/waitlist/plugins/We are no longer accepting new Plugins, builders can now create…

数据意外删除?安卓手机数据恢复教程来帮你解救

手机不仅仅是一个通讯工具&#xff0c;更是我们记录生活、工作、学习等各种信息的重要载体&#xff0c;无论是拍照、录音、录像&#xff0c;还是文字记录&#xff0c;手机都能轻松完成。可有时候我们会不小心删除一些重要的数据&#xff0c;这时候我们该怎么办呢&#xff1f;别…

plsql 学习

过程化编程语言 赋值&#xff1a;&#xff1a; ||&#xff1a;连接符号 dbms_output.put_line() :输出的语句 var_name ACCOUNTLIBRARY.USERNAME%type; 变量名&#xff1b;某个表的数据类型&#xff1b;赋值给变量名 用下面的方法更好用 异常exception 循…

Windows 7 SP1 安装VMtools -- 安装失败的解决方法

VMware安装Win7 SP1可以参考这篇文章&#xff1a;https://blog.csdn.net/2301_77225571/article/details/139121179?spm1001.2014.3001.5501 1.下载补丁 https://www.catalog.update.microsoft.com/search.aspx?qkb4474419 2.本机远控Win7 【Win】【R】&#xff0c;输入cmd…

2024年甘肃特岗教师招聘报名流程,速速查收哦!

2024年甘肃特岗教师招聘报名流程&#xff0c;速速查收哦&#xff01;

基于灰狼优化算法优化支持向量机(GWO-SVM)时序预测

代码原理及流程 基于灰狼优化算法优化支持向量机&#xff08;GWO-SVM&#xff09;的时序预测代码的原理和流程如下&#xff1a; 1. **数据准备**&#xff1a;准备时序预测的数据集&#xff0c;将数据集按照时间顺序划分为训练集和测试集。 2. **初始化灰狼群体和SVM模型参数…

架构二。。

1、CAP 只能3选2 1&#xff09;一致性&#xff08;Consistency&#xff09; 客户每次读都是返回最新的写操作结果 2&#xff09;可用性&#xff08;Availability&#xff09; 非故障节点在合理的时间内返回合理的响应 3&#xff09;分区容忍性&#xff08;Partition Tolerance…

代码随想录学习Day 36

46.携带研究材料 题目链接 讲解链接 动规五部曲&#xff1a; 1.dp数组及其下标含义&#xff1a;dp[i][j] 表示从下标为[0-i]的物品里任意取&#xff0c;放进容量为j的背包&#xff0c;价值总和最大是多少。如图所示&#xff1a; 2.确定递推公式&#xff1a; 从物品i是否放进…

MobaXterm:Network error: Connection refused

问题描述 使用MobaXterm连接服务器或者虚拟机里面的操作系统显示“Network error: Connection refused” 因为服务器或者虚拟机里面的操作系统没安装 ssh 解决方法 安装ssh sudo apt-get update sudo apt-get upgrade sudo apt-get install ssh重启 ssh service ssh resta…

Docker配置国内镜像源

添加Docker国内镜像源 在/etc/docker/daemon.json文件中添加以下内容&#xff1a; {"registry-mirrors": ["http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn","https://registry.docker-cn.com"] }重启docker s…

UTONMOS:元宇宙超越现实的游戏新境界

当现实世界的边界被逐渐突破&#xff0c;元宇宙游戏如同一扇通往奇幻世界的大门&#xff0c;缓缓向我们敞开。 元宇宙游戏&#xff0c;是数字世界与现实世界的完美融合&#xff0c;它为我们带来了前所未有的游戏体验。在这个虚拟的宇宙中&#xff0c;你可以自由翱翔&#xff0…