2024-10-13-B fd 重定向 缓冲区

1   一切皆文件

1.1   虚拟文件系统

在系统层面,做了一层软件的封装,struct file 里有操作表(即函数指针的集合),可以调用底层的读写方法。虚拟文件系统(VFS)是一种神奇的抽象,它使得 “一切皆文件” 哲学在 Linux 中成为了可能。 (类比C++多态)

1.2   为何C/C++喜欢做封装

(1) 方便用户操作 

以“文本写入 vs 二进制写入”举例,在操作系统层面全是二进制,语言层面进行转化变为文本

(2) 提高语言的可移植性

如果不是Linux而是其他操作系统呢?C库函数 ---> 系统调用;FILE ---> fd(源代码编译成不同版本的库)

封装可以“屏蔽差异”

1.3   文件内核缓冲区

写入:

打开一个 myfile 文件,创建对应的 struct file,里面包含操作表和文件内核缓冲区address_space,write() (拷贝函数,把数据从用户拷贝至内核)把要写入的内容拷贝至文件的内核缓冲区,如果需要的话,可通过file->ops->write()将数据刷新到文件中(由OS自主决定)。

空文件写入,拷贝刷新即可;修改的本质,是先读取再写入。

为何有缓冲区?因为外设比较慢,缓冲区的存在可以变相提高IO效率。

一个进程,能在PCB中找到file对象,通过file对象,既能找到文件的操作表,又能找到文件对应的属性集,还能找到文件对应的文件内核缓冲区。

1.4   重定向

    close(0);int fd1 = open("return_test1.txt", O_WRONLY | O_CREAT | O_APPEND, 0666);int fd2 = open("return_test2.txt", O_WRONLY | O_CREAT | O_APPEND, 0666);int fd3 = open("return_test3.txt", O_WRONLY | O_CREAT | O_APPEND, 0666);int fd4 = open("return_test4.txt", O_WRONLY | O_CREAT | O_APPEND, 0666);

./ofi
fd1 of open(): 0
fd2 of open(): 3
fd3 of open(): 4
fd4 of open(): 5

进程打开文件,需要给文件分配新的fd时,fd的分配规则是以最小的且没有被使用的为优先

 重定向:把 fd_array 中特定下标对应的元素替换后,如close(1),上层不知道(printf->stdout->fileno=1),本来往显示器文件写入的变为了往新的文件写入。

系统调用:int dup2(int oldfd, int newfd)
dup2() makes newfd be the copy of oldfd, closing newfd if necessary

如果要做输出重定向,可以把文件的地址(fd)覆盖到 fd_array[1] 中,即 dup2(fd, 1)
(联想记忆:fd活得久,就old)

int fd = open("log.txt", O_CREAT | O_WRONLY | O_TRUNC, 0666);
printf("HELLO FD: %d\n", fd);
fprintf(stdout, "HELLO FD: %d\n", fd);
fputs("HELLO LINUX\n", stdout);
const char *msg = "hello fwrite\n";
fwrite(msg, 1, strlen(msg), stdout);

往显示器里写入

HELLO FD: 3
HELLO FD: 3
HELLO LINUX
hello fwrite

使用 dup2(fd, 1);

$ cat log.txt 
HELLO FD: 3
HELLO FD: 3
HELLO LINUX
hello fwrite

1.4.1    命令行中重定向内容的解析

"ls -a -l -n" < hello.txt

"ls -a -l -n" > hello.txt

"ls -a -l -n" >> hello.txt

//全局变量(重定向相关)
#define NoRedir 0
#define InRedir 1
#define OutRedir 2
#define AppRedir 3int redirtype = NoRedir;
char *filename = nullptr;
//过滤空格
#define TrimSpace(pos) do{\ //while(0)的作用是形成代码块,可以整体替换while(isspace(*pos)){\pos++;\}\
}while(0)
bool ParseCommandLine(char commandline_buffer[], int len){
//......//重定向redir = NoRedir;filename = nullptr;//"ls -a -l -n" > file.txtint end = len - 1;while(end >= 0){if(commandline_buffer[end] == '<'){redir = InRedir;filename = &commandline_buffer[end] + 1;TrimSpace(filename);commandline_buffer[end] = 0;break;}else if(commandline_buffer[end] == '>'){if(commandline_buffer[end - 1] == '>'){redir = AppRedir;commandline_buffer[end] = 0;commandline_buffer[end - 1] = 0;filename = &commandline_buffer[end] + 1;TrimSpace(filename);break;}else{redir = OutRedir;commandline_buffer[end] = 0;filename = &commandline_buffer[end] + 1;TrimSpace(filename);break;}}else{end--;}}
//......
}

