当前位置: 首页 > news >正文

Linux高并发服务器开发 第十七天(管道缓存区查询大小 管道的优劣 命名管道mkfifo 建立释放映射区mmap/munmap 匿名映射 进程间的通信)

目录

1.pipe管道读写行为

1.1例题:实现父子进程 ls | wc -l

1.2兄弟进程 ls | wc -l

2.管道缓存区

2.1命令查询

2.2函数查询

3.pipe管道的优劣

4.命名管道 fifo

5.mmap

5.1文件进程间通信

5.2建立、释放映射区

5.3匿名映射

6.进程间通信

6.1父子进间通信

6.2无血缘关系进程间通信


1.pipe管道读写行为

- 读管道:

    1. 管道有数据, read返回实际读到的字节数。

    2. 管道无数据,1)无写端,read 返回 0 (类似读到文件末尾)

        ​                       2)有写端,阻塞等待。

- 写管道:

    1. 无读端,异常终止。 ( SIGPIPE 信号)

    2. 有读端,1)管道已满,阻塞等待。

        ​                2)管道未满,返回实际写出的字节数。

1.1例题:实现父子进程 ls | wc -l

父进程执行 ls 命令并将其输出写入管道,子进程执行 wc -l 并从管道读取输入

int main(int argc, char *argv[])
{pid_t pid;int fd[2];// 先创建pipepipe(fd);pid = fork();            // ls | wc -lif (pid == 0) {  // 子进程 实现 wc -lclose(fd[1]);        // 子进程读管道,关闭写端.dup2(fd[0], STDIN_FILENO);        // 让 wc 从管道的读端,读数据.execlp("wc", "wc", "-l", NULL);} else if (pid > 0) {close(fd[0]);        // 父进程写管道,关闭读端.dup2(fd[1], STDOUT_FILENO);// 将 写出到 屏幕的ls 结果,写入到 管道写端.execlp("ls", "ls", NULL);}return 0;
}

1.2兄弟进程 ls | wc -l

int main(int argc, char *argv[])
{int fd[2], i = 0;pid_t pid;pipe(fd);for (i = 0; i < 2; i++)if ((pid = fork()) == 0) {break;}if (i == 0) {        // 兄        lsclose(fd[0]);dup2(fd[1], STDOUT_FILENO);execlp("ls", "ls", NULL);} else if (i == 1) {        // 弟    wc -lclose(fd[1]);dup2(fd[0], STDIN_FILENO);execlp("wc", "wc","-l",NULL);} else {        // 父close(fd[0]);// 父进程不参与管道使用,应该关闭写端、读端。保证管道内部数据单向流动。close(fd[1]);for (i = 0; i<2; i++)wait(NULL);}return 0;
}

2.管道缓存区

2.1命令查询

2.2函数查询

    long fpathconf(int fd, int name);
    参1 :传 fd[0]/fd[1] 都可以!
    参2 :传 _PC_PIPE_BUF 宏

3.pipe管道的优劣

- 优点:简单。比信号、套接字、mmap 简单很多!
- 缺点:
    1. 只能单向通信,实现双向通信,需要两个管道。
    2. 只能应用于父子、兄弟...(有公共祖先)进程间。无血缘关系进程间,后来用 fifo 替代。

4.命名管道 fifo

- 命令创建:mkfifo 管道名

- 函数创建:

//可以用于无血缘关系进程间通信  

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

—— 演示代码:fifo_w.c   fifo_r.c
- 管道中的数据,一次性读取,读走没。
- 读端:以 O_RDONLY 打开 fifo 管道。
- 写端:以 O_WRONLY/O_RDWR 打开同一个 fifo 管道。

5.mmap

5.1文件进程间通信

- 有血缘关系、无血缘关系的进程,都可以使用同一个文件来实现进间通信。

5.2建立、释放映射区

- mmap 借助文件映射,创建共享内存映射区

#include <sys/mman.h>

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);


参数:
    addr:指定映射区的首地址。通常传NULL,表示让系统自动分配
    length:共享内存映射区的大小。(<=文件的实际大小。)
    prot:共享内存映射区的读写属性。PROT_READ、PROT_WRITE、PROT_READ|PROT_WRITE
    flags:标注共享内存映射区的共享属性:
            MAP_SHARED: 对共享内存所做的修改,会反应到物理磁盘文件上。 IPC专用!
            MAP_PRIVATE:对共享内存所做的修改,不会反应到物理磁盘文件上。
    fd: 用来创建共享内存映射区的那个文件的 文件描述符。
    offset:默认0,表示映射文件全部!偏移位置。必须是4k整数倍。
