【linux】基础IO(上)

news2024/9/20 15:25:00

1. 共识原理

  1. 文件 = 内容 + 属性
  2. 文件分为 打开的文件 + 没打开的文件
  3. 打开的文件 : 是进程打开的 ----- 本质是要研究文件和进程的关系
  4. 没打开的文件 : 没打开的文件储存在磁盘上,由于没打开的文件很多,所以需要分门别类的防止好,才能快速找到文件
  5. 文件被打开,必须先加载到内存
  6. 进程打开文件的比例是按 1 : 多进行的,所以在操作系统内部,一定存在大量被打开的文件,我们需要去管理 ----------- 先描述再组织 ----------- 在内核中,一个被打开的文件都需要自己的文件打开对象,包含文件的很多属性
  1. C语言程序默认在启动的时候,会打开三个标准输入输出流(文件)

stdin : 键盘文件

stdout : 显示器文件

stderr : 显示器文件

  1. 文件在磁盘上,磁盘是外部设备,访问磁盘文件其实是访问硬件
  2. 几乎所有的库只要是访问硬件设备,必要封装系统调用 (如 fwirte , fprintf , fread)

2. 系统文件I/O

操作文件,除了上述C接口(当然,C++也有接口,其他语言也有),我们还可以采用系统接口来进行文件访问

注意:(有关C接口的一些IO流知识)

  1. C语言的 fopen 第一个参数如果只传文件名,如果没有该文件,则在当前进程的工作路径下 cwd 创建一个文件
  2. fopen 第二次参数如果是 w : 写入之前,都会对文件进行清空,再从头开始写入, a : 是在原内容后面追加写

代码举例

3. 接口介绍

open :

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

int open(const char *pathname, int flags);

int open(const char *pathname, int flags, mode_t mode);

pathname: 要打开或创建的目标文件

flags:

打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成flags

O_RDONLY: 只读打开 , O_WRONLY: 只写打开(只有这个选项,写入是覆盖写) , O_RDWR : 读,写打开

这三个常量,必须指定一个且只能指定一个

O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限

O_APPEND: 追加写

O_TRUNC : 先清空文件内的内容

mode:

决定新文件的访问权限

返回值:

成功:新打开的文件描述符

失败:-1

注意:

  1. flags 实际上是运用了比特位方式的标志位传递方式(大致类似以下)

  1. mode 参数可以决定文件访问权限,但是这是起始权限,最终权限跟 umask有关,如果想要最终权限等于起始权限,进程内部调用 umask(0) , 虽然有系统内部的 umask,但是这里会采用进程里面设置的umask

4. 文件标识符fd

(一)认识文件标识符

我们先来认识一下两个概念: 系统调用 和 库函数

像 fopen fclose fread fwrite 都是C标准库当中的函数,我们称之为库函数

而 open close read write lseek 都属于系统提供的接口,称之为系统调用接口

实际上,上述的库函数是封装了这些系统调用接口 ,而C语言里的File是一个结构体,由于要封装系统调用接口,这个结构体里面一定要存的信息是文件描述符 fd (其他语言也是如此)

由于文件需要被管理起来,所以我们对其先描述,再组织

(二)文件描述符 0 ,1 , 2

Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入0, 标准输出1, 标准错误2.

fd 0,1,2对应的物理设备一般是:键盘,显示器,显示器

代码 验证 fd = 1 fd = 2对应的文件

注意

关闭 标准输出1 不影响 标准错误2,即使是不同的fd,也可鞥是同一个被打开的文件,这里实际上用到了计数引用(智能指针有提到),即当关闭其中一个,count--,文件描述表里面的指针数组,相应下标对应的内容置空即可,只有当 count = 0 , 这个文件才不被打开

(三)文件描述符的分配规则

在files_struct数组当中,找到当前没有被使用的最小的一个下标,作为新的文件描述符

代码举例

5. 重定向

重定向的原理和上述差不多

注意:

进程历史打开的文件与进行的各种重定向关系都和未来进行程序替换无关,程序替换,并不影响文件访问

6. 使用 dup2 系统调用

#include <unistd.h>

int dup2(int oldfd, int newfd);

代码举例1

dup2(fd,1)

将fd文件描述所指向的内容覆盖到1文件描述所指向的内容

7. FILE

因为IO相关函数与系统调用接口对应,并且库函数封装系统调用,所以本质上,访问文件都是通过fd访

问的

FILE结构体里面还有对应打开文件的缓冲区和维护信息

所以C库当中的FILE结构体内部,必定封装了fd

代码 验证File结构体中有 fd

