【Linux】Linux进程通信核心技能:搞懂命名管道,轻松了解无血缘进程通信难题!

【Linux】Linux进程通信核心技能:搞懂命名管道,轻松了解无血缘进程通信难题!
前言:欢迎各位光临本博客,这里小编带你直接手撕,文章并不复杂,愿诸君**耐其心性,忘却杂尘,道有所长!!!!
在这里插入图片描述

IF’Maxue个人主页
 🔥 个人专栏:
《C语言》
《C++深度学习》
《Linux》
《数据结构》
《数学建模》

⛺️生活是默默的坚持,毅力是永久的享受。不破不立!

文章目录

我推荐各位大佬在看这篇这张之前先对匿名管道有一个大致的了解,因为这节内容是基于匿名管道来的,是基这里我给大佬们两个链接,帮助佬们更好的找到匿名管道的知识点!!!

MAXUE的匿名管道:https://blog.ZEEKLOG.net/wheeldown/article/details/152418393?spm=1001.2014.3001.5501

bangbang佬的匿名管道:https://blog.ZEEKLOG.net/bang___bang_/article/details/132128822

命名管道

1. 为什么需要命名管道?

我们知道,匿名管道有个关键局限——只能用于有血缘关系的进程(比如父进程和子进程)。那如果两个完全不相关的进程(比如两个独立启动的程序)需要通信,该怎么办?这就需要命名管道来解决。

2. 核心原理:从“文件共享”看懂命名管道

要理解命名管道,先搞懂一个底层问题:两个进程打开同一个文件,文件会在内存中加载两次吗?

image.png

答案是不会,因为操作系统设计时就遵循“不做无用功”的原则,具体逻辑如下:

  1. 进程A打开文件后,会生成一个专属的struct file结构体,里面包含文件的inode(索引节点)和文件缓冲区。
  2. 当进程B要打开同一个文件时,会生成自己的struct file(因为两个进程的读写位置可能不同),但它的inode和文件缓冲区会直接指向进程A的对应地址,不会重复加载。

下面的流程图清晰展示了这个过程:

image.png

从这个过程能发现命名管道的本质:

  • 两个进程通过“打开同一路径下的同一个文件”,共享同一份资源
  • 因为这个“路径”有唯一的名字,所以这种管道被称为“命名管道”。
  • 如果你已经懂了匿名管道的原理,理解命名管道会更轻松。

另外,命名管道对应的“管道文件”有个特性:仅用于进程间通信,只会被打开使用,无需像普通文件那样刷新数据

image.png

3. Linux命令:创建命名管道

在Linux命令行中,用mkfifo命令就能创建命名管道,步骤如下:

  1. 命令格式:mkfifo + 命名管道的名字
  2. 示例:输入mkfifo fifo,就能创建一个名为fifo的命名管道。

创建后,用ll命令查看目录,会发现多了一个fifo文件,它的权限前缀是p——这个p就代表“管道文件”,说明创建成功了。

image.png

4. 命名管道代码示例

下面的代码仅为演示核心逻辑,方便理解,不代表完整的工业级代码。要在代码中创建命名管道,首先得了解mkfifo接口——可以通过man mkfifo命令查看接口详情。

image.png

4.1 代码创建命名管道(写方式打开)

以下代码演示如何创建命名管道,并以“写”的方式打开,向管道中写入数据:

image.png
#include<iostream>#include<fcntl.h>#include<unistd.h>#include<sys/stat.h>#include<sys/types.h>#defineFIFO_FILE"fifo"intmain(){// 创建命名管道int ret =mkfifo(FIFO_FILE,0666);if(ret ==-1){perror("mkfifo");return1;} std::cout <<"fifo created success"<< std::endl;// 以写方式打开管道int fd =open(FIFO_FILE, O_WRONLY);if(fd ==-1){perror("open");return1;} std::cout <<"open fifo success, write..."<< std::endl;// 向管道写入数据constchar* msg ="hello named pipe";write(fd, msg,sizeof(msg));// 关闭文件描述符close(fd);return0;}

运行后的结果如下,能看到数据成功写入管道:
注意打开的时候要client和sever都打开

image.png

4.2 代码读取命名管道数据

以下代码演示如何以“读”的方式打开命名管道,读取管道中的数据:

{ std::cerr <<"open fifo error"<< std::endl;return2;}char buffer[1024];while(true){int n =read(fd, buffer,sizeof(buffer)-1);if(n >0){ buffer[n]=0; std::cout <<"client say# "<< buffer << std::endl;}}close(fd);return0;}