返回值:
    成功:映射区的首地址。
    失败:MAP_FAILED (void *(-1)), errno

- munmap  释放共享内存映射

int munmap(void *addr, size_t length);
参1:mmap() 函数的返回值。
参2:共享内存映射区大小
返回值:
    成功:0
    失败:-1, errno

mmap使用的注意事项:

1. 用于创建映射区的文件的大小,必须是非0。映射区的大小 <= 文件大小。
2. 创建映射区,需要read权限。指定访问权限为 MAP_SHARED, mmap需要读写权限。 应该 <= 文件打开权限。只写不行!
3. 文件描述符fd, 在mmap创建映射区完成,可以立即关闭!后续访问文件使用 内存地址。
4. offset 必须是 4096 的整数倍。(MMU映射的最小单位 4k)
5. 映射区访问的权限设为 MAP_PRIVATE, 对内存做的所有修改,都只在内存有效,不反应的磁盘上。不能应用于 IPC

mmap函数保险调用方式:

1. fd = open(“文件名”,O_RDWR);
2. mmap(NULL, 实际有效文件大小, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);

## mmap特性

- fifo、mmap 都可以应用于非血缘关系进程间通信。区别:
    - mmap:数据可以重复读写。
    - fifo:数据只能一次性读写。
- 直接操作内存,执行速度快!

5.3匿名映射

- 只能应用于,有血缘关系的进程间通信

p = (int *)mmap(NULL, 400, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0);

- MAP_ANONYMOUS 、MAP_ANON 只在 Linux 系统中有效。
- /dev/null : 设备文件。黑洞文件。特性:无限向该文件写数据。写入没!
- /dev/zero: 设备文件。特性:无限从该文件读取数据。读多少,有多少。读到的都是“\0”
- 类unix系统中没有 MAP_ANONYMOUS 、MAP_ANON 选项,可以借助 /dev/zero 实现。

 fd = open("/dev/zero", O_RDWR);p = mmap(NULL, size, PROT_READ|PROT_WRITE, MMAP_SHARED, fd, 0);

6.进程间通信

6.1父子进间通信

1. 父进程 先创建 映射区。 open(O_RDWR); mmap(MAP_SHARED);
2. fork() 创建子进程。
3. 一个进程使用 映射区读,另一个进程写。

6.2无血缘关系进程间通信

1. 两个进程,打开同一个文件,创建映射区。
2. 指定 flags 为 MAP_SHARED。
3. 一个进程使用 映射区读,另一个进程写。

相关文章:

Linux高并发服务器开发 第十七天(管道缓存区查询大小 管道的优劣 命名管道mkfifo 建立释放映射区mmap/munmap 匿名映射 进程间的通信)

目录 1.pipe管道读写行为 1.1例题&#xff1a;实现父子进程 ls | wc -l 1.2兄弟进程 ls | wc -l 2.管道缓存区 2.1命令查询 2.2函数查询 3.pipe管道的优劣 4.命名管道 fifo 5.mmap 5.1文件进程间通信 5.2建立、释放映射区 5.3匿名映射 6.进程间通信 6.1父子进间通…...

C语言常见概念

目录 第一个C语言程序 main函数 写法&#xff1a; printf和库函数 printf()函数 库函数 关键字 字符和ASCII码表 字符串和\0 转义字符 语句 注释 注释的两种形式 第一个C语言程序 #include<stdio.h>//第一个c语言程序 int main() {printf("Hello World…...

AI代码生成器如何重塑前端开发的工作环境

近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术迅猛发展&#xff0c;深刻地改变着各行各业的工作方式。在软件开发领域&#xff0c;AI写代码工具的出现更是掀起了一场革命&#xff0c;尤其对前端开发工程师的工作环境和协作方式产生了深远的影响。本文将深入探讨AI…...

设计模式-结构型-外观模式

在软件开发中&#xff0c;随着功能的不断迭代&#xff0c;系统会变得越来越复杂&#xff0c;模块之间的依赖关系也会越来越深。这种复杂性会导致代码难以理解、维护和扩展。而外观模式&#xff08;Facade Pattern&#xff09;正是为了解决这一问题而生的。 一、外观模式简介 …...

