天助网站公司建设官方网站
2026/6/1 5:21:56 网站建设 项目流程
天助网站,公司建设官方网站,ps做的网站保存不了jpg,郑州网站建设哪家公司便宜当你在 Linux 终端输入touch test.txt创建一个文件#xff0c;或用cat log.txt查看日志时#xff0c;是否想过#xff1a;“文件” 到底是什么#xff1f; 为什么 Linux 里连键盘、显示器甚至进程都被叫做 “文件”#xff1f;这篇文章会从最直观的 “磁盘文件” 入手或用cat log.txt查看日志时是否想过“文件” 到底是什么为什么 Linux 里连键盘、显示器甚至进程都被叫做 “文件”这篇文章会从最直观的 “磁盘文件” 入手逐步带你理解 Linux “一切皆文件” 的核心哲学为后续学习 IO 操作打下坚实基础。文章目录一、狭义理解磁盘上的 “真实文件”1.1 磁盘文件的 “永久储藏室”1.2 文件的 “双重身份”内容 属性关键知识点0KB 空文件为什么也占空间1.3 对文件的所有操作都围绕 “内容” 或 “属性”二、操作文件的两个 “角色”进程与系统2.1 进程文件的 “使用者”2.2 操作系统文件的 “管理者”三、广义理解Linux 的 “一切皆文件” 哲学3.1 不止磁盘这些 “非文件” 也是 “文件”3.2 实战感受亲手操作 “特殊文件”实验 1读进程状态/proc 文件系统实验 2写显示器/dev/tty实验 3读键盘/dev/stdin3.3 为什么要 “一切皆文件”统一接口的魔力1. 降低开发难度一套接口走天下2. 保证系统一致性权限与管理统一四、“一切皆文件” 的底层逻辑统一接口的实现4.1 核心结构体 1struct file—— 文件的 “身份证”4.2 核心结构体 2struct file_operations—— 文件的 “操作手册”五、扩展Linux 与 Windows 文件模型的差异六、总结理解 “文件”开启 Linux IO 之旅一、狭义理解磁盘上的 “真实文件”我们日常说的 “文件”大多是指存放在硬盘或 SSD里的文本、图片、视频等数据 —— 这就是 Linux 中文件的狭义定义。要理解它我们得先搞清楚 “文件的家”磁盘和 “文件的本质”。1.1 磁盘文件的 “永久储藏室”首先要明确一个关键点磁盘是 “永久性存储介质”。和内存断电数据消失不同磁盘里的数据即使关机也不会丢失 —— 这也是我们把文件存在磁盘里的原因。同时磁盘还有一个特殊身份外设既可以输入数据也可以输出数据。输入Input从磁盘读取数据到内存比如打开test.txt输出Output从内存写入数据到磁盘比如保存编辑后的test.txt。这种 “和磁盘交换数据” 的过程就是我们常说的IOInput/Output输入输出。所以对文件的所有读写操作本质都是和磁盘的 IO 交互—— 这也是 “文件操作” 和 “IO” 总是绑在一起的原因。1.2 文件的 “双重身份”内容 属性很多人以为 “文件就是里面存的数据”但实际上Linux 中的文件由两部分组成缺一不可内容Data文件实际存储的信息比如文本里的文字、图片的像素数据属性Metadata元数据描述文件的 “说明书”比如文件名、大小、创建时间、权限谁能读 / 写、所属用户等。关键知识点0KB 空文件为什么也占空间你可能注意过用touch empty.txt创建的空文件大小显示 0KB在磁盘上依然会占用少量空间通常是几个字节到几十字节。原因很简单空文件没有内容但必须存储属性信息—— 比如文件名empty.txt、创建时间2024-11-23、权限-rw-r--r--等这些属性需要占用磁盘空间存储在 Linux 的inode结构中后续文章会详细讲。我们可以用ls -l命令直观看到文件的属性# 查看空文件的属性大小0但有创建时间、权限等ls-l empty.txt其中-rw-r--r--是权限1是硬链接数user是所属用户0是内容大小Nov 23 10:00是创建时间empty.txt是文件名 —— 这些都是文件的属性。1.3 对文件的所有操作都围绕 “内容” 或 “属性”无论是日常用的cat读内容、echo hello test.txt写内容还是chmod 755 test.sh改权限属性、mv old.txt new.txt改文件名属性本质都是在操作文件的 “内容” 或 “属性”。比如vim test.txt先读文件的 “内容” 和 “属性”比如权限是否允许编辑编辑后再写回 “内容”ls -lh只读取文件的 “属性”大小、权限、时间不读取 “内容”。二、操作文件的两个 “角色”进程与系统文件不会 “自己动”必须通过程序来操作。这里有两个关键角色进程执行者和操作系统管理者它们的分工不同但共同完成文件操作。2.1 进程文件的 “使用者”你打开一个文件时不是 “你” 在操作文件而是进程在操作。比如用 Chrome 打开report.pdf是chrome进程在读取report.pdf的内容用gcc编译main.c是gcc进程在读取main.c的内容再生成a.out文件写内容。进程就像 “员工”它需要使用文件比如读取配置、写入日志但它不能直接 “接触” 磁盘 —— 因为磁盘是由操作系统统一管理的 “公共资源”不允许进程直接操作否则会导致数据混乱比如多个进程同时写一个文件。2.2 操作系统文件的 “管理者”操作系统就像 “管理员”负责管理磁盘上的所有文件以及协调进程对文件的操作。这里有一个很重要的细节我们写代码时用的 C 库函数如fopen、fwrite并不是直接操作磁盘。真实的流程是这样的plaintext用户代码C库函数 → 系统调用如open、write → 操作系统 → 磁盘C 库函数如fopen是 “包装器”把复杂的系统调用逻辑简化让开发者更容易使用系统调用如open是用户程序和操作系统的 “桥梁”进程通过系统调用向操作系统 “申请” 操作文件操作系统收到申请后调用磁盘驱动程序完成实际的磁盘读写。举个例子当你用fwrite往文件写数据时流程是你的代码调用fwriteC 库函数fwrite内部调用write系统调用告诉操作系统 “我要往某个文件写数据”操作系统检查文件权限比如是否允许写然后调用磁盘驱动把数据写入磁盘操作系统返回结果给writewrite再返回给fwrite最终告诉你 “写入成功”。三、广义理解Linux 的 “一切皆文件” 哲学到这里你可能觉得 “文件就是磁盘里的东西”—— 但 Linux 的强大之处在于它把几乎所有系统资源都抽象成了 “文件”这就是文件的广义定义。3.1 不止磁盘这些 “非文件” 也是 “文件”在 Linux 中以下这些你以为 “不是文件” 的东西本质上都是 “文件”可以用操作文件的接口如read、write来操作资源类型对应的 “文件” 路径示例操作示例用文件接口键盘/dev/input/event0不同设备路径可能不同cat /dev/input/event0读按键显示器/dev/tty1当前终端echo hello /dev/tty1写显示进程/proc/1234/statusPID 为 1234 的进程cat /proc/1234/status读进程状态磁盘/dev/sda1第一个磁盘的第一个分区fdisk /dev/sda1管理磁盘分区网卡/sys/class/net/eth0网卡 eth0cat /sys/class/net/eth0/address读 MAC 地址管道进程间通信匿名管道或mkfifo创建的命名管道echo hi pipe写管道是不是很神奇比如你可以用cat /proc/self/status查看当前终端进程的状态self代表当前进程输出结果里会有进程 ID、内存占用、CPU 使用等信息 —— 这些信息被 Linux 封装成了 “文件”你用读文件的方式就能获取。3.2 实战感受亲手操作 “特殊文件”光说不练假把式我们来做几个小实验感受 “一切皆文件”实验 1读进程状态/proc 文件系统bash# 查看当前终端进程的状态self代表当前进程cat/proc/self/status# 输出结果会包含# PID: 12345进程ID# VmSize: 1234 kB虚拟内存大小# Cpus_allowed: ffffffff允许使用的CPU核心这里的/proc是一个 “虚拟文件系统”里面的文件不存放在磁盘上而是由内核动态生成 —— 但它的接口和普通文件完全一样你用cat就能读。实验 2写显示器/dev/ttybash# 往当前显示器/dev/tty写内容echo我在直接操作显示器文件/dev/tty# 你会看到终端上直接显示这句话显示器本来是 “输出设备”但 Linux 把它抽象成文件后你用write或echo 就能往它 “写” 数据也就是显示内容。实验 3读键盘/dev/stdinstdin是 “标准输入”默认对应键盘它的本质也是一个文件文件描述符为 0bash# 从stdin键盘读数据再写回stdout显示器read-r msg/dev/stdinecho你输入了$msg/dev/stdout# 运行后输入任意内容按回车会显示你输入的内容这里的/dev/stdin就是键盘的 “抽象文件”read命令本质上是调用read系统调用从/dev/stdin读数据。3.3 为什么要 “一切皆文件”统一接口的魔力Linux 把所有资源抽象成文件不是 “为了抽象而抽象”而是为了解决两个核心问题1. 降低开发难度一套接口走天下如果没有 “一切皆文件”开发者需要学习不同的接口来操作不同的资源操作磁盘文件用file_read、file_write操作键盘用keyboard_read、keyboard_write操作进程用process_read、process_write…但有了 “一切皆文件”开发者只要学会一套 IO 接口如open、read、write、close就能操作所有资源。比如读磁盘文件read(fd, buf, size)读键盘read(stdin_fd, buf, size)stdin_fd是 0读进程状态read(proc_fd, buf, size)这就像 “万能钥匙”一把钥匙能开所有门 —— 极大降低了学习成本和开发难度。2. 保证系统一致性权限与管理统一Linux 的权限控制如r读、w写、x执行也是基于 “文件” 设计的。对于 “特殊文件”如设备文件同样可以用权限来控制访问bash# 查看显示器文件的权限ls-l /dev/tty1# 输出crw--w---- 1 root tty 4, 1 Nov 23 10:00 /dev/tty1这里的crw--w----中c表示是 “字符设备文件”rw-所有者root有读、写权限--w所属组tty有写权限---其他用户没有权限。如果普通用户想往/dev/tty1写内容会因为权限不足失败 —— 这和普通文件的权限控制逻辑完全一致。四、“一切皆文件” 的底层逻辑统一接口的实现你可能会问“不同资源的操作逻辑完全不同比如读键盘和读磁盘怎么用同一套接口实现” 答案藏在 Linux 内核的两个核心结构体里struct file和struct file_operations。4.1 核心结构体 1struct file—— 文件的 “身份证”每当一个文件包括设备、进程等被打开时Linux 内核会创建一个struct file结构体用来记录这个文件的 “关键信息”比如f_inode指向文件的inode存储文件属性如权限、大小f_op指向struct file_operations文件的操作函数集f_pos当前读写位置比如读文件读到了第 100 字节f_pos就是 100f_flags文件的打开标志比如只读、只写。简单说struct file就是这个 “文件” 的 “身份证”记录了 “它是谁”“能怎么操作它”“当前操作到哪了”。4.2 核心结构体 2struct file_operations—— 文件的 “操作手册”struct file_operations是一个 “函数指针集合”里面存储了操作这个文件的所有函数比如读、写、打开、关闭。不同类型的 “文件”会实现不同的函数逻辑但函数名和参数列表是统一的。比如对于磁盘文件read函数的逻辑是 “从磁盘扇区读取数据到内存”对于键盘文件read函数的逻辑是 “从键盘缓冲区读取按键数据到内存”对于进程文件如/proc/1234/statusread函数的逻辑是 “从内核进程管理模块获取进程状态生成文本数据返回”。举个具体的例子当你用read读键盘/dev/input/event0时流程是你的代码调用read(fd, buf, size)其中fd是键盘文件的文件描述符内核通过fd找到对应的struct filestruct file的f_op指针指向键盘文件的struct file_operations内核调用f_op-read键盘驱动实现的read函数读取键盘数据数据通过read返回给你的代码。这个过程中你完全不用关心 “这是键盘还是磁盘”只要调用read就行 —— 因为接口是统一的。五、扩展Linux 与 Windows 文件模型的差异理解 “一切皆文件” 后我们可以对比一下 Linux 和 Windows 的文件模型更能体会 Linux 的设计巧思对比维度LinuxWindows资源抽象一切皆文件设备、进程、网卡等区分文件、设备、注册表等不同资源接口不同操作接口统一的 IO 接口read、write等不同资源用不同 API如文件用ReadFile设备用DeviceIoControl权限控制基于文件权限rwx统一控制文件权限、设备权限分开控制虚拟文件系统广泛使用如/proc、/sys部分支持如\\.\设备路径但不如 Linux 统一比如在 Windows 中你要读进程状态需要用CreateToolhelp32Snapshot等专门的 API而在 Linux 中直接用read读/proc文件就行 —— 这就是 “一切皆文件” 带来的简洁性。六、总结理解 “文件”开启 Linux IO 之旅这篇文章我们从 “狭义文件”磁盘上的内容 属性讲到 “广义文件”Linux 的资源抽象核心要点可以总结为 3 句话文件的本质狭义是磁盘上的内容 属性广义是 Linux 对所有资源的抽象操作逻辑进程通过 “C 库→系统调用→操作系统” 的流程操作文件不能直接操作硬件“一切皆文件” 的价值统一接口降低开发难度统一权限保证系统一致性。理解这些你就打通了 Linux IO 的 “任督二脉”—— 后续我们会深入学习 C 库 IO 接口、系统调用、文件描述符、重定向等内容所有知识点都建立在 “文件” 的基础上。下一篇文章我们将聚焦 “C 语言标准库 IO 接口”手把手教你用fopen、fread、fwrite等函数操作文件从 “会用” 到 “理解原理”。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询