linux-内存映射MMAP-lseek-dup-fifo-通信-IO多路复用

1、内存映射MMap:

        DMA:

可以用*/[]取代read和write;

限制:

1、文件大小固定不能改变;(ftruncate)

2、只能是磁盘文件;

3、建立映射之前先open

mmap函数:

mmap第一个参数填空指针,分配映射空间时将自动分配到堆空间;分配区域首地址作为返回值返回,

length大小要固定;

prot表示内存是否可读可写;

prot的可选项:可以用按位或连接

flages:属性(MAP_SHARED(多进程共享映射区));

fd:映射的文件;(文件描述符)

offfset偏移量:0;(直接写0);

然后通过munmap释放;

该函数只有length和fd要改变;

代码实现通过mmap函数再内存中直接通过映射修改文件内容:

#include <43func.h>
int main(int argc, char *argv[]){
    ARGS_CHECK(argc,2);
    int fd = open(argv[1],O_RDWR);
     ERROR_CHECK(fd,-1,"open");
     int ret = ftruncate(fd,5);
     ERROR_CHECK(ret,-1,"ftruncate");
     char *p = (char *)mmap(NULL,5,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
    for (int  i = 0; i < 5; i++)
    {
        printf("%c",p[i]);

    }
    printf("\n");
    p[0] = 'H';
    p[1] = '1';
       for (int  i = 0; i < 5; i++)
    {
        printf("%c",p[i]);

    }
    munmap(p,5);
}

2、lseek:也可与诱发文件空洞

  • fd:文件描述符,指向要操作的文件。
  • offset:相对于whence的偏移量,可以是正数也可以是负数。
  • whence:偏移量的起始位置,它可以是以下常量之一:
    • SEEK_SET:文件的开头。
    • SEEK_CUR:当前的读写位置。
    • SEEK_END:文件的末尾。

内核态和用户态各有一个缓冲区,lseek修改内核态,而fseek修改用户态;

3、文件流也使用了文件对象:

int fileno():传入一个文件流指针则返回一个文件描述符;

用户,库作者,接口的关系:

        用户通过接口与系统进行交互,而库作者通过API提供库的功能和服务。接口和API是连接用户和库作者的桥梁。

为了降低耦合性,库作者把库代码进行封装,提供接口给用户;所以用户通过接口访问库;

代码即注释:

用有意义的符号取代固定的数字:


3、文件描述符的复制 dup

数值不同,偏移量共享

dup();选择一个最小可用的fd和oldfd同指向;

查看stdin,stdout,stderr的文件描述符

使用printf本质上往stdout写入数据;

printf对应的文件描述符为1:

往1号文件写入数据相当于往标准输出中写入数据;

遵循代码即注释原则:用STDERR_FILENO代替1

当文件通过close关闭标准输出时,再次用printf就相当于往重定向;

先打开open,还需要重定向文件描述符;可以使用dup();


用dup复制的文件描述符时,新的文件描述符和旧的文件描述符都共享同一个指针,(一个文件描述符写了,另一个接着写);

当关闭oldfd时,还可以继续用newfd进行操作;当文件描述符完全关闭后才会释放文件对象。

这种设计允许进程在需要时复制文件描述符,并在不同的线程或进程间传递它们,而不会导致底层资源的立即释放。(引用计数)

引用计数

是指将资源(如对象、内存或磁盘空间等)的被引用次数保存起来,当被引用次数变为零时,系统将自动释放该资源的过程。


重定向到目标文件:

先打开文件再把标准输出重定向到文件里;

重定向到testFile,当关闭标准输出时printf失效,把printf对应的输出对象改成了testFile;


从目标文件重定向回自定义目标:

int dup2(int oldfd,int newfd);

让newfd与oldfd指向同一个文件对象;

如果newfd已有指向就会自动close;

通过把dup2把标准输出的文件描述符改成savefd,再把标准输出的屏幕对象改成文件对象,最后再改回来,把屏幕定向到文件,再恢复;


4、有名管道(name pip / FIFO):先进先出;

进程间通信机制在文件系统的映射;

通信的传输方式:

单工:A->B

半双工:A->B    ,  B->A  不同时 (管道至少是半双工通信)

全双工:A<-------->B

mkfifo :创建管道

.

mkfifo  1.pip

管道不能存数据,只能暂存,不能持续存储;不能用vim打开


管道的半双工通信:用两个终端展示(右边取出数据,左边取消阻塞,把左边进程的数据传输到右边进程)

先读取数据,没有数据会进程阻塞,先传输,没有读也会阻塞;


用系统调用操作管道:

半双工通信管道

open:O_WRONLY(写端)

        O_RDONLY(读端)

(用open打开写端或读端);

管道实在open的时候阻塞的。当一个进程open管道一端的时候,进程处于阻塞状态,如果对端未被打开,进程处于阻塞状态,直到对端被另一个进程打开;(半双工通信)


全双工通信:(使用两个管道实现)
死锁的产生:

错误示范:

chat1 打开1pipe的读在等待chat2 在1pipe的写;

chat2 打开2pipe的写在等待chat2 在2pipe的读;

进入循环等待状态,产生死锁;占用资源的顺序出现了问题(调整顺序解决);

全双工通信:

        

通过死循环实现一直通信;

该程序只能实现一问一答:要等回复后才能看到下一条问题;

死循环读管道,读stdin,(目前代码给了固定的相应的读取顺序)

当B一直发,B的标准输入会堆积数据,但是A没有回复数据;

read fdr 和read stdin 存在先后顺序;(两个read的动作都会阻塞)

后面的数据就绪,但前面的程序阻塞了;数据串联(一个阻塞全部阻塞);

程序采用了一个阻塞式的读取循环,每次从管道读取数据并打印,然后清空缓冲区,接着从标准输入(STDIN_FILENO)读取数据并写入管道。问题在于,当从标准输入读取数据时,程序会阻塞直到有数据可读。这意味着,如果另一进程已经发送了第二条消息到管道中,但是当前进程没有从标准输入读取任何数据,那么它就不会处理管道中的第二条消息。

IO多路复用:(现代服务器的基础)

采用数据并联解决;


select:

fd_set : 监听集合;   

#include <sys/select.h>  
#include <sys/time.h>  
  
int select(int nfds, fd_set *readfds, fd_set *writefds,  
           fd_set *exceptfds, struct timeval *timeout);
  • nfds:这是一个整数值,指定了被监听的文件描述符集合中最大文件描述符值加 1。通常,它会被设置为集合中最大文件描述符的加一。
  • readfds:指向一个文件描述符集合的指针,该集合中的文件描述符被监视以检查是否可读。
  • writefds:指向一个文件描述符集合的指针,该集合中的文件描述符被监视以检查是否可写。
  • exceptfds:指向一个文件描述符集合的指针,该集合中的文件描述符被监视以检查是否有异常条件待处理。
  • timeout:指向一个 timeval 结构的指针,该结构指定了 select 的超时时间。如果设置为 NULL,则 select 会无限期地等待,直到某个文件描述符就绪。

fd_set 类型是一个位掩码,用于存储多个文件描述符的状态。在调用 select 之前,程序会使用如 FD_ZEROFD_SETFD_CLR 和 FD_ISSET 等宏来操作这些集合。

(1)创建监听集合

(2)设置合适的监听:FD_ZERO(清空)    FD_SET(加入监听){把会阻塞的文件描述符加入到监听}

(3)调用select函数,会让进程阻塞;

(4)当监听的文件描述符fd中有任何一个就绪时则select就绪;

(5)轮流询问(轮询)所有监听的fd是否就绪,FD_ISSET(询问)

使用IO多路复用实现进程之间聊天;

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

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

相关文章

SpringMVC启动流程

文章目录 引文HandlerHandlerMapperHandlerAdapterRequestMapping方法参数解析RequestMapping方法返回值解析文件上传流程拦截器解析 SpringMVC启动流程如下 引文 我们在使用SpringMVC时&#xff0c;传统的方式是在webapp目录下定义一个web.xml文件&#xff0c;比如&#xff1a…

npm安装依赖报错——npm ERR gyp verb cli的解决方法

1. 问题描述 1.1 npm安装依赖报错——npm ERR! gyp verb cli npm MARN deprecated axiosQ0.18.1: critical security vuLnerability fixed in v0.21.1. For more information, npm WARN deprecated svg001.3.2: This SVGO version is no Longer supported. upgrade to v2.x.x …

秋招突击——第七弹——Redis快速入门

文章目录 引言Redis是什么 正文对象String字符串面试重点 List面试考点 压缩列表ZipList面试题 Set面试题讲解 Hash面试重点 HASHTABLE底层面试考点 跳表面试重点 ZSET有序链表面试重点 总结 引言 在项目和redis之间&#xff0c;我犹豫了一下&#xff0c;觉得还是了解学习一下…

大数据信用报告查询应该选什么样的平台?

随着大数据技术的不断发展&#xff0c;大数据信用报告查询平台也应运而生。这些平台通过数据挖掘和分析&#xff0c;为个人提供有关大数据信用的详细报告&#xff0c;帮助他们在做出决策时获得更多的信息。然而&#xff0c;面对众多的大数据信用报告查询平台&#xff0c;如何选…

使用Apache POI库在Java中导出Excel文件的详细步骤

使用Apache POI库在Java中导出Excel文件的详细步骤 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA编程利器技…

240628_昇思学习打卡-Day10-SSD目标检测

240628_昇思学习打卡-Day10-SSD目标检测 今天我们来看SSD&#xff08;Single Shot MultiBox Detector&#xff09;算法&#xff0c;SSD是发布于2016年的一种目标检测算法&#xff0c;使用的是one-stage目标检测网络&#xff0c;意思就是说它只需要一步&#xff0c;就能把目标检…

hive调优原理详解:案例解析参数配置(第17天)

系列文章目录 一、Hive常问面试函数&#xff08;掌握&#xff09; 二、Hive调优如何配置&#xff08;重点&#xff09; 文章目录 系列文章目录前言一、Hive函数&#xff08;掌握&#xff09;11、JSON数据处理12、炸裂函数13、高频面试题13.1 行转列13.2 列转行 14、开窗函数&a…

免交互和嵌入执行模式

目录 概念 语法格式 统计行数 赋值变量 修改密码​编辑往文件里添加内容 ​编辑​编辑引入变量 整体赋值​编辑 加引号不赋值变量 expect实现免交互 免交互设置密码 免交互切换用户 嵌入执行模式 添加用户并免交互设置密码 免交互登录 传参实现ssh 练习 概念 …

pyqt5 制作视频剪辑软件,切割视频

该软件用于切割视频&#xff0c;手动选取视频片段的起始帧和结束帧并保存为json文件。gui界面如下&#xff1a;包含快进、快退、暂停等功能&#xff0c; 代码如下&#xff1a; # codingUTF-8 """ theme: pyqt5实现动作起始帧和结束帧的定位&#xff0c;将定位到…

python-docx 设置水印字体

本文目录 前言一、水印的XML在哪里1、Word内置水印设置2、自定义XML部件3、Header or Footer二、确认位置三、水印表前解释1、水印XML源代码2、水印结构解析3、关于style的详解三、修改水印样式前言 本文我们来完成一个有趣的玩意儿:在Python中通过操作Word文档的XML来设置整…

Maven - 在没有网络的情况下强制使用本地jar包

文章目录 问题解决思路解决办法删除 _remote.repositories 文件代码手动操作步骤验证 问题 非互联网环境&#xff0c;无法从中央仓库or镜像里拉取jar包。 服务器上搭建了一套Nexus私服。 Nexus私服故障&#xff0c;无法连接。 工程里新增了一个Jar的依赖&#xff0c; 本地仓…

如何利用React和Python构建强大的网络爬虫应用

如何利用React和Python构建强大的网络爬虫应用 引言&#xff1a; 网络爬虫是一种自动化程序&#xff0c;用于通过互联网抓取网页数据。随着互联网的不断发展和数据的爆炸式增长&#xff0c;网络爬虫越来越受欢迎。本文将介绍如何利用React和Python这两种流行的技术&#xff0c…

成功解决ES高亮内容引起的字段显示不一致问题

在处理搜索引擎&#xff08;如Elasticsearch&#xff09;结果时&#xff0c;常见需求之一是对用户搜索的关键词进行高亮显示&#xff0c;这有助于用户快速识别搜索结果为何与其查询相关。但在实际应用中&#xff0c;如果处理不当&#xff0c;直接使用高亮片段可能会导致原始数据…

SVN 的忽略(Ignore)和递归(Recursively)以及忽略部分

SVN中忽略大家经常用到&#xff0c;但总是似懂非懂&#xff0c;下面就详细展开说明一下忽略如何设置。 两个忽略 通常设置忽略都是文件夹和里面的文件都忽略。 设置忽略我们通常只需要鼠标右键点击忽略就可以了&#xff0c;如图&#xff1a; 第一个忽略用的最多&#xff0c;…

AI问答-供应链管理:中的长鞭效应(Bullwhip Effect)/ 供应链中需求信息变异放大现象

供应链管理中的长鞭效应&#xff08;Bullwhip Effect&#xff09;是一个经济学上的术语&#xff0c;它描述了供应链中需求信息变异放大的现象。以下是关于长鞭效应的详细解释&#xff1a; 一、定义 长鞭效应&#xff0c;也被称为“需求变异加速放大原理”或“牛鞭效应”&…

乐鑫 Matter 技术体验日|快速落地 Matter 产品,引领智能家居生态新发展

随着 Matter 协议的推广和普及&#xff0c;智能家居行业正迎来新的发展机遇&#xff0c;众多厂商纷纷投身于 Matter 产品的研发与验证。然而&#xff0c;开发者普遍面临技术门槛高、认证流程繁琐、生产管理复杂等诸多挑战。 乐鑫信息科技 (688018.SH) 凭借深厚的研发实力与行…

Python酷库之旅-第三方库openpyxl(15)

目录 一、 openpyxl库的由来 1、背景 2、起源 3、发展 4、特点 4-1、支持.xlsx格式 4-2、读写Excel文件 4-3、操作单元格 4-4、创建和修改工作表 4-5、样式设置 4-6、图表和公式 4-7、支持数字和日期格式 二、openpyxl库的优缺点 1、优点 1-1、支持现代Excel格式…

一、音视频基础

音视频基础 一、音视频录制原理二、音视频播放原理三、图像表示RGB-YUVV1.图像基础概念1.1 像素1.2 分辨率1.3 位深1.4 帧率1.5 码率1.6 Stride跨距 2.RGB、YUV深入讲解2.1 RGB2.2 YUV2.2.1 YUV采样表示法2.2.2 YUV数据存储 2.3 RGB和YUV的转换(了解)为什么解码出错显示绿屏&am…

借助 Aspose.Words,在 C# 中将 Word 转换为 Excel

有时我们会遇到需要将 Word 文档&#xff08;DOC 或 DOCX&#xff09;转换为 Excel 文档的任务。例如&#xff0c;这对于数据分析和报告很有用&#xff0c;或者如果您收到了任何文本数据并想将其转换为表格格式&#xff08;XLS 或 XLSX&#xff09;以便进一步工作。在本文中&am…

【DevExpress】WPF DevExpressMVVM 24.1版本开发指南

DevExpressMVVM WPF 环境安装 前言重要Bug&#xff08;必看&#xff09;环境安装控件目录Theme 主题LoginWindow 登陆窗口INavigationService 导航服务DockLayout Dock类型的画面布局TreeView 树状列表注意引用类型的时候ImageSource是PresentationCore程序集的博主找了好久&am…