8.flask+websocket

http是短连接&#xff0c;无状态的。 websocket是长连接&#xff0c;有状态的。 flask中使用websocket from flask import Flask, request import asyncio import json import time import websockets from threading import Thread from urllib.parse import urlparse, pars…...

ARM Cortex-M3/M4 权威指南 笔记【二】架构

一、架构 1.1 架构简介 Cortex-M3/M4 处理器都基于 ARMv7-M 架构。最初的 ARMv7-M 架构是随着 Cortex-M3 处理器一同引入的&#xff0c;而在 Cortex-M4 发布时&#xff0c;架构中又额外增加了新的指令和特性&#xff0c;改进后的架构有时也被称为 ARMV7E-M。要了解 ARM7-M 和…...

HCIA项目实践--静态路由的拓展配置

7.7 静态路由的拓展配置 网络中的两个重要思想&#xff1a; &#xff08;1&#xff09; 实的不行来虚的&#xff1b; &#xff08;2&#xff09; 范围太大&#xff0c;划分范围。&#xff08;分治&#xff09; 7.7.1 负载均衡 &#xff08;1&#xff09;定义 负载均衡是一种网…...

STL中list的模拟实现

文章目录 1. 前言and框架2. 相对完整的框架3. 模拟实现接口1. 迭代器的引入2. 迭代器的区分list迭代器迭代器的构造list迭代器的实现模拟指针解引用前置和前置--后置和--迭代器&#xff01;迭代器-> list的const迭代器迭代器模板迭代器是否需要析构&#xff0c;拷贝构造&…...

计算机网络知识速记:HTTP1.0和HTTP1.1

计算机网络知识速记&#xff1a;HTTP1.0和HTTP1.1 1. 基本概念 1.1 HTTP1.0 HTTP1.0是1996年发布的第一个正式版本&#xff0c;主要用于客户端与服务器之间的简单请求和响应交互。它的设计理念相对简单&#xff0c;适合处理一些基本的网页服务。 1.2 HTTP1.1 HTTP1.1是HTT…...

Apache Kafka 中的认证、鉴权原理与应用

编辑导读&#xff1a;本篇内容将进一步介绍 Kafka 中的认证、鉴权等概念。AutoMQ 是与 Apache Kafka 100% 完全兼容的新一代 Kafka&#xff0c;可以帮助用户降低 90%以上的 Kafka 成本并且进行极速地自动弹性。作为 Kafka 生态的忠实拥护者&#xff0c;我们也会持续致力于传播 …...

DeepSeek自然语言处理(NLP)基础与实践

自然语言处理(Natural Language Processing, NLP)是人工智能领域的一个重要分支,专注于让计算机理解、生成和处理人类语言。NLP技术广泛应用于机器翻译、情感分析、文本分类、问答系统等场景。DeepSeek提供了强大的工具和API,帮助我们高效地构建和训练NLP模型。本文将详细介…...

激光工控机在精密制造中的应用与优势

在精密制造中&#xff0c;激光工控机可以用于许多场景例如 激光切割与雕刻&#xff1a;用于金属、塑料、陶瓷等材料的精密切割和雕刻&#xff0c;适用于汽车、航空航天、电子等行业&#xff1b;可实现复杂图案和高精度加工&#xff0c;满足微米级精度要求。 激光焊接&#xf…...

Docker换源加速(更换镜像源)详细教程(2025.2最新可用镜像,全网最详细)

文章目录 前言可用镜像源汇总换源方法1-临时换源换源方法2-永久换源&#xff08;推荐&#xff09;常见问题及对应解决方案1.换源后&#xff0c;可以成功pull&#xff0c;但是search会出错 补充1.如何测试镜像源是否可用2.Docker内的Linux换源教程 换源速通版&#xff08;可以直…...

12.14 算法练习

1. 每日温度 算法思路 1. 单调栈的作用&#xff1a;记录我们遍历过的元素&#xff0c;与当前的元素方便对比&#xff0c;本质是以空间换时间&#xff1b; 2. 比较当前元素与栈顶元素的大小&#xff0c;当当前元素大于栈顶元素时&#xff0c;持续弹出栈顶元素下标&#xff0c;…...

ASP.NET Core SignalR的分布式部署

