当前位置: 首页 > 科技观察

讲解Linux中“一切皆文件”的概念及对应的文件类型

时间:2023-03-20 19:29:16 科技观察

在Unix及其衍生系统如Linux系统中,一切都可以看作是一个文件。虽然这只是一个笼统的概念,但却是事实。如果有不是文件的东西,它一定是一个正在运行的进程。要理解这一点,请考虑一下您的根目录(/)中充满了不同类型的Linux文件的空间。当您创建文件或将文件传输到系统时,它会占用物理磁盘上的一些空间并且具有特定格式(文件类型)。虽然Linux系统中文件和目录没有区别,但是目录还有一个重要的作用,就是将其他文件以结构化的方式分组存放,方便查找和访问。所有硬件组件都表示为系统用来与硬件通信的文件。这些思想是对Linux中各种事物的重要阐述,因此文件、目录(在MacOSX和Windows系统中称为文件夹)、键盘、显示器、硬盘、可移动媒体设备、打印机、调制解调器、虚拟终端,以及输入/进程间通信(IPC)和网络通信等输出资源??,是定义在文件系统空间下的字节流。一切都可以看作一个文件,其最大的好处是上面列出的输入/输出资源只需要同一套Linux工具、实用程序和API。虽然在Linux中一切都是文件,但还有一些特殊文件,如套接字和命令管道。Linux文件类型之间有什么区别?Linux系统中存在三种基本文件类型:普通/常规文件特殊文件目录文件普通/常规文件它们是包含文本、数据、程序指令等的文件,是Linux系统中最常见的一种。包括以下几种:可读文件、二进制文件、图像文件、压缩文件等。特殊文件包括以下几种类型:块文件:为访问系统硬件组件提供缓存接口的设备文件。它们提供了一种通过文件系统与设备驱动程序通信的方法。块文件的一个重要特性是它们可以在指定时间内传输大量数据和信息。列出目录中的块文件:#ls-l/dev|grep"^b"输出示例brw-rw----1rootdisk7,0May1810:26loop0brw-rw----1rootdisk7,1May1810:26loop1brw-rw----1rootdisk7,2May1810:26loop2brw-rw----1rootdisk7,3May1810:26loop3brw-rw----1rootdisk7,4May1810:26loop4brw-rw----1rootdisk7,5May1810:26loop5brw-rw----1rootdisk7,6May1810loop6br-26rw----1rootdisk7,7May1810:26loop7brw-rw----1rootdisk1,0May1810:26ram0brw-rw----1rootdisk1,1May1810:26ram1brw-rw----1rootdisk1,10May1810:26ram10brw-rw----1rootdisk1,11May1810:26ram11brw-rw----1rootdisk1,12May1810:26ram12brw-rw----1rootdisk1,13May1810:26ram13brw-rw----1rootdisk1,14May1810:26ram14brw-rw----1rootdisk1,15br-may18150:26ram13brw-rw----1rootdisk1----1rootdisk1,2May1810:26ram2brw-rw----1rootdisk1,3May1810:26ram3brw-rw----1rootdisk1,4May1810:26ram4brw-rw----1rootdisk1,5May1810:26ram5...字符文件(字符):它也是一个设备文件,为访问系统硬件组件提供了一个非缓冲串行接口。它们通过一次传输一个字符的数据与设备通信来工作。列出某个目录下的字符文件:#ls-l/dev|grep"^c"输出例子crw------1rootroot10,235May1815:54autofscrw------1rootroot10,234May1815:54btrfs-controlcrw------1rootroot5,1May1810:26consolecrw------1rootroot10,60May1810:26cpu_dma_latencycrw------1rootroot10,203May1815:54cusecrw------1rootroot10,61May1810:26ecryptfscrw-rw----1rootvideo29,0May1810:26fb0crw-rw-rw-1rootroot1,7May1810:26fullcrw-rw-rw-1rootroot10,229May1810:26fusecrw------1rootroot251,0May1810:27hidraw0crw------1rootroot10,228May1810:26hpetcrw-r--r--1rootroot1,11May1810:26kmsgcrw-rw----+1rootroot10,232May1810:26kvmcrw------1rootroot10,237May1810:26loop-controlcrw------1rootroot10,227May1810:26mcelogcrw------1rootroot249,0May1810:27media0crw------1rootroot250,0May1810:26mei0crw-r-----1rootkmem1,1May1810:26memcrw------1rootroot10,57May??1810:26memory_bandwidthcrw------1rootroot10,59May1810:26network_latencycrw------1rootroot10,58May1810:26network_throughputcrw-rw-rw-1rootroot1,3May1810:26nullcrw-r-----1rootkmem1,4May1810:26portcrw------1rootroot108,0May1810:26pppcrw------1rootroot10,1May1810:26psauxcrw-rw-rw-1roottty5,2May1817:40ptmxcrw-rw-rw-1rootroot1,8May1810:26randomSymboliclinkfiles(符号链接):Symboliclinksarereferencestootherfilesonthesystem所以,symboliclinkfiles是指向其他文件的文件,可以是目录也可以是普通文件。列出某目录下的符号链接文件:#ls-l/dev/|grep"^l"输出例子lrwxrwxrwx1rootroot3May1810:26cdrom->sr0lrwxrwxrwx1rootroot11May1815:54core->/proc/kcorelrwxrwxrwx1rootroot13May1815:54fd->/proc/self/fdlrwxrwxrwx1rootroot4May1810:26rtc->rtc0lrwxrwxrwx1rootroot8May1810:26shm->/run/shmlrwxrwxrwx1rootroot15May1815:54stderr->/proc/self/fd/2lrwxrwxrwx1rootroot15May1815:54stdin->/proc/self/fd/0lrwxrwxrwx1rootroot15May1815:54stdout->/proc/self/fd/1Linux可以创建一个中使工具符号链接文件,如下:#touchfile1.txt#ln-sfile1.txt/home/tecmint/file1.txt[创建符号链接文件]#ls-l/home/tecmint/|grep"^l"[列出符号链接文件]在上面的例子中,首先我们在/tmp目录下创建了一个名为file1.txt的文件,然后创建了一个符号链接文件,将/home/tecmint/file1.txt指向/tmp/file1.txt文件。管道(Pipe)和命令管道(Namedpipe):一种将一个进程的输出连接到另一个进程的输入的文件,从而允许进程间通信(IPC)。命名管道实际上是一个文件,用于使两个进程能够相互通信,就像Linux管道一样。列出目录中的管道文件:#ls-l|grep"^p"输出示例:prw-rw-r--1tecminttecmint0May1817:47pipe1prw-rw-r--1tecminttecmint0May1817:47pipe2prw-rw-r--1tecminttecmint0May1817:47pipe3prw-rw-r--1tecminttecmint0May1817:47pipe4prw-rw-r--1tecminttecmint0May1817:47pipe5在Linux下,可以使用mkfifo工具创建命名管道,如下图:#mkfifopipe1#echo"Thisisnamedpipe1">pipe1在上面的例子中,我们创建一个名为pipe1的命名管道,然后使用echo命令添加一些数据,之后shell在处理输入数据时变为非交互式(LCTT译注:被管道占用)。然后,我们打开另一个shell终端并运行另一个命令来打印出刚刚添加到管道中的数据。#whilereadline;doecho"Thiswaspassed-'$line'";done