到这里这只是一个演示,以上是命名管道的理论基础,完整的模拟代码会在下一期出!!!!

Read more

Linux下安装Docker

目录 1. 确定Linux版本 2.卸载旧版本Docker(可选) 3.安装必要的依赖 4.添加Docker仓库 5.配置 Docker 镜像源(推荐使用阿里云) 6.安装 Docker Engine 7.启动并设置开机自启 8.验证 Docker 安装是否成功 1. 确定Linux版本 新版本的Docker对Linux系统版本有一定的要求。如果Linux的发行版系统是centOS,安装最新版的docker需要centOS 9以上的系统。 ·在Docker安装帮助页面查看支持的系统版本。   Docker帮助页面:https://docs.docker.com/engine/install/centos/ # 查看当前版本 cat /etc/redhat-release 2.卸载旧版本Docker(可选) 如果您之前安装过Docker,建议先卸载旧版本以避免冲突。执行以下命令卸载旧版本的Docker:

By Ne0inhk
一文给傻子讲清网络中的 MAC 地址 是个啥东西

一文给傻子讲清网络中的 MAC 地址 是个啥东西

前言 书接上文的讲清网络名词https://blog.ZEEKLOG.net/m0_61763784/article/details/154519828?fromshare=blogdetail&sharetype=blogdetail&sharerId=154519828&sharerefer=PC&sharesource=m0_61763784&sharefrom=from_link 如果你对上文感兴趣并且看到了小结部分,你就会注意到,小结中有一段你比较陌生的一串字符 这里有一个MAC地址,那这个是什么东西呢?好,本章节就为大家讲解,MAC到底是个啥。 概念铺垫 由前文你应该已经了解了tcp/ip以及各大网络协议名词,还有网络信息流转的基本流程,那有人会好奇 为什么我都有一个IP地址了,我已经有了名字了,我为什么还要一个MAC地址呢? MAC相当于是每一个硬件设备的身份证,在这张身份证上标注了你是一个什么设备(单片机,电脑终端,路由器,

By Ne0inhk
Flutter 三方库 changelog_cli 的鸿蒙化适配指南 - 自动化生成 CHANGELOG、标准化版本管理与工程化协作利器

Flutter 三方库 changelog_cli 的鸿蒙化适配指南 - 自动化生成 CHANGELOG、标准化版本管理与工程化协作利器

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 changelog_cli 的鸿蒙化适配指南 - 自动化生成 CHANGELOG、标准化版本管理与工程化协作利器 前言 在 Flutter for OpenHarmony 的企业级开发流程中,维护一份详实、规范的更新日志(CHANGELOG)是版本控制的核心环节。changelog_cli 是一个专为 Flutter 开发者设计的命令行工具,它能够基于特定的规范自动生成或更新日志。本文将探讨如何将该工具集成到鸿蒙项目的开发流水线中,大幅提升工程化协作效率。 一、原理解析 / 概念介绍 1.1 基础原理 changelog_cli 通过读取项目的 pubspec.yaml 版本信息和特定的配置文件,配合开发者在命令行输入的更新内容,自动拼装成符合 Keep a Changelog 规范的

By Ne0inhk
Linux信号保存的核心:未决信号集与阻塞信号集——探秘内核如何实现信号的阻塞、暂存与派发

Linux信号保存的核心:未决信号集与阻塞信号集——探秘内核如何实现信号的阻塞、暂存与派发

🔥海棠蚀omo:个人主页                 ❄️个人专栏:《初识数据结构》,《C++:从入门到实践》,《Linux:从零基础到实践》                 ✨追光的人,终会光芒万丈 博主简介: 目录 一.信号保存相关的常见概念 二.信号在内核中的表示 三.信号集的具体操作 3.1sigset_t类型 3.2信号集操作函数 3.3 sigprocmask函数 3.4 sigpending函数 四.扩展知识 4.1问题一 4.2问题2 4.3问题3 前言: 我们前面在讲解信号产生的时候,说到进程在收到信号时可能并不会立即处理,既然不会处理那就要将信号保存起来,我们当时只简单讲解了在进程的PCB中会有一个位图来保存信号。 而我们今天就来详细探讨一下关于信号保存方面更为详细的知识。 一.信号保存相关的常见概念 1.实际执⾏信号的处理动作称为信号递达(Delivery)2.

By Ne0inhk