进程间通信II·命名管道

article/2025/6/16 6:50:14

目录

原理

创建过程

特性

代码练习

客户端与服务端交互

小知识


原理

原理:两个进程各自的struct file 指向相同的inode和文件缓冲区(这里的inode和文件缓冲区也应用了引用计数)。

命名管道创建的是磁盘上的一种不刷新数据到缓冲区的常规文件,也就是管道文件,以p作为开头的。

创建过程

mkfifo 创建管道文件

1.pathname是文件名(可加路径,在指定路径下创建),mode是权限。

2.成功返回0,失败返回-1,然后errno 变量会被设置为相应的错误码,以指示具体的错误原因。

unlink 删除文件

1.它是rm的底层系统调用。

以上两个命令都可以在命令行中使用。

在命令后直接加选项和文件名即可。

特性

和匿名管道的四种情况相同

1.写端不关,写端不写 管道里没有数据,读端会被阻塞(造就同步机制)


2.读端不关,读端不读 写满了(64kb,65536字节)就不会再写了


3.读端不关,写端先关 读端返回值会为0,表示读到文件结尾


4.写端不关,读端先关 OS会自动杀掉写进程,通过发送13号信号

主要用来解决无血缘关系的进程间的文件级进程通信

代码练习

客户端与服务端交互

main.hpp

#pragma once

#include <iostream>

#include <string>

#include <unistd.h>

#include <fcntl.h>

#include <sys/types.h>

#include <sys/stat.h>

using namespace std;

const string fifoname = "fifo";

mode_t mode = 0777;

#define ERR_EXIT(s)\

do{\

    perror(s);\

    exit(EXIT_FAILURE);\

}while(0)

client.cpp

#include "main.hpp"


 

int main()

{

    int fifofd = open(fifoname.c_str(),O_WRONLY);

    if(fifofd<0)

    {

        ERR_EXIT("open");

    }

    string tmp;

    while(1)

    {

        cout<<"请写入:";

        cin>>tmp;

        ssize_t writeret = write(fifofd,tmp.c_str(),tmp.size());

        if(writeret<0)

        {

            ERR_EXIT("write");

        }

        cout<<"写入中:please wait!"<<endl;

        tmp.clear();

        sleep(0.2);

    }

    close(fifofd);

    return 0;

}

server.cpp

#include "main.hpp"

int main()

{

    umask(0);

    int fiforet = mkfifo(fifoname.c_str(),mode);

    if(fiforet<0)

    {

        ERR_EXIT("mkfifo");

    }

    int fifofd = open(fifoname.c_str(),O_RDONLY);

    if(fifofd<0)

    {

        ERR_EXIT("open");

    }

    char buff[1024] = {'\0'};

    while(1)

    {

        cout<<"读取中,please wait!"<<endl;

        ssize_t readret = read(fifofd,buff,sizeof(buff)-1);

        if(readret<0)

        {

            ERR_EXIT("read");

        }

        else if(readret==0)

        {

            cout<<"关闭\n";

            exit(0);

        }

        buff[readret] = '\0';

        cout<<buff<<endl;

        sleep(0.2);

    }

    close(fifofd);

    unlink(fifoname.c_str());

    return 0;

}

Makefile

.PHONY:all

all:server client

server:server.cpp

    g++ -o $@ $^ -std=c++11

client:client.cpp

    g++ -o $@ $^ -std=c++11

.PHONY:clean

clean:

    rm -rf client server    

    unlink fifo

小知识

1.删除数据时一般不是将属性和数据清空,而是将空间“释放”,将属性和数据标记为无效。


2..类型用来表明对象的大小,因为取地址时取到的都是首地址,加上对象大小才得到整个对象空间。


http://www.hkcw.cn/article/ywuJEywoTu.shtml

相关文章

Redis--缓存工具封装

经过前面的学习&#xff0c;发现缓存中的问题&#xff0c;无论是缓存穿透&#xff0c;缓存雪崩&#xff0c;还是缓存击穿&#xff0c;这些问题的解决方案业务代码逻辑都很复杂&#xff0c;我们也不应该每次都来重写这些逻辑&#xff0c;我们可以将其封装成工具。而在封装的时候…

