Linux:文件、fd

news2024/12/26 21:33:54

Linux:文件、fd

  • 前言
  • 一、C语言中常见打开文件的函数接口
  • 二、打开文件的系统调用接口
  • 三、文件描述符fd
  • 四、为何Linux下一切皆文件

前言

文件 = 内容 + 属性

 所有对文件的操作本质上就分为:对内容的修改对属性的修改
 内容是数据,属性也是数据。所以存储文件,必须同时存储文件相关的数据信息和属性信息。默认情况下文件存储在磁盘中,但由于冯诺依曼体系,CPU只能从内存中获取文件信息,对文件进行操作。所以当进程打开文件时,OS需要先将文件信息加载到内存中,在被CPU调度执行对文件进行操作!!

 一个进程可以打开多个文件,多个进程也可以打开同一个文件。所以当文件被加载到内存时,被打开的文件可能存在多个。操作系统需要对这些文件进行管理。先组织在描述!!OS会在内核数据结构中,为所有被打开的文件形成一个结构体对象。最后将所有文件结构体对象通过链表的形式链接起来,从而将对文件的管理转化为对该链表的增删查改!!

 文件按照是否被打开分为:被打开的文件(在内存中)、没有被打开的文件(磁盘中)。所以文件操作的本质就是:进程和打开文件的关系!!

一、C语言中常见打开文件的函数接口

 C语言中,打开文件的函数接口如下:

FILE *fopen(const char *path, const char *mode);

 文件打开方式:

 r Open text file for reading. 
 The stream is positioned at the beginning of the file.
 
 r+ Open for reading and writing.
 The stream is positioned at the beginning of the file.
 
 w Truncate(缩短) file to zero length or create text file for writing.
 The stream is positioned at the beginning of the file.
 
 w+ Open for reading and writing.
 The file is created if it does not exist, otherwise it is truncated.
 The stream is positioned at the beginning of the file.
 
 a Open for appending (writing at end of file). 
 The file is created if it does not exist. 
 The stream is positioned at the end of the file.
 
 a+ Open for reading and appending (writing at end of file).
 The file is created if it does not exist. The initial file position
 for reading is at the beginning of the file, 
 but output is always appended to the end of the file.
  • w方式打开,会先清理文件内容。
  • a方式打开,不会清理文件内容,直接在文件内容后追加新内容。

二、打开文件的系统调用接口

 进程打开文件,只能通过OS去打开文件。所以操作系统会为我们提供一些打开文件的系统调用接口!!
(也从侧面说明C库函数一定封装了这些系统调用接口)

 下面我们来看看操作系统都提供了哪些系统调用接口吧!

 #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);
 int creat(const char *pathname, mode_t mode);//不介绍, 和open类似,但只能以w方式打开
  1. 返回值int是文件描述符fd,类似于C语言中的FILE(真实情况是FILE中封装了fd)。创建失败时,返回-1。

  2. flags:打开文件操作时选择的标记位。正常情况下,标记位为两态的数据,即0、1。所以我们可以通过flag整型的不同比特位表示不同的标记位。最后通过按位或的方式,将所有选择的标记位结合起来。从而通过一个变量传递多个标记位!!

常见标记位:

 O_RDONLY//只读方式打开 
 O_WRONLY//写的方式打开
 O_RDWR//读写方式打开
 O_CREAT//文件不存在,创建文件
 O_TRUNC//截断清空,主要用于只读方式打开时,需要先将文件内容清空
 O_APPEND//追加的方式打开
  1. mode:新创建的文件默认要受Linux权限控制。如果没有指定权限,新创建的文件权限发生乱码!
  int fd = open("log.txt", O_CREAT | O_WRONLY | O_TRUNC);         
   if(fd < 0)    
   {    
       perror("open");    
       return 1;    
   }    
   close(fd);     

【创建文件权限乱码】:
在这里插入图片描述
【正确创建方式】:

  int fd = open("log.txt", O_CREAT | O_WRONLY | O_TRUNC, 0666);         
   if(fd < 0)    
   {    
       perror("open");    
       return 1;    
   }    
   close(fd);   

在这里插入图片描述

  • 文件以666权限创建,最终结果为664。是由于文件掩码的存在,也可通过umask系统调用接口更改文件创建的权限掩码。但不推荐,通常和系统默认掩码保持一致!!

三、文件描述符fd

 普通情况下,文件描述符是从3开始依次递增的。Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入0, 标准输出1, 标准错误2。0,1,2对应的物理设备一般是:键盘,显示器,显示器。

