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多路复用实现进程之间聊天;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生产环境 CentOS 7 k8s v1.28.0离线部署

背景描述&#xff1a;CentOS 7 Kubernetes 离线部署 随着云计算和微服务架构的普及&#xff0c;Kubernetes&#xff08;K8s&#xff09;已经成为容器编排的标准工具。它能够自动化应用的部署、扩展和管理&#xff0c;使得开发和运维的工作更加高效和可靠。然而&#xff0c;在一…

腾讯开源高质量人类运动视频的框架;通过音频指令修改图像;利用YOLO分析网球视频;Gemma-2中文微调模型

✨ 1: MimicMotion MimicMotion 腾讯开源的通过姿态指导生成高质量任意长度人类运动视频的框架 MimicMotion 是一种可控视频生成框架&#xff0c;旨在生成高质量的任意长度人物动作视频&#xff0c;采用带有置信度的姿态引导&#xff0c;并通过区域损失放大来缓解图像失真。其…

C++视觉开发 三.缺陷检测

一.距离变换 1.概念和功能 距离变换是一种图像处理技术&#xff0c;用于计算图像中每个像素到最近的零像素&#xff08;背景像素&#xff09;的距离。它常用于图像分割、形态学操作和形状分析等领域。它计算图像中每个像素到最近的零像素&#xff08;背景像素&#xff09;的距…

苍穹外卖--sky-take-out(五)前端

大部分笔记都是写在语雀的&#xff0c;这是一次性从本人语雀复制过来的&#xff0c;可能结构有些错乱 基础创建 环境要求 node.js npm Vue CLI 创建前端工程 使用vue ui命令创建 项目结构 启动项目 打开命令行窗口 快捷键ctrlj 或者 运行 输入&#xff1a;npm run ser…

010-GeoGebra基础篇-动态验证三角形外接圆的圆心是否可以位于三角形的外部

接下来我们将进行一些稍微高级一点操作&#xff0c;一边学习新东西的同时&#xff0c;也开始对数学、物理等内容的研究。 目录 一、项目截图二、涉及内容三、问题设置1. 问题提出2. 验证方案 三、做图步骤1. 绘制定点A、B&#xff1b;2. 绘制动点C&#xff1b;&#xff08;1&am…

万界星空科技铜管加工行业MES系统解决方案

一、行业背景与挑战 随着铜管加工行业的快速发展&#xff0c;传统的管理模式已难以满足日益增长的生产需求。为满足市场的高效率、高质量、低成本要求&#xff0c;企业急需一套智能化的管理系统来提升生产效率、优化资源配置和确保产品质量。因此&#xff0c;我们针对铜管加工行…

常用的限流算法有哪些?你听说过几种?

限流&#xff0c;就是指限制流量请求的频次。 在高并发情况下&#xff0c;它是一种保护系统的策略&#xff0c;避免了在流量高峰时系统崩溃&#xff0c;造成系统的不可用。 常见的限流算法有&#xff1a; 计数器限流算法滑动窗口限流算法漏桶限流算法令牌桶限流算法 1. 计数器…

【Python程序开发系列】教你使用Docker部署一个简单的Python应用程序(案例+源码)

这是我的第313篇原创文章。 一、引言 Docker 对于程序员来说&#xff0c;其实和Git差不多&#xff0c;基本上属于一个必备工具。如果你想使用这个工具&#xff0c;你就必须安装这个应用工具&#xff0c;至于在不同操作系统上安装Docker的方式网上有很多教程&#xff0c;这里不…

每天五分钟深度学习:解决for循环效率慢的关键在于向量化

本文重点 上一节课程中,我们学习了多样本的线性回归模型,但是我们的伪代码实现中使用了大量的for循环,这样代码的问题是效率很低。为了克服这一瓶颈,向量化技术应运而生,成为提升程序执行效率、加速数据处理速度的重要手段。 向量化技术概述 向量化(Vectorization)是…

MySQL-核心知识要点

1、索引的数据结构-Btree BTree的优势&#xff1a; B树的内节点无data&#xff0c;一个节点可以存储更多的K-V对。在构造树时&#xff0c;需要的内节点会更少&#xff0c;那么树的层级也会越低。查询一条数据时&#xff0c;1. 扫描的层级低&#xff0c;扫描过的节点更少&…