ZC-OFDM雷达通信一体化减小PAPR——选择性映射法(SLM)

文章目录 前言一、SLM 技术1、简介2、原理 二、MATLAB 仿真1、核心代码2、仿真结果 三、资源自取 前言 在 OFDM 雷达通信一体化系统中&#xff0c;信号的传输由多个子载波协同完成&#xff0c;多个载波信号相互叠加形成最终的发射信号。此叠加过程可能导致信号峰值显著高于其均…

ESP32-idf学习(四)esp32C3驱动lcd

一、前言 屏幕是人机交互的重要媒介&#xff0c;而且现在我们产品升级的趋势越来越高大尚&#xff0c;不少产品都会用lcd来做界面&#xff0c;而esp32c3在一些项目上是可以替代主mcu&#xff0c;所以驱动lcd也是必须学会的啦 我新买的这块st7789&#xff0c;突然发现是带触摸…

Remote Sensing投稿记录(投稿邮箱写错、申请大修延期...)风雨波折投稿路

历时近一个半月&#xff0c;我中啦&#xff01; RS是中科院二区&#xff0c;2023-2024影响因子4.2&#xff0c;五年影响因子4.9。 投稿前特意查了下预警&#xff0c;发现近五年都不在预警名单中&#xff0c;甚至最新中科院SCI分区&#xff08;2025年3月&#xff09;在各小类上…

ZC-OFDM雷达通信一体化减小PAPR——部分传输序列法(PTS)

文章目录 前言一、PTS 技术1、简介2、原理 二、MATLAB 仿真1、核心代码2、仿真结果 三、资源自取 前言 在 OFDM 雷达通信一体化系统中&#xff0c;信号的传输由多个子载波协同完成&#xff0c;多个载波信号相互叠加形成最终的发射信号。此叠加过程可能导致信号峰值显著高于其均…

第6章 放大电路的反馈

本章基本要求 会判&#xff1a;判断电路中有无反馈及反馈的性质 会算&#xff1a;估算深度负反馈条件下的放大倍数 会引&#xff1a;根据需求引入合适的反馈 会判振消振&#xff1a;判断电路是否能稳定工作&#xff0c;会消除自激振荡。 6.1 反馈的概念及判断 一、反馈的…

知识管理五强对比:Baklib高效突围

Baklib核心技术优势 Baklib的底层技术架构以知识中台为核心&#xff0c;深度融合自然语言处理&#xff08;NLP&#xff09;与分布式存储技术&#xff0c;实现多源异构数据的统一纳管。其智能分类引擎通过语义理解自动关联碎片化文档&#xff0c;结合动态标签体系与多维度权限控…

电机驱动器辐射骚扰整改

定位低压DC部分的骚扰源&#xff08;排除法&#xff09;&#xff1a; 为确定是电源哪部分出现问题&#xff0c;可以采取如下步骤进行验证&#xff1a; a.将12V转5V的芯片去掉&#xff0c;仅剩12V器件工作&#xff0c;然后测试&#xff1b; b.将5V转3.3V和隔离5V的芯片去掉&am…

CTFHub-RCE 命令注入-过滤空格

观察源代码 代码里面可以发现过滤了空格 判断是Windows还是Linux 源代码中有 ping -c 4 说明是Linux 查看有哪些文件 127.0.0.1|ls 打开flag文件 我们尝试将空格转义打开这个文件 利用 ${IFS} 127.0.0.1|cat${IFS}flag_195671031713417.php 可是发现 文本内容显示不出来&…

2022年 中国商务年鉴(excel电子表格版)

2022年 中国商务年鉴&#xff08;excel电子表格版&#xff09;.ziphttps://download.csdn.net/download/2401_84585615/89772883 https://download.csdn.net/download/2401_84585615/89772883 《中国商务年鉴2022》是由商务部国际贸易经济合作研究院主办的年度统计资料&#xf…

家长速查!3岁男童误吞“水精灵”危及生命