代码(必看,有关缓冲区)

代码一

首先,我们先理解一下缓冲区

printf , fprintf 这些都是库函数,属于C语言提供的,且它们都需要将数据放到缓冲区内(这个缓冲区指代的是C语言提供的缓冲区,每一个进程都有自己的一个缓冲区),对于显示器采取的一般是行缓冲,即碰到 '\n',才把数据刷新到系统提供的缓冲区,最后交给磁盘

write 是属于系统调用接口的函数,调入时,将数据写入系统提供的缓冲区

代码二

对文件采取的一般是全缓冲,即C语言提供的缓冲区满了,才刷新到系统提供的缓冲区

所以 printf,fprintf写入的数据只是放到C语言提供的缓冲区,并没有刷新,当进程退出时,需要刷新C语言提供的缓冲区,这个时候,无论父进程和子进程谁先退出,必然发生写实拷贝,从而造成printf,fprintf写入的内容,父子进程各有一份,且都要刷新

缓冲区刷新问题

三层刷新方式:

  1. 无缓冲 ----- 直接刷新
  2. 行缓冲 ----- 碰到'\n'刷新(一般对应显示器)
  3. 全缓冲 ----- 缓冲区满了才刷新 (一般对应普通文件写入)

还有一种情况,缓冲区也会刷新:

进程退出

为什么要有缓冲区:

  1. 解决效率问题
  2. 配合格式化(实际上的读取,都是当作字符来看待)

目前我们认为,只要将数据刷新到了内核,数据就可以到硬件了

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

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

相关文章

常用函数式接口的使用

FunctionalInterface注解 函数式接口在java中是指:有且仅有一个抽象方法的接口。 虽然知道怎么使用&#xff0c;但是没有搞懂使用场景&#xff0c;暂且记录下使用方法吧&#xff0c;不至于看到源码的时候不知所云。 要我自己写代码&#xff0c;我是想不起来这样用的&#xff0…

YOLOv9改进策略【注意力机制篇】| 2024 SCSA-CBAM 空间和通道的协同注意模块

一、本文介绍 本文记录的是基于SCSA-CBAM注意力模块的YOLOv9目标检测改进方法研究。现有注意力方法在空间-通道协同方面未充分挖掘其潜力&#xff0c;缺乏对多语义信息的充分利用来引导特征和缓解语义差异。SCSA-CBAM注意力模块构建一个空间-通道协同机制&#xff0c;使空间注…

C语言 结构体和共用体——典型实例:洗发牌模拟

目录 如何表示52张扑克牌&#xff1f; 如何保存一副扑克牌&#xff1f; 如何发牌&#xff1f; 如何设计主函数&#xff1f; 如何模拟洗牌&#xff1f; 如何表示52张扑克牌&#xff1f; 如何保存一副扑克牌&#xff1f; 如何发牌&#xff1f; 如何设计主函数&#xff1f; 如…

窗户检测系统源码分享

窗户检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

十大常用加密软件排行榜|2024年好用的加密软件推荐(企业必备)

在数字化时代&#xff0c;数据安全已经成为企业生存和发展的关键因素之一。随着网络攻击和数据泄露事件的频发&#xff0c;企业对数据加密的需求日益增长。选择一款可靠的加密软件&#xff0c;不仅能保护企业的核心数据&#xff0c;还能确保业务的连续性和合规性。本文将为您介…

Stable Diffusion 使用详解(11)--- 场景ICON制作

目录 背景 controlNet 整体描述 Canny Lineart Depth 实际使用 AI绘制需求 绘制过程 PS打底 场景模型选择 设置提示词及绘制参数 controlnet 设置 canny 边缘 depth 深度 lineart 线稿 效果 背景 这段时间不知道为啥小伙伴似乎喜欢制作很符合自己场景的ICON。…

共享wifi哪家公司正规合法?看这3点就够了!

随着共享wifi项目的热度不断上升&#xff0c;越来越多的公司都开始加入到共享wifi贴码的研发行列之中&#xff0c;让意向入局该项目的创业者拥有更多选择的同时&#xff0c;也让许多想要借此割一波韭菜的不法分子有了可乘之机。在此背景下&#xff0c;共享wifi哪家公司正规合法…

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【内核启动】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 子系统开发内核 轻量系统内核&#xff08;LiteOS-M&#xff09; 轻量系统内核&#…

Docker安装rabbitmq并配置延迟队列

下载rabbitmq镜像 docker pull rabbitmq:management 运行rabbitmq镜像 docker run -id --namerabbitmq -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 15671:15671 -p 15672:15672 -p 25672:25672 -e RABBITMQ_DEFAULT_USERtom -e RABBITMQ_DEFAULT_PASStom rabbitmq:management …