那文件描述符fd这的数字都表示什么?
 操作系统需要对文件进行管理,在Linux中,OS会为每一个被打开的文件形成对应的描述结构体对象(Linux中被称为struct file)并且操作系统会将所有被打开文件的描述结构体对象通过链表形式链接起来。

 但每一个进程可能打开多个文件,多个进程可能打开同一个文件。并且操作系统不希望每个管理模块间耦合度过大。所以操作系统为了让进程和对应的打开文件关联起来,操作系统会在进程的PCB中维护一个结构体指针(struct files_struct*),该指针指向一张进程文件描述符表(files_strict),该表中包含一个指针数组,每个元素都是指向被打开文件的函数指针。因此,文件描述符表本质上就是该数组中指向对应文件的元素下标!!!

在这里插入图片描述

四、为何Linux下一切皆文件

 计算机所有的底层硬件的读写方式都是不一样的,但是操作系统为了管理这些硬件也会和文件一样,生成对应的描述结构体对象(struct file)。而在所有的文件结构体中,都包含文件的读指针(read*)、写指针(write*)。对不同硬件的读写,都可以通过结构体对象中的读指针和写指针指向底层不同的硬件各自读写方式。

&emap;尽管不同硬件的读写方式不同,但操作系统为了管理会为我们抽象一层软件层。对于上层用户来说,不管是对硬件还是文件的读写操作,本质上都和控制文件一样,调用struct file结构体对象中的读写指针。所以Linux下一切皆文件!!!

 我们也将该软件层称为文件虚拟系统(VFS)。这是是多态技术的来源之一!!
在这里插入图片描述

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

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

相关文章

Jmeter(四十一) - 从入门到精通进阶篇 - Jmeter配置文件的刨根问底 - 下篇(详解教程)

宏哥微信粉丝群&#xff1a;https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介 为什么宏哥要对Jmeter的配置文件进行一下讲解了&#xff0c;因为有的童鞋或者小伙伴在测试中遇到一些需要修改配置文件的问题不是很清楚也不是很懂&#xff0c;就算修改了也是…

基于51单片机的自动浇花器电路

一、系统概述 自动浇水灌溉系统设计方案&#xff0c;以AT89C51单片机为控制核心&#xff0c;采用模块化的设计方法。 组成部分为&#xff1a;5V供电模块、土壤湿度传感器模块、ADC0832模数转换模块、水泵控制模块、按键输入模块、LCD显示模块和声光报警模块&#xff0c;结构如…

Gradio 案例——将 dicom 文件转为 nii文件

文章目录 Gradio 案例——将 dicom 文件转为 nii文件界面截图依赖安装项目目录结构代码 Gradio 案例——将 dicom 文件转为 nii文件 利用 SimpleITK 库&#xff0c;将 dicom 文件转为 nii文件更完整、丰富的示例项目见 GitHub - AlionSSS/dcm2niix-webui: The web UI for dcm2…

利用MMDetection进行模型微调和权重初始化

目录 模型微调修改第一处&#xff1a;更少的训练回合Epoch修改第二处&#xff1a;更小的学习率Learning Rate修改第三处&#xff1a;使用预训练模型 权重初始化实际使用案例init_cfg 的具体使用规则初始化器配置汇总 本文基于 MMDetection官方文档&#xff0c;对模型微调和权重…

eMMC和SD模式速率介绍

概述 在实际项目开发中我们常见的问题是有人会问,“当前项目eMMC、SD所使用模式是什么? 速率是多少?”。这些和eMMC、SD的协议中要求的,要符合协议。接下来整理几张图来介绍。 eMMC 模式介绍 一般情况下我们项目中都是会支持到HS400 8bit 1.8V,最大时钟频率为200MHZ,通…

ESP8266-01模块继电器制作手机APP远程遥控智能开关

资料下载地址&#xff1a; ESP8266-01模块继电器制作手机APP远程遥控智能开关 这是一款使用ESP8266-01模块继电器制作手机APP远程遥控智能开关&#xff0c;它能实现远程遥控、定时、倒计时控制。电路简单&#xff0c;适合新手入门制作&#xff0c;下图是用这个智能开关制作的小…

springboot项目打包部署

springboot打包的前提条件jdk必须17以后不然本地运行不来&#xff08;我用的jdk是22&#xff09; 查看自己电脑jdk版本可以参考&#xff08;完美解决Windows10下-更换JDK环境变量后&#xff0c;在cmd下执行仍java -version然出现原来版本的JDK的问题-CSDN博客&#xff09; 1、…

treejs 3D+echart实现三维旋转炫酷导航网页

treejs 3Dechart实现三维旋转炫酷导航网页https://www.bilibili.com/video/BV1SM4m1C7ki/

吴恩达深度学习笔记:优化算法 (Optimization algorithms)2.1-2.2

目录 第二门课: 改善深层神经网络&#xff1a;超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第二周&#xff1a;优化算法 (Optimization algorithms)2.1 Mini-batch 梯度下降&#xff08;Mini-b…

07-Fortran基础--Fortran指针(Pointer)的使用

07-Fortran基础--Fortran指针Pointer的使用 0 引言1 指针&#xff08;Poionter&#xff09;的有关内容1.1 一般类型指针1.2 数组指针1.3 派生类(type)指针1.4 函数指针 2 可运行code 0 引言 Fortran是一种广泛使用的编程语言&#xff0c;特别适合科学计算和数值分析。Fortran 9…

【设计模式】JAVA Design Patterns——Abstract-document(抽象文档模式)

&#x1f50d; 目的 使用动态属性&#xff0c;并在保持类型安全的同时实现非类型化语言的灵活性。 &#x1f50d; 解释 抽象文档模式使您能够处理其他非静态属性。 此模式使用特征的概念来实现类型安全&#xff0c;并将不同类的属性分离为一组接口 真实世界例子 考虑由多个部…

指针在函数的应用(C++)

一、传递地址 实参传递进函数体内后&#xff0c;生成的是实参的副本&#xff0c;在函数内改变副本的值并不影响实参。指针传递参数时&#xff0c;指针变量产生了副本&#xff0c;但副本与原变量指向的内存区域是同一个。改变指针副本指向的变量&#xff0c;就是改变原指针变量指…

Java 插入数据到Elasticsearch中进行各种类型文档的内容检索

源码下载&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1D3yszkTzjwQz0vFRozQl2g?pwdz6kb 提取码&#xff1a;z6kb 实现思路 1.搭建一个新的springboot项目&#xff0c;不会的请看我这篇博客&#xff1a;springboot项目搭建 2.添加maven依赖 <dependency><…

项目管理-案例重点知识(成本管理)

项目管理&#xff1a;每天进步一点点~ 活到老&#xff0c;学到老 ヾ(◍∇◍)&#xff89;&#xff9e; 何时学习都不晚&#xff0c;加油 三、成本管理 案例重点 成本管理 案例重点内容&#xff1a; &#xff08;1&#xff09;成本管理计划内容 &#xff08;2&#xff09;估算…

汇聚荣科技:拼多多上架商品后需要做页面推广吗?

在电商平台上&#xff0c;商品的曝光率和销量往往成正比。那么&#xff0c;当您在拼多多上架了新品&#xff0c;是不是就意味着坐等订单呢?答案显然是否定的。商品一旦上架&#xff0c;接下来需要做的就是通过有效的页面推广来增加商品的可见度&#xff0c;吸引潜在买家的注意…

23.HashMap的put方法流程

一、put方法的流程图 二、put方法的执行步骤 首先&#xff0c;根据key值计算哈希值。然后判断table数组是否为空或者数组长度是否为0&#xff0c;是的话则要扩容&#xff0c;resize&#xff08;&#xff09;。接着&#xff0c;根据哈希值计算数组下标。如果这个下标位置为空&a…

fastadmin对登录token的处理

fastadmin对token的操作 最近开发遇到一个场景&#xff0c;需要绕过验证获取登录&#xff0c;所以恶补了一下这个知识点&#xff0c;这个主要就是控制fastadmin的token的问题 代码分步实现 class Xcxuser extends Api {//关于鉴权protected $noNeedLogin [login,getopenid,…

踩坑小结:Linux安装python环境 、安装OpenSSL

一、查看python版本 查看发现&#xff0c;linux上自带了python&#xff0c;不过是2.x版本的。 二、下载python3 2.1 下载 www.python.org/downloads/s… 可在当前目录下找到相对应的版本或者最新版本下载 也可以直接下载 Python 3.10.4 下载完在服务器上选择一个目录存放…

ffmpeg使用xfade的转场特效

ffmpeg使用xfade的转场特效 1. 介绍2. ffmpeg里面的xfade3. 使用 1. 介绍 参考文档 ffmpeg是一个音视频编辑工具&#xff0c;具体的。。。。我才搞接触&#xff0c;所以不懂。 xfade是一种视频转场滤镜&#xff0c;用于在两个视频片段之间创建平滑的过渡效果。xfade的转场效果…

扭亏为盈的赛力斯,真正进入稳态了吗?

“72小时内大定破1万台”。5月15日&#xff0c;问界新M5开启全国大规模交付&#xff0c;从当前取得的成绩来看&#xff0c;赛力斯的“富贵”似乎还将延续。 其实&#xff0c;此前基于问界新M7等车型的爆火&#xff0c;赛力斯已经找到了创收轨道。财报显示&#xff0c;2024年一…