为何linux一切皆文件

1 引言

· 本文作为linux文件的基础介绍,是linux文件系列的开篇,主要面向想深入学习linux的小伙伴,最后的延伸学习部分给出了学习建议。
· 首先开门见山,给出结论:因为linux将文件作为一切可用资源的使用接口.“一切资源”包括内存、磁盘、其他各种设备、进程间的通信,还有网络通信。这是一种简化的思想,把一切资源都简化为文件展示出来,将这些对资源的操作简化为对文件的操作。
· 下面探究这个结论如何得出:

2.文件类型

通过linux文件有如下几种类型,在Linux下可用ls –al来查看:

文件描述符解释
-rw-r—r—指明了该文件是一个普通文件,以”-“开头的都是普通文件,而以”d”开头的是目录文件
brw-rw----指明了/dev/sda1是一个块设备(Block Device)文件。以”b”开头的文件都是块设备文件。
crw-rw----指明了/dev/ttyS0是一个字符设备(Chartacter Device)文件,以”c”开头的文件都是字符设备文件。
srwxrwxrwx指明了这是一个socket文件。以””开头的文件都是指明了socket文件
prwxr—r–指明了了该文件是一个管道文件。管道文件的一个属性是”p”。
lrwxrwxrwx指明了该文件是一个软链接文件(或称符号链接文件),该文件指向了另一个文件。以”l”开头的文件是软链接文件。
-rw-r—r—该文件看上去是个普通文件,但它实际上是一个硬链接文件
-rwsr-xr-x指明了该文件是一个setUid可执行文件,这是根据第四个字符”s”判断的。
-rwxr-sr-x指明了该文件是一个setGid可执行文件,这是根据第七个字符中的”s”判断的。

上述文件中,普通文件和硬链接文件并无什么区别,软连接文件只是指向了一个普通文件,所以把这些都认为是普通文件了;而块设备文件和字符设备文件统称为设备文件;socket文件和管道文件都是用作进程间通信的,只不过socket文件可以用在不同系统间的两个进程来通信,统称为通信文件。而最后两个是可以影响用户执行权限的文件,只是在普通文件上做了标记,这里不做深究,想了解的见 Linux 文件特殊权限详解[suid/sgid/t]

3.文件解析图

· 这里将文件的操作简化成一个图来描述:

操作文件
应用程序
虚拟文件系统VFS
设备文件
文件系统
特殊文件
字符设备
块设备

· 由上图可以看出,系统对文件的操作首先是通过虚拟文件系统来区分。
· 首先,普通文件是通过文件系统来访问,设备文件是通过设备文件来访问,有一个例外就是块设备可以通过文件系统的接口访问。最后特殊文件,是一些虚拟的文件系统的文件,包括proc、sysfs等。
· 大家肯定发现了,通信文件咋没讲?其实通信文件是作为网络的抽象而存在,其实是属于proc,也就是属于特殊文件中。

4.虚拟文件系统(VFS)

· 通过文件解析图,我们了解到,虚拟文件系统是文件操作的入口。linux内核通过虚拟文件系统来管理文件系统。VFS为所有的文件系统提供了统一的接口,这使得用户访问文件系统可以使用同样的系统调用,为此,所有的文件系统也必须要按照VFS定义的方式来实现。
· 而VFS只存在于内存当中,它需要将硬盘上的文件系统提取(也可说是抽象)到内存中来实现。

5.文件系统

· 对普通文件操作,用户通常使用的是open、close、read、write等函数,而这也是文件系统的基本操作。
· 这里讲的文件系统都是真实的文件系统,也就是文件是的确存在的,而不仅仅是个接口。而文件数据最重要的就是如何在这种介质上存放数据。这里依据存储介质做一个简单的分类:
1)内存文件系统
这种文件系统的文件是存储在内存当中的,主要作用就是暂存运行时的数据。特点是,掉电不保存,存储速度快。例如tmpfs。
2)磁盘文件系统
这是最主要的文件系统,最初的计算机都是用磁盘来存取数据的,因此这种类型的文件系统数量最多。例如NTFS、ext4等。
3)flash文件系统
由于flash芯片的成本不断降低,以及在嵌入式领域的广泛使用,由于flash独特的存取访视,因而也出现了很多专门针对flash的文件系统,例如jffs2、yafffs等。
· 文件系统设计上的不同,主要是由于存储介质存取效率的差异。存取效率又和应用场景、操作系统等因素关系密切。因此我们可以看到,不同操作系统的文件系统通常是不同的。

6.设备文件

· 设备文件的位置在"/dev"目录下。可以通过“ls -al”查看设备对应的设备号,设备文件的内容就是设备的唯一编号,包括主设备号和次设备号。
· 如下图所示:(不是设备文件的次设备号位置标示的是文件大小)blog.csdnimg.cn/20191127080723144.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjUyMzc3NA==,size_16,color_FFFFFF,t_70)
· 设备其实并不像文件,比如鼠标就是需要读取鼠标滑动和敲击输入的数据,这和读写不是很像,为了适应这种设备的特殊需要,linux对设备新增了ioctl接口,让各自不同的设备实现特定的ioctl。
· 而块设备是可以通过文件系统来访问的,要以这种方式访问之前,需要mount指令来挂载到对应的目录下,才能像普通文件一样访问。

7.特殊文件-socket文件

· 对于特殊文件,例如sysfs和proc,都是作为显示系统信息而存在的特殊文件系统,sysfs是显示设备、驱动和总线间关系的文件系统,而proc则将大量内核中的信息以及可调参数作为文件方式来显示,包括各个进程使用的情况,这些文件都是只读文件。socket文件就是作为一种特殊的服务显示在每个进程的内容中。我们知道socket常被用作进程间通信的工具,这样的socket文件通常放到/var目录中。
· 相比于设备文件,socket文件更不像文件了。因为要使用网络通信,重要的是各种网络协议的选择,以及各种属性的配置。通过socket函数的定义,我们就能明白,这个比open一个文件复杂的多,因此需要另外设计了一些接口(例如; socket、bind、listen、connect、send、recv等),但是read、write和close仍然还是可以使用的。

8.延伸学习

· linux一切皆文件,这种思想的目的是简化对资源的操作,让应用开发变得简单方便,但也是这样,导致对不太像文件的设备和socket需要提供定制接口,因此这两块内容的学习也比较难以理解,当然也由于这两块本身就很复杂(+﹏+) 。
· 因此想进一步深入学习的同学可以有以下方向:
(1) 对设备操作感兴趣的,可以了解设备驱动程序开发,推荐宋宝华老师的《Linux设备驱动开发详解》
(2) 对网络设备感兴趣的,推荐《TCPIP详解》(讲理论)和 《深入理解LINUX网络技术内幕》(讲实践)
(3) 对各种系统操作感兴趣的,推荐《 UNIX环境高级编程》和《Linux UNIX系统编程手册》嘿嘿,这两本书相比,前者更注重全面,后者更注重深度。
(4) 如果对各种文件系统感兴趣,就要看各种文件系统的源码了,这也是我后续的写作方向,后续我会深入内核源码,分析文件从应用层通过内核如何一步步到达磁盘。

如果觉得我的文章还有点收获,就点个赞吧! d=====( ̄▽ ̄*)b

下一篇:https://blog.csdn.net/weixin_42523774/article/details/103341058

  • 8
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值