【linux】基础IO(上)

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.xdnf.cn/news/1539542.html

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

相关文章

【Linux实用教程】-03-用户权限命令

点个关注吧 &#x1f334; 3.1 Linux 的用户和组 &#x1f33e;3.1.1 用户的管理 添加用户 useradd 添加一个用户useradd test 添加 test 用户useradd test -d /home/t1 指定用户 home 目录 注意&#xff1a; 用户操作需要使用管理员权限操作&#xff0c;可以先使用…

8583 顺序栈的基本操作

### 思路 1. **初始化栈**&#xff1a;分配初始大小为 STACK_INIT_SIZE 的内存空间&#xff0c;并将 base 和 top 指针指向该空间的起始位置。 2. **入栈**&#xff1a;检查栈是否已满&#xff0c;如果已满则扩展栈的存储空间。将新元素插入栈顶&#xff0c;并更新 top 指针。 …

用pod部署prometheus

用pod部署prometheus node_exporter 节点数据收集器 daemonset ————> 保证每个节点都有一个收集器 prometheus————>监控主程序 grafana————>图形化 altermanager————>告警模块 [rootmaster01 ~]# kubectl create ns monitor-sa namespace/moni…

【天怡AI-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

使用SpringCloud构建可伸缩的微服务架构

Spring Cloud是一个用于构建分布式系统的开源框架。它基于Spring Boot构建&#xff0c;并提供了一系列的工具和组件&#xff0c;用于简化开发分布式系统的难度。Spring Cloud可以帮助开发人员快速构建可伸缩的微服务架构。 要使用Spring Cloud构建可伸缩的微服务架构&#xff0…

外国药品位置检测系统源码分享

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

office2016 增强版 KMS

第一步&#xff1a; 用管理员权限登陆&#xff1a;Windows PowerShell &#xff08;安装最新的 PowerShell&#xff0c;了解新功能和改进&#xff01;https://aka.ms/PSWindows&#xff09; 第二步&#xff1a; C:\Windows\system32> cd C:\Program Files\Microsoft Off…

OpenCv(一)

计算机视觉和机器视觉的区别 计算机视觉&#xff08;Computer Vision&#xff09;和机器视觉&#xff08;Machine Vision&#xff09;是两个密切相关但又有区别的领域。两者在应用、技术和目标上都有所不同。 **计算机视觉&#xff1a;**主要是研究如何使计算机能够理解和处理…

cadence SPB17.4 - allegro - 用板子外形创建整板铺铜

文章目录 cadence SPB17.4 - allegro - 用板子外形创建整板铺铜概述笔记先确定自己板子的 board Geometry/Design_Outline 是否有外形shape为了将软件提示看得更清楚&#xff0c;在每个操作之前&#xff0c;先将命令提示区内容先删了用Z-copy从外形层生成整板的铺铜备注END cad…

[PTA]7-6 整数分解为若干项之和

[PTA]7-6 整数分解为若干项之和 将一个正整数N分解成几个正整数相加&#xff0c;可以有多种分解方法&#xff0c;例如761&#xff0c;752&#xff0c;7511&#xff0c;…。编程求出正整数N的所有整数分解式子。 输入格式&#xff1a; 每个输入包含一个测试用例&#xff0c;即…

Oracle 19c 安装教程学习

Oracle 19c 安装教程学习 &#xff08;最新&#xff09; 很久没有用Oracle 我记得用的时候还是 2021年 &#xff0c;那个时候用的 Oralce 11g 。 今天本人实测安装 。 今天的学习目标就是教大家怎么安装 。直接上图 19c下载地址&#xff1a;https://www.oracle.com/cn/databa…

【高级编程】网络编程 基于 TCPUDP 协议的 Socket 编程

文章目录 IP地址Socket基于 TCP 协议的 Socket 编程基于 UDP 协议的 Socket 编程 IP地址 IP地址&#xff08;Internet Protocol&#xff09;&#xff1a;唯一标识网络上的每一台计算机 IP地址的组成&#xff1a;32位&#xff0c;由4个8位二进制数组成 11000000.10101000.000…

TMStarget学习——Functional Connectivity

今天基于结构像和功能像数据试验操作TMStarget 的第二个功能模块Functional Connectivity。参考季老师的文档PPT来学习的&#xff0c;整个处理过程蛮长的&#xff0c;可能配置原因一路上报错也比较多&#xff0c;下面还是逐步记录吧&#xff0c;后面采用连更的方式直到跑通后再…

微服务注册中⼼2

5.Nacos配置管理 Nacos除了可以做注册中⼼&#xff0c;同样可以做配置管理来使⽤ 5.1 统⼀配置管理 当微服务部署的实例越来越多&#xff0c;达到数⼗、数百时&#xff0c;逐个修改微服务配置就会让⼈抓狂&#xff0c;⽽且很容易出错。我们需要⼀种统⼀配置管理⽅案&#xf…

怎样把PPT上顽固的图标删了

例如&#xff1a; 解决&#xff1a; 首先打开下载好的PPT模板&#xff0c;然后在视图选项卡里面找到幻灯片母版。 进入幻灯片母版后&#xff0c;找到第一页母版页就会看到LOGO了&#xff0c;这时使用鼠标就可以选中删除啦。

【论文阅读】PolarNet: 3D Point Clouds for Language-Guided Robotic Manipulation

Abstract 基于自然语言指令的机器人理解和执行操作任务的能力是机器人的长期目标。语言引导操作的主要方法使用 2d 图像表示&#xff0c;这在组合多视图相机并推断精确的 3d 位置和关系方面存在困难。为了解决这些限制&#xff0c;我们提出了一种基于三维点云的policy&#xf…

供方软件供应链安全保障要求及开源场景对照自评表(下)

国标《信息安全技术 软件供应链安全要求》确立了软件供应链安全目标&#xff0c;规定了软件供应链安全风险管理要求和供需双方的组织管理和供应活动管理安全要求。 开源软件供应链作为软件供应链的一种特殊形式&#xff0c;该国标亦适用于指导开源软件供应链中的供需双方开展组…

专业化的自动化解决方案 VM5XX系列模块在应力应变、仪器仪表和自动化信息化领域的广泛应用

专业化的自动化解决方案 VM5XX系列模块在应力应变、仪器仪表和自动化信息化领域的广泛应用 VM501系列模块是一款专业化的读数模块&#xff0c;采用了单振弦式传感器激励、频率读取和温度转换技术。该模块具有集成度高、体积小、精度高和适应能力强等优点&#xff0c;能够极大地…

力扣面试150 添加与搜索单词 - 数据结构设计 字典树

Problem: 211. 添加与搜索单词 - 数据结构设计 &#x1f469;‍&#x1f3eb; 参考题解 public class WordDictionary {// 定义一个内部类 Node&#xff0c;用于表示 Trie&#xff08;前缀树&#xff09;中的每个节点class Node{// 每个节点有一个大小为 26 的数组&#xff0c…

数据结构--顺序表的创建和增删改查操作

一、编写代码&#xff0c;完成学生管理系统&#xff0c;实现以下操作&#xff1a; 1、输入学生信息 2、任意位置插入学生信息 3、任意位置删除学生信息 4、查找任意位置学生信息 5、修改任意位置学生信息 6、表头插入学生信息 7、表尾插入学生信息 8、表头删除学生信息…