给孩子挑选放心的玩具是不少家长群讨论的热点。“小玩具”关乎“大安全”,如何帮助孩子远离“毒”“危”玩具?怎样合理选购、安全使用,让玩具成为孩子的益友?“六一”国际儿童节前夕,记者就此进行了走访。“毒”“危”玩具有何隐患?“本月我们又接诊了一名3岁男童误吞‘水…

划龙舟有多拼 鼓点一响全员开挂 岭南文化盛宴

广东龙舟不仅是一种仪式,更是一种文化符号。每一声鼓点都充满了热血与奋进,每一次冲刺都体现了拼搏与荣光。“下水!起桨!”有着20多年“龙舟龄”的东莞万江街道龙舟划手黄柱良,为了近日在东江江面举行的龙舟趁景活动,和伙伴们准备了1个多星期。活动当天上午,黄柱良和其他…

大巴黎如何拿到2025年欧冠的 战术转型与团队足球

2025年6月1日凌晨,2024-2025赛季欧冠决赛在慕尼黑安联球场举行,巴黎圣日耳曼以5-0大胜国际米兰,队史首次夺得欧冠奖杯。这场胜利不仅终结了巴黎多年来的“欧冠魔咒”,也标志着球队在姆巴佩离队后的战术转型取得巨大成功。比赛期间,大巴黎主帅恩里克延续了本赛季后半段的43…

thinkpad T-440p 2025.05.31

thinkpad T-440p 2025.05.31 老了退休了&#xff0c;说起来真的可恶现在笔记本的设计师&#xff0c;只有固态硬盘了

堆与堆排序及 Top-K 问题解析:从原理到实践

一、堆的本质与核心特性 堆是一种基于完全二叉树的数据结构&#xff0c;其核心特性为父节点与子节点的数值关系&#xff0c;分为大堆和小堆两类&#xff1a; 大堆&#xff1a;每个父节点的值均大于或等于其子节点的值&#xff0c;堆顶元素为最大值。如: 小堆&#xff1a;每个…

【题解-洛谷】P8094 [USACO22JAN] Cow Frisbee S

题目&#xff1a;P8094 [USACO22JAN] Cow Frisbee S 题目描述 Farmer John 的 N ( N ≤ 3 10 5 ) N\ (N\le 3\times 10^5) N (N≤3105) 头奶牛的高度为 1 , 2 , … , N 1, 2, \ldots, N 1,2,…,N。一天&#xff0c;奶牛以某个顺序排成一行玩飞盘&#xff1b;令 h 1 … h …

如何利用差分隐私技术在医疗领域守护患者隐私

在数字化医疗快速发展的当下&#xff0c;医疗数据已然成为一座蕴藏无限价值的宝库。一份完整的电子病历&#xff0c;不仅记录着患者的疾病诊断、治疗记录&#xff0c;还可能包含基因数据、生活习惯等敏感信息&#xff1b;而基因检测报告中携带的遗传密码&#xff0c;更是与个人…

Kanass入门教程- 事项管理

kanass是一款国产开源免费、简洁易用的项目管理工具&#xff0c;包含项目管理、项目集管理、事项管理、版本管理、迭代管理、计划管理等相关模块。工具功能完善&#xff0c;用户界面友好&#xff0c;操作流畅。本文主要介绍事项管理使用指南。 1、添加事项 事项有多种类型 分…

主人回应狗王“长毛”爆火 小狗成网红引来百万关注

近日,河北承德一只下司犬“长毛”的视频在外网爆火。视频中,“长毛”凭借威严的姿态让闹事的狗狗臣服。因此小狗被外国网友取名“查理国王”“狗王”等称号,连小狗的肖像都被印在T恤上作为周边售卖。火爆全网的狗王“长毛”。网络截图网友们纷纷表达了自己的惊叹与崇拜:“阿…

描述性统计的可视化分析

初步研究数据的分布时&#xff0c;最直观的方法就是可视化分析了。 1. 直方图 直方图&#xff08;histogram&#xff09;出现得很早&#xff0c;而且应用广泛。 直方图是以一种图形方法来概括给定数值X的分布情况的图示。 如果X是离散的变量&#xff0c;比如股票类型&#xf…