2   总结

(1)文件描述符的概念,文件也是要被管理的(= 内容 + 属性),分为未打开的和被打开的
(2)标准输入输出错误之间的关系,以及系统调用接口open, close, read, write,文件流封装的底层一定有文件描述符
(3)文件描述符分配规则、012,重定向概念、原理、操作、如何进行
(4)内核角度理解“一切皆文件”,通过 struct file 对象和函数指针表屏蔽差异
(5)一个进程有自己的PCB,也要有自己打开的文件描述符表,还要有自己打开的工作文件,每个文件都要配备操作表、属性集和内核级缓冲区

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

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

相关文章

Metasploit使用

最近在学Metasploit&#xff0c;Metasploit是一个免费的、可下载的渗透测试框架&#xff0c;通过它可以很容易地获取、开发并对计算机软件漏洞实施攻击&#xff0c;是一个集成了渗透测试全流程的渗透工具。 图一 模块&#xff1a;模块组织按照不同的用途分为7种类型的模块 &am…

Github 2024-12-01 开源项目月报 Top20

根据Github Trendings的统计,本月(2024-12-01统计)共有20个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10TypeScript项目9Go项目2HTML项目1Shell项目1Jupyter Notebook项目1屏幕截图转代码应用 创建周期:114 天开发语言:TypeScript, Py…

MongoDB集群的介绍与搭建

MongoDB集群的介绍与搭建 一.MongoDB集群的介绍 注意&#xff1a;Mongodb是一个比较流行的NoSQL数据库&#xff0c;它的存储方式是文档式存储&#xff0c;并不是Key-Value形式&#xff1b; 1.1集群的优势和特性 MongoDB集群的优势主要体现在以下几个方面&#xff1a; (1)高…

Facebook:筑牢隐私安全堡垒,守护社交净土

在全球社交媒体平台中&#xff0c;Facebook一直是风靡全球的佼佼者。然而&#xff0c;随着数字化信息的迅速膨胀&#xff0c;用户隐私保护的重要性日益凸显。面对用户对数据安全性的高度重视&#xff0c;Facebook致力于通过一系列措施来确保隐私保护&#xff0c;守护每位用户的…

多系统萎缩锻炼如何好起来?

多系统萎缩&#xff08;Multiple System Atrophy, MSA&#xff09;是一种复杂的神经系统退行性疾病&#xff0c;影响着患者的自主神经系统、运动系统和平衡功能等多个方面。面对这一挑战&#xff0c;科学、合理的锻炼对于缓解症状、提高生活质量至关重要。本文将详细介绍多系统…

实现RAGFlow-0.14.1的输入框多行输入和消息框的多行显示

一、Chat页面输入框的修改 1. macOS配置 我使用MacBook Pro&#xff0c;chip 是 Apple M3 Pro&#xff0c;Memory是18GB&#xff0c;macOS是 Sonoma 14.6.1。 2. 修改chat输入框代码 目前RAGFlow前端的chat功能&#xff0c;输入的内容是单行的&#xff0c;不能主动使用Shift…

11.17【大数据】Hadoop【DEBUG】

列出hdfs文件系统所有的目录和文件 主节点上 子结点 是一样的 *为什么能登进 slave 02 的主机,但是 master 当中依然显示 slave 02 为 DeadNode?* hadoop坏死节点的重启_hadoop3 子节点重启-CSDN博客 注意hadoop-daemon.sh 实际上位于 Hadoop 的 sbin 目录中&#xff0c;而不…

网络测速工具

1. SPEEDTEST https://www.speedtest.net/ 2. 测速网 测速网 - 专业测网速, 网速测试, 宽带提速, 游戏测速, 直播测速, 5G测速, 物联网监测,Wi-Fi 7,Wi-Fi 6,FTTR,全屋Wi-Fi - SpeedTest.cn 3. 字节比特换算 bps&#xff08;bits per second&#xff09; 字节和比特的换算…

快速构建NLP理论知识体系

NLP理论知识体系 一句话解释NLPNLP模型及原理简述1、Rag 一句话解释NLP 如果我们要实现机器翻译、情感分析、问答系统、文本摘要、聊天机器人、构造智能化的辅助文件填写模板&#xff0c;NLP可以通过现成的模型对输入的语音、文字、图片进行处理&#xff08;分词、标词性、去停…

AI - RAG中的状态化管理聊天记录

AI - RAG中的状态化管理聊天记录 大家好&#xff0c;今天我们来聊聊LangChain和LLM中一个重要的话题——状态化管理聊天记录。在使用大语言模型(LLM)的时候&#xff0c;聊天记录&#xff08;History&#xff09;和状态&#xff08;State&#xff09;管理是非常关键的。那我们先…

