Linux:文件 | 文件描述符 | Linux下一切皆文件

Linux文件描述符原理与实战应用详解 文件描述符是Linux系统编程的核心概念之一,作为进程访问I/O资源的统一接口,它实现了'一切皆文件'的设计哲学。从技术原理看,每个文件描述符对应内核中的一个file结构体,通过VFS层抽象实现了对各类设备的一致访问。这种设计不仅提供了统一的open/read/write/close操作接口,还支持I/O多路复用、非阻塞操作等高级特性,成为实现高并发服务的基础。在实际开发中,文件描述符管理涉及进程间通信、容器化环境等复杂场景,合理使用dup2、fcntl等系统调用能显著提升程序性能。掌握文件描述符的底层机制 阅读详情

前言

 所有对文件的操作本质上就分为:对内容的修改和对属性的修改。
 内容是数据,属性也是数据。所以存储文件,必须同时存储文件相关的数据信息和属性信息。默认情况下文件存储在磁盘中,但由于冯诺依曼体系,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*),该指针指向一张进程文件描述符表(struct files_struct),该表中包含一个指针数组,每个元素都是指向被打开文件的函数指针。因此,文件描述符表本质上就是该数组中指向对应文件的元素下标!!!

在这里插入图片描述

四、为何Linux下一切皆文件

 在计算机中,所有硬件的读写操作的方法必然不同。但操作系统作为计算机中软硬件资源的管理者,需要对计算机中的所有硬件进行管理!
 所以OS会为每一个硬件形成一个描述结构体,该结构体中不仅包含对应硬件的属性字段,还包含对应硬件的读写指针,该指针指向底层不同硬件具体的读写方法。虽然对不同硬件的读写操作存在差异,但站在用户的角度,不管是对硬件读写操作还是对文件读写操作,本质都是通过对应的描述结构体中的读写指针来进行读写!所以Linux下一切皆文件!!!

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

用Matlab机器人工具箱搞定六轴机械臂建模:从DH参数到3D可视化(附完整代码) 本文详细介绍了如何使用Matlab机器人工具箱进行六轴机械臂建模,从DH参数输入到3D可视化全流程解析。通过正运动学验证、逆运动学求解和交互控制等实战技巧,帮助工程师快速掌握机械臂建模核心方法,并提供完整代码示例解决常见问题。 阅读详情

相关推荐

惊呆了!Oracle 11g从入门到放弃的保姆级指南(新手必看)

本文为Oracle 11g数据库新手提供了一份详尽的入门指南。内容涵盖从安装配置、SQL*Plus工具使用、核心的SQL增删改查操作,到事务、索引等进阶概念的解析。文章旨在帮助初学者避开常见陷阱,快速掌握这一经典关系型数据库管理系统的基本操作与核心技能,实现从入门到上手。

ooo22的博客 266

Linux下 文件描述符(fd)与 文件指针(FILE*)

一、文件描述符(fd)我们都知道在Linux下一切皆文件。当然设备也不例外,如果要对某个设备进行操作,就不得不打开此设备文件,打开文件就会获得该文件的文件描述符fd( file discriptor), 它就是一个很小的整数,每个进程在PCB(Process Control Block)中保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针。 图中文件描述符

MaHua的博客 2万+

逆向分析PerimeterX px3:从混淆JS到生成有效令牌的完整实战

在Web安全与数据采集领域,反自动化防护是保障服务稳定和数据安全的关键技术。其核心原理是通过收集浏览器环境指纹和用户行为特征,动态生成加密令牌来区分真人用户与自动化脚本。这项技术的工程价值在于平衡安全性与用户体验,广泛应用于电商、金融、社交等需要防止恶意爬虫和自动化攻击的场景。本文聚焦于业界广泛部署的PerimeterX px3防护方案,通过JavaScript逆向工程,深入剖析其令牌生成机制。我们将探讨如何运用动态调试、反混淆工具和算法还原等关键技术,突破px3的防护壁垒,为自动化测试和数据采集提供稳定可

diankui6178的博客 533

Linux——基础IO(一)(系统I/O接口,文件描述符及底层原理)

Linux基础I/O(一)1.C语言中的文件操作1.1写入文件1.2写到显示器1.3追加操作1.4总结(打开文件的方式)2.系统文件I/O2.1接口介绍2.2文件的描述符三级目录 1.C语言中的文件操作 1.1写入文件 1.2写到显示器 1.3追加操作 1.4总结(打开文件的方式) (a,a+,w,w+,r,r+) 说明普通文件和显示器文件在代码层面上没有区别 文件操作都会默认打开三个输入输出流(stdin,stdout,stderr) 三个流的类型都是FILE*, fopen返回值类型,文件指针