【netty系列-04】反应堆模式的种类和具体实现

Netty系列整体栏目 内容链接地址【一】深入理解网络通信基本原理和tcp/ip协议https://zhenghuisheng.blog.csdn.net/article/details/136359640【二】深入理解Socket本质和BIOhttps://zhenghuisheng.blog.csdn.net/article/details/136549478【三】深入理解NIO的基本原理和底层…

数字化转型中,数字化如何重塑中小企业发展力?

引言&#xff1a;当前&#xff0c;我国中小微企业数字化转型处于“不平衡、不充分、不规范”阶段&#xff0c;普遍面临“不会转”“不能转”“不敢转”的困境。数字化转型可以帮助企业突破这些困境&#xff0c;实现更大的发展。更进一步&#xff0c;数字化转型是中小企业高质量…

学习笔记——动态路由——IS-IS中间系统到中间系统(基本概念)

二、IS-IS基本概念 1、IS-IS概述 IS-IS是ISO定义的OSI协议栈中的无连接网络服务(ConnectionLess Network Service&#xff0c;CLNS)的一部分&#xff0c;IS-IS是一种链路状态路由协议&#xff0c;IS-IS与OSPF在许多方面非常相似&#xff0c;例如&#xff0c;运行IS-IS协议的直…

4.BeanFactory

可以看出BeanFactory表面上只有getBean相关的方法。 实际上控制反转、基本的依赖注入、Bean的生命周期的各种功能&#xff0c;都是由BeanFactory的实现类来实现的。&#xff08;DefaultListableBeanFactory&#xff09; DefaultListableBeanFactory管理单例对象DefaultSinglet…

杨万里,诚斋体的开创者

杨万里&#xff0c;字廷秀&#xff0c;号诚斋&#xff0c;生于南宋绍兴元年&#xff08;公元1127年&#xff09;&#xff0c;卒于南宋庆元二年&#xff08;公元1206年&#xff09;&#xff0c;享年79岁。在中国古代文学的璀璨星河中&#xff0c;南宋诗人杨万里以其清新脱俗、贴…

Android- Framework 非Root权限实现修改hosts

一、背景 修改system/etc/hosts&#xff0c;需要具备root权限&#xff0c;而且remount后&#xff0c;才能修改&#xff0c;本文介绍非root状态下修改system/etc/hosts方案。 环境&#xff1a;高通 Android 13 二、方案 非root&#xff0c;system/etc/hosts只有只读权限&…

机器学习python实践——关于管道模型Pipeline和网格搜索GridSearchCV的一些个人思考

最近在利用python跟着指导书进行机器学习的实践&#xff0c;在实践中使用到了Pipeline类方法和GridSearchCV类方法&#xff0c;并且使用过程中发现了一些问题&#xff0c;所以本文主要想记录并分享一下个人对于这两种类方法的思考&#xff0c;如果有误&#xff0c;请见谅&#…

【微服务】微服务之Feign 与 Ribbon

文章目录 强烈推荐引言优点Feign示例什么是Ribbon&#xff1f;Ribbon 的优点Netflix Feign 和 Ribbon整合Feign 与 Ribbon 的关系Feign 与 Ribbon 结合使用的示例配置文件&#xff08;application.yml&#xff09;说明&#xff1a; Feign 与 Ribbon 结合使用的应用场景1. 动态服…

物联网的技术和应用有哪些?

随着科技的飞速发展&#xff0c;物联网已经成为连接世界的重要纽带&#xff0c;塑造着我们未来的生活。我们一起深入探索物联网的前沿技术和前瞻性应用&#xff0c;一窥未来的可能性。 获取物联网解决方案&#xff0c;YesPMP平台一站式物联网开发服务。 提示&#xff1a;智慧家…

图形的搭建

例一&#xff1a; 输入描述&#xff1a; 多组输入&#xff0c;一个整数&#xff08;2~20&#xff09;&#xff0c;表示输出的行数&#xff0c;也表示组成“X”的反斜线和正斜线的长度。 输出描述&#xff1a; 针对每行输入&#xff0c;输出用“*”组成的X形图案。 示例一&…