【AI学习】Mamba学习(二十):Mamba是一种线性注意力

论文《Demystify Mamba in Vision: A Linear Attention Perspective 》从线性注意力的视角&#xff0c;对Mamba 进行了阐释。 论文名称&#xff1a;Demystify Mamba in Vision: A Linear Attention Perspective (Arxiv 2024.05) 论文地址&#xff1a;https://arxiv.org/pdf/24…

POI遍历行所有单元格的两种方式,getPhysicalNumberOfCells方式有问题,勿用

今天看POI源码的时候&#xff0c;发现HSSFWorkbook类型的工作簿&#xff0c;行数据是用TreeMap<Integer, HSSFRow>存储的&#xff0c;列数据是用HSSFCell[]数组来存的&#xff1b;XSSFWorkbook类型的工作簿&#xff0c;行数据是用SortedMap<Integer, XSSFRow>存储的…

DataSophon集成CMAK KafkaManager

本次集成基于DDP1.2.1 集成CMAK-3.0.0.6 设计的json和tar包我放网盘了. 通过网盘分享的文件&#xff1a;DDP集成CMAK 链接: https://pan.baidu.com/s/1BR70Ajj9FxvjBlsOX4Ivhw?pwdcpmc 提取码: cpmc CMAK github上提供了zip压缩包.将压缩包解压之后 在根目录下加入启动脚本…

ArrayList常见操作源码逐句剖析

目录 前言 正文 1.需要了解的一些字段属性 1.存储 ArrayList 元素的数组缓冲区。 2.集合的大小 3.默认集合容量大小 2.ArrayList对象创建 1.无参构造 2.有参构造1 3.有参构造2 3.添加元素add(E e)以及扩容机制 ​编辑 后言 前言 源码的剖析有助于理解设计模式&…

重磅更新:CnosDB 2.3.5.4 版本上线, 性能提升,问题修复一网打尽

&#x1f4e2; 重磅更新&#xff1a;CnosDB 2.3.5.4 版本上线, 性能提升&#xff0c;问题修复一网打尽 &#x1f4e2; 我们很高兴地向大家介绍最新版本的更新&#xff0c;以下是本次更新的主要内容&#xff1a; &#x1f539; 版本号&#xff1a;2.3.5.4 &#x1f539; 发布…

SD-WAN 2.0 在金融行业的典型应用场景

目录 全扁平化组网 场景需求 应用方案 SD-WAN 2.0 在金融行业的创新实践 SD-WAN5G提高金融行业网络接入可靠性 全扁平化组网 随着金融机构数字化转型的推进&#xff0c;机构业务的多样性、复杂性、 个性化等要求&#xff0c;对现有的金融机构网络架构与网管人员运维模式提出…

如何延长相机电池续航时间

如果你曾在拍摄过程中突然发现相机电池电量不足&#xff0c;就会知道那有多让人紧张和沮丧了。无论你是在拍摄小朋友的生日派对、家庭聚会&#xff0c;还是作为一名专业摄影师在工作&#xff0c;保持电池有电都是至关重要的。否则&#xff0c;你就有可能错过精彩瞬间&#xff0…

C#开发-集合使用和技巧(十)Union用法-并集

在 C# 中&#xff0c;IEnumerable 的 Union 方法用于返回两个序列的并集。Union 方法会去除重复的元素&#xff0c;确保结果集中每个元素都是唯一的。以下是 Union 方法的基本用法&#xff1a; 基本语法 public static IEnumerable<TSource> Union<TSource>(this…

轻量化特征融合 | YOLOv11 引入一种基于增强层间特征相关性的轻量级特征融合网络 | 北理工新作

本改进已同步到Magic框架 摘要—无人机图像中的小目标检测由于分辨率低和背景融合等因素具有挑战性,导致特征信息有限。多尺度特征融合可以通过捕获不同尺度的信息来增强检测,但传统策略效果不佳。简单的连接或加法操作无法充分利用多尺度融合的优势,导致特征之间的相关性不…

ABAP 系统变量SY-INDEX与SY-TABIX的区别

ABAP系统变量SY-INDEX与SY-TABIX都是在循环中使用&#xff1a; SY-INDEX在Do...EndDo和While...EndWhile中起作用&#xff1b; SY-TABIX在Loop...EndLoop中有效。 详见如下实例&#xff1a; REPORT ztest_index_tabix.DATA:lit_vbak TYPE STANDARD TABLE OF vbak,lwa_vbak …