回归传统,Domino拷贝式迁移!

大家好&#xff0c;才是真的好。 前面讲太多普及型的概念&#xff0c;今天我们来点实在的内容。 在Notes/Domino的黄金年代&#xff0c;有一件事情大家干得风生水起&#xff0c;那就是Domino服务器迁移。 要么迁移到另一台硬件服务器上&#xff0c;要么迁移到新换的磁盘当中…

展会上想要留住俄罗斯客户,柯桥成人俄语培训

展品 экспонат 模型 макет 证明(书) свидетельство 预算 бюджет 确认订单 подтверждение заказа 缺点,毛病,缺陷 недостаток 退换 возвращать 更换 заменять 调整 урегулир…

[PTA]7-1 谁管谁叫爹

[PTA]7-1 谁管谁叫爹 输入格式&#xff1a; 输入第一行给出一个正整数 N&#xff08;≤100&#xff09;&#xff0c;为游戏的次数。以下 N 行&#xff0c;每行给出一对不超过 9 位数的正整数&#xff0c;对应 A 和 B 给出的原始数字。题目保证两个数字不相等。 输出格式&…

虹科干货 | CAN/CAN FD故障揭秘:快速排查与解决技巧

是否在处理CAN总线问题时感到头疼&#xff1f;是否在寻找简单直接的方法来解决那些看似复杂的连接故障&#xff1f;本文将为您提供实用技巧&#xff0c;让您能够轻松应对这些难题。 CAN总线因其高效、可靠的数据交换能力&#xff0c;在汽车、工业控制、航空航天等多个关键领域得…

【软件方案】智慧社区总体解决方案(PPT原件)

1.智慧社区整体建设方案内容 2.整体功能介绍 软件全套资料部分文档清单&#xff1a; 工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&#xff0c;产品需求规格说明书&#xff0c;需求调研计划&#xff0c;用户需求调查单&#xff0c;用户需求说明书&…

故障模拟测试负载是如何实现的

故障模拟测试负载是在系统或设备上故意引入故障&#xff0c;以测试其应对能力的方法。这种方法可以帮助我们了解系统在面临各种故障时的响应和恢复能力&#xff0c;从而提高系统的可靠性和稳定性。故障模拟测试负载的实现主要依赖于以下几个步骤&#xff1a; 1. 确定故障类型&…

uniapp快速入门教程,内容来源于官方文档,仅仅记录快速入门需要了解到的知识点

uniapp快速入门教程&#xff0c;内容来源于官方文档&#xff0c;仅仅记录快速入门需要了解到的知识点 目录 介绍uniapp 介绍uniapp x 介绍功能框架图创建项目&发布组件/标签的变化js的变化css的变化工程结构和页面管理 pages.jsonmanifest.json 应用配置组件easycom组件规…

【Unity杂谈】iOS 18中文字体显示问题的调查

一、问题现象 最近苹果iOS 18系统正式版推送&#xff0c;周围升级系统的同事越来越多&#xff0c;有些同事发现&#xff0c;iOS 18上很多游戏&#xff08;尤其是海外游戏&#xff09;的中文版&#xff0c;显示的字很奇怪&#xff0c;就像一些字被“吞掉了”&#xff0c;无法显示…

MongoDB解说

MongoDB 是一个流行的开源 NoSQL 数据库&#xff0c;它使用了一种被称为文档存储的数据库模型。 与传统的关系型数据库管理系统&#xff08;RDBMS&#xff09;不同&#xff0c;MongoDB 不使用表格来存储数据&#xff0c;而是使用了一种更为灵活的格式——JSON 样式的文档。 这…

详解Vite创建Vue3项目router-less-scss-pinia-持久化

前言 Vite 和 Webpack 都是现代化的前端构建工具&#xff0c;它们可以帮助开发者优化前端项目的构建和性能。虽然它们的目标是相似的&#xff0c;但它们在设计和实现方面有许多不同之处。webpack可以看我的上一篇文章 一、准备工作安装工具 这里我们简单介绍一下文章中使用到…

你必须要懂的网络安全知识

不管是网工还是运维&#xff0c;都应该对网络安全的重要性非常清楚&#xff0c;每一次数据泄露、每一次网络攻击&#xff0c;都可能给企业带来不可估量的损失。 从SQL注入到跨站脚本攻击&#xff08;XSS&#xff09;&#xff0c;从分布式拒绝服务攻击&#xff08;DDoS&#xf…