假设聊天室程序被部署在两台服务器上&#xff0c;客户端1、2连接到了服务器A上的ChatRoomHub&#xff0c;客户端3、4连接到服务器B上的ChatRoomHub&#xff0c;那么客户端1发送群聊消息时&#xff0c;只有客户端1、2能够收到&#xff0c;客户端3、4收不到&#xff1b;在客户端3…...

Express 中间件

在构建 Web 应用程序时&#xff0c;中间件&#xff08;Middleware&#xff09;扮演着至关重要的角色。它允许你定义一系列的函数来处理 HTTP 请求和响应过程中的各种任务。Express.js 是 Node.js 上最流行的框架之一&#xff0c;以其简洁且强大的中间件机制著称。本文将深入探讨…...

ABB能源自动化选用宏集Cogent DataHub避免DCOM问题,实现高效、安全的数据传输

案例概况 ABB能源自动化公司通过宏集Cogent DataHub软件将电厂设施的数据实时传输到公司办公室&#xff0c;实现了OPC隧道/镜像解决方案&#xff0c;在电厂和公司网络之间建立了一个安全、可靠的连接&#xff0c;确保数据传输的高度安全&#xff0c;减少入侵风险。 &#xff0…...

springboot239-springboot在线医疗问答平台(源码+论文+PPT+部署讲解等)

&#x1f495;&#x1f495;作者&#xff1a; 爱笑学姐 &#x1f495;&#x1f495;个人简介&#xff1a;十年Java&#xff0c;Python美女程序员一枚&#xff0c;精通计算机专业前后端各类框架。 &#x1f495;&#x1f495;各类成品Java毕设 。javaweb&#xff0c;ssm&#xf…...

【Elasticsearch】分析器的构成

在Elasticsearch中&#xff0c;分析器&#xff08;Analyzer&#xff09;是一个处理文本数据的管道&#xff0c;它将输入的文本转换为一系列词元&#xff08;tokens&#xff09;&#xff0c;并可以对这些词元进行进一步的处理和规范化。分析器由以下三个主要组件构成&#xff1a…...

Python 调用 Azure OpenAI API

在人工智能和机器学习快速发展的今天,Azure OpenAI 服务为开发者提供了强大的工具来集成先进的 AI 能力到他们的应用中。本文将指导您如何使用 Python 调用 Azure OpenAI API,特别是使用 GPT-4 模型进行对话生成。 准备工作 在开始之前,请确保您已经: 拥有一个 Azure 账户…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...

comfyui 工作流中 图生视频 如何增加视频的长度到5秒

comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗&#xff1f; 在ComfyUI中实现图生视频并延长到5秒&#xff0c;需要结合多个扩展和技巧。以下是完整解决方案&#xff1a; 核心工作流配置&#xff08;24fps下5秒120帧&#xff09; #mermaid-svg-yP…...

高分辨率图像合成归一化流扩展

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 1 摘要 我们提出了STARFlow&#xff0c;一种基于归一化流的可扩展生成模型&#xff0c;它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流&#xff08;TARFlow&am…...

深入解析光敏传感技术:嵌入式仿真平台如何重塑电子工程教学

一、光敏传感技术的物理本质与系统级实现挑战 光敏电阻作为经典的光电传感器件&#xff0c;其工作原理根植于半导体材料的光电导效应。当入射光子能量超过材料带隙宽度时&#xff0c;价带电子受激发跃迁至导带&#xff0c;形成电子-空穴对&#xff0c;导致材料电导率显著提升。…...

aurora与pcie的数据高速传输

设备&#xff1a;zynq7100&#xff1b; 开发环境&#xff1a;window&#xff1b; vivado版本&#xff1a;2021.1&#xff1b; 引言 之前在前面两章已经介绍了aurora读写DDR,xdma读写ddr实验。这次我们做一个大工程&#xff0c;pc通过pcie传输给fpga&#xff0c;fpga再通过aur…...

Pandas 可视化集成:数据科学家的高效绘图指南

为什么选择 Pandas 进行数据可视化&#xff1f; 在数据科学和分析领域&#xff0c;可视化是理解数据、发现模式和传达见解的关键步骤。Python 生态系统提供了多种可视化工具&#xff0c;如 Matplotlib、Seaborn、Plotly 等&#xff0c;但 Pandas 内置的可视化功能因其与数据结…...