今天你AC了吗 594

手教你如何使用Simulink和相关工具箱模拟和实现无人机的多机接力信号中继的建模

扩大通信范围:单架无人机的通信能力有限,通过多机接力的方式可以显著扩展通信覆盖范围。提高可靠性:当某架无人机出现故障或电量不足时,其他无人机可以接管其任务,确保通信不中断。适应复杂环境:在山区、森林等复杂地形中,多机接力可以绕过障碍物,建立稳定的通信链路。使用Communications Toolbox中的模块来模拟无线通信链路。例如,可以使用模块模拟噪声信道,或者使用模块计算信号衰减。matlab深色版本。

MHD0815的博客 767

基于Codex Skill的抖音爆款分析与带货视频自动化生成实战

这次我们来看一个基于 Codex 的自动化内容创作项目。核心是利用 Codex 平台的能力,通过自定义的 Skill(技能)来拆解抖音爆款博主的视频模式,并自动生成自己的带货视频。对于内容创作者、电商运营或对短视频自动化感兴趣的技术开发者来说,这是一个将大语言模型(LLM)能力与具体业务场景深度结合的实战案例。 项目的核心价值在于流程自动化。它试图解决一个常见痛点:分析爆款视频的脚本结构、话术、节奏需要大量人工,而模仿创作又耗时费力。通过 Codex 的 Skill 机制,可以将“分析”和“生成”这两个环节

weixin_30420305的博客 383

linux 读文件返回-1,Linux中对文件描述符的操作(FD_ZERO、FD_SET、FD_CLR、FD_ISSET

在Linux中,内核利用文件描述符(File Descriptor)即文件句柄,来访问文件。文件描述符是非负整数。打开现存文件或新建文件时,内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。宏FD_ZERO、FD_SET、FD_CLR、FD_ISSET中“FD”即为file descriptor的缩写,下面来一一进行介绍。首先介绍一个重要的结构体:fd_set,它会作为下面...

weixin_30587041的博客 1025

FPGA上的YOLOv8加速实现:从Verilog到高层综合

YOLOv8 采用了更高效的C2f模块与轻量化Backbone结构,模型特征包括:结构紧凑、检测头融合高低层特征;支持Anchor-free检测机制;支持INT8、FP16低精度推理;计算密度高,适合FPGA并行优化。

2501_93174773的博客 917

文件描述符fd与文件指针FILE*的关系

文件指针是指向一个FILE的结构体,这个结构体里包括一个文件描述符(在Windows下也被称为文件句柄)和一个I/O缓冲区。文件描述符用于ANSI C标准的IO库调用中,用于标识文件。FILE中包含文件描述符元素,可以用fopen()直接获取指针fp,然后使用fp获得fp中所包含文件描述符fd的信息。文件描述符应该是唯一的,而文件指针却不是唯一的,但指向的对象是唯一的。FILE *比fd更

z517602658的博客 5340

华为od 面试八股文_前端_03_含答案

华为od 面试八股文_前端_03_含答案

MISAYAONE的博客 2130

MTK AWB 色温曲线的进一步猜想

平均距离来判断是否对该色温下白平衡进行全部收白处理,还是保留一些光源的本身的颜色。比如占据图像一大半左右的纯色背景,纵坐标值相对横坐标的距离应该会比较大,大于一般场景下的正常白点分布。反之,位于Plank_curve下方位置的点具有偏洋红色的倾向。此时拟合各个色温下的白点,拟合曲线大致是以X= 0.85)平行于横轴的一条直线。对原始坐标系中的点取对数后的Log坐标系空间。此时拟合各个色温下的白点,拟合曲线大致呈现的是一条直线。,可以认为是各种色温下白点分布所呈现的走向。的算法利用某个色温点的偏离。

大熊 722

文件描述符fd

文件描述符 在linux中open函数调用成功后会返回一个非负整数,这个非负整数就是文件描述符。 Linux 默认情况下会缺省打开三个文件描述符 标准输入0 标准输出1 标准错误2 0 1 2 对应的物理设备一般是: 键盘 显示器 显示器 文件描述符就是从0开始的小整数。当我们打开文件时,操作系统需要创建相应的数据结构来描述目标文件 file结构体 表示一个已经打开的文件对象。当进程执行op...

M_jianjianjiao 3550

如何用Python编程实现算术割圆术?

第10章 割圆术 Python编程要点 from … import …语句 math模块的sqrt()函数 round()函数 10.1 图解九章 {:–}觚( gū ):正多边形。“六觚”即正六边形,“十二觚”即正十二边形。 图10-1 六觚、十二觚、二十四觚 提示 图10-1所示由图解九章源码中的“图解割圆术.py”自动绘制而成,我们可运行脚本文件,查看动态的绘制过程。 割六觚以...

人邮异步社区 3237

《Linux “一切皆文件” 的核心密码:彻底搞懂文件描述符 fd》

摘要:Linux系统中,文件描述符(fd)是进程访问各类资源的统一接口,采用非负整数作为索引。其核心设计包含三层映射:进程级的文件描述符表、系统级的文件表(记录偏移量等状态)和i-node表(存储文件元信息)。每个进程默认拥有0(stdin)、1(stdout)、2(stderr)三个fd,遵循最小可用分配原则。fd支持IO重定向(如>)、管道(|)和网络通信,体现"一切皆文件"理念。关闭fd仅释放编号,需所有引用关闭才会回收文件资源。

c23856的博客 425

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Linux文件描述符的分配机制与重定向实现:揭开“一切皆文件”的面纱

上篇我们介绍了语言和系统层次的基础I/O文件操作,其涉及的知识有:C语言文件操作和系统调用接口两者的关系、文件描述符的概念、操作系统对文件的管理等。本篇我们将承接上一篇文章以继续深入探讨Linux中文件操作。

2301_80774875的博客 2883

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

一文吃透 Linux 文件描述符:揭开「一切皆文件」的底层逻辑

在 Linux 系统中,文件描述符(File Descriptor)是一个非负整数,它是进程访问文件或其他 I/O 资源(如套接字、管道等)的唯一标识。简单来说,文件描述符就像是一个 “资源索引”,它指向内核中被打开的文件或资源,是进程与内核之间进行文件操作的桥梁。需要注意的是,文件描述符本身并不是文件,而是一个指向文件或资源的标识符。每个进程都维护着一个独立的文件描述符表(File Descriptor Table),这个表记录了该进程当前打开的所有文件描述符及其对应的内核文件对象。

m0_60259116的博客 413

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【Linux系统编程:基础IO 上】简单复习C语言文件接口 | 学习系统文件接口 | 认识文件描述符 | Linux下,一切皆文件 | 重定向原理

关于进程,我们还要再往下学习进程间通信、进程信号,但是在这之前,我们先学习基础IO,这篇文章穿插在进程中并不奇怪,因为它有着承上启下的作用。文件的宏观理解那么文件在哪呢?——广义上理解,键盘、显示器等都是文件,因为我们说过“Linux下,一切皆文件”,当然我们现在对于这句话的理解是片面的;狭义上理解,文件在磁盘上,磁盘是一种永久存储介质,不会受断电的影响,磁盘也是外设之一,所以对文件的所有操作,都是对外设的输入输出,简称IO(Input、Output)。文件的组成。.........

DanceBit的博客 2255

Linux系统编程-文件操作(一):文件描述符(Linux系统中,一切皆文件)【文件描述符是非负整数,是文件的标识】【打开现存文件或新建文件时,系统(内核)会返回一个文件描述符,用来指定已打开的文件】

打开现存文件或新建文件时,系统(内核)会返回一个文件描述符,文件描述符用来指定已打开的文件。这个文件描述符相当于这个已打开文件的标号,文件描述符是非负整数,是文件的标识,操作这个文件描述符相当于操作这个描述符所指定的文件。程序运行起来后(每个进程)都有一张文件描述符的表,标准输入、标准输出、标准错误输出设备文件被打开,对应的文件描述符 0、1、2 记录在表中。在程序运行起来后打开其他文件时,系统会返回文件描述符表中最小可用的文件描述符,并将此文件描述符记录在表中。在 Linux 的世界里,一切设备皆文件。

u013250861的博客 375

万字长文外加示例:进入内核理解Linux 文件描述符(fd) 和 “一切皆文件” 理念

fd 看起来只是一个普通的 int,但它几乎贯穿了 Linux 中所有 I/O 行为。本文从用户态现象出发,一路深入内核,顺着 current → files_struct → struct file 这条主线,拆解 fd 的真实语义与生命周期。你将看到open等在内核里究竟做了什么,为什么 close 不等于释放,epoll 又为何绕过 fd 直接绑定 file。如果你写过高并发 I/O,却始终对 fd 的边界和抽象感到模糊,这篇文章会从源码和设计哲学层面,把 Linux I/O 的世界观一次性讲清楚。

a1933580388的博客 880

Linux下文件描述符(一)

Linux系统一切皆文件(目录、字符设备、块设备、 套接字、打印机等)屏蔽了硬件的区别,所有设备都抽象成文件,提供统一的接口给用户。这就是“一切皆是文件”的思想,因此文件描述符也非常重要。 文件描述符是个最小的正整数,它是一个索引值,指向内核为每个进程所维护的该进程打开文件的记录表。每个进程启动时候都打开三个文件:1.标准输入文件(stdin)2.标准输出(stdout)3.标准出错(stder

huangshanchun的专栏 931

Linux中“一切皆文件”

“一切皆文件” 在linux开发过程中,相信大家都听过一句话叫作“limux下,一切皆文件”。这句话是linux/unix的哲学核心思想,下面我们就针对这句话给大家进行展开解释下。 这句话中的“文件”不仅仅是我们通常所指的文件,在linux和unix中它代表的更为宽泛。目录、字符设备、块设备、 套接字、进程、线程、管道等都被视为是一个“文件”,那么既然这样当我们建立一个文件时,我们如何来操

bian_qing_quan11的博客 1万+

linux 程序文件描述符,Linux下文件描述符(一)

Linux系统一切皆文件(目录、字符设备、块设备、 套接字、打印机等)屏蔽了硬件的区别,所有设备都抽象成文件,提供统一的接口给用户。这就是“一切皆是文件”的思想,因此文件描述符也非常重要。文件描述符是个最小的正整数,它是一个索引值,指向内核为每个进程所维护的该进程打开文件的记录表。每个进程启动时候都打开三个文件:1.标准输入文件(stdin)2.标准输出(stdout)3.标准出错(stderr)...

weixin_39710361的博客 306

万字解析文件fd,深刻理解:fd文件描述符、位图、标准输入、标准输出、标准错误、文件打开、文件关闭、Linux一切皆文件理解、进程和文件的关系、虚拟软件系统

什么是文件?打开文件是什么意思?怎么打开文件?关闭文件又是什么意思?怎么关闭文件?打开的文件怎么管理?关闭的文件又怎么管理?为什么要管理?如何管理?文件路径是什么意思?什么是位图?我们不能仅从语言角度去理解文件,还需要站在操作系统的角度去理解才能全面。所以,本文将会从操作系统的角度去深刻理解文件。同时,回答上述的若干问题。

qq_51216031的博客 1566

linux中fd的几点理解——一切皆文件

fd 全称是 file descriptor,文件描述符,又称句柄。当我们在打开一个文件,创建一个 socket, 创建一个 epoll 时,返回值往往都用一个变量 int fd 来表示。

weixin_38184628的博客 5597

揭开Linux的隐藏约定:你的第一个文件描述符为什么是3?

/ 刷新方式int fileno;// 文件描述符// 输出缓冲区int size;// 当前缓冲区大小int cap;// 缓冲区容量// 主要接口核心实现逻辑mfwrite()将数据复制到缓冲区根据刷新策略(行缓冲/全缓冲)决定何时写入mfflush()将缓冲区内容通过write()系统调用写入文件mfclose()确保所有缓冲数据被刷新分层抽象:从系统调用到库函数,层层封装,各司其职统一接口:“一切皆文件”简化了系统设计和使用性能优化。

2302_80357424的博客 736

Linux Kernel 设计思路与原理详解:从“一切皆文件“到模块化架构(超详细)

Linux内核设计哲学:统一抽象与模块化架构 摘要:Linux内核的成功源于其独特的设计理念,核心是"一切皆文件"的抽象思想。通过将各类硬件设备、进程信息和系统资源统一抽象为文件描述符,Linux实现了简洁一致的I/O操作接口。这种设计不仅简化了编程模型(如使用相同的read/write接口操作磁盘文件、网络套接字和终端设备),还通过虚拟文件系统(VFS)层实现了具体实现的解耦。内核采用模块化分层架构,各层通过明确定义的接口通信,支持动态加载内核模块,极大增强了系统的可扩展性。

weixin_71604156的博客 1231
上一篇: 进程并发究竟是如何进行进程切换的?Linux内核原理解析
下一篇: Linux文件:重定向底层实现原理(输入重定向、输出重定向、追加重定向)
小白debug~
小白debug~ 新星创作者: C/C++技术领域 新星创作者: C/C++技术领域
博客等级 码龄4年 3510粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白debug~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值