在Unix和它衍生的比如Linux系统中,一切都可以看做文件。虽然它仅仅只是一个泛泛的概念,但这是事实。如果有不是文件的,那它一定是正运行的进程。 要理解这点,可以举个例子,您的根目录(/)的空间充斥着不同类型的Linux文件。当您创建一个文件或向系统传输一个文件时,它会在物理磁盘上占据的一些空间,而且是一个特定的格式(文件类型)。 虽然Linux系统中文件和目录没有什么不同,但目录还有一个重要的功能,那是有结构性的分组存储其它文件,以方便查找访问。所有的硬件组件都表示为文件,系统使用这些文件来与硬件通信。 这些思想是对Linux中的各种事物的重要阐述,因此像文档、目录(MacOSX和Windows系统下称之为文件夹)、键盘、监视器、硬盘、可移动媒体设备、打印机、调制解调器、虚拟终端,还有进程间通信(IPC)和网络通信等输入/输出资源都是定义在文件系统空间下的字节流。 一切都可看作是文件,其显著的好处是对于上面所列出的输入/输出资源,只需要相同的一套Linux工具、实用程序和API。 虽然在Linux中一切都可看作是文件,但也有一些特殊的文件,比如套接字和命令管道。 Linux文件类型的不同之处? Linux系统中有三种基本的文件类型: · 普通/常规文件 · 特殊文件 · 目录文件 · 普通/常规文件 它们是包含文本、数据、程序指令等数据的文件,其在Linux系统中是常见的一种。包括如下: · 可读文件 · 二进制文件 · 图像文件 · 压缩文件等等 特殊文件 特殊文件包括以下几种: 块文件(block):设备文件,对访问系统硬件部件提供了缓存接口。它们提供了一种通过文件系统与设备驱动通信的方法。 有关于块文件一个重要的性能是它们能在指定时间内传输大块的数据和信息。 列出某目录下的块文件: Shell #ls-l/dev|grep"^b" 输出例子 brw-rw----1rootdisk7,0May1810:26loop0 brw-rw----1rootdisk7,1May1810:26loop1 brw-rw----1rootdisk7,2May1810:26loop2 brw-rw----1rootdisk7,3May1810:26loop3 brw-rw----1rootdisk7,4May1810:26loop4 brw-rw----1rootdisk7,5May1810:26loop5 brw-rw----1rootdisk7,6May1810:26loop6 brw-rw----1rootdisk7,7May1810:26loop7 brw-rw----1rootdisk1,0May1810:26ram0 brw-rw----1rootdisk1,1May1810:26ram1 brw-rw----1rootdisk1,10May1810:26ram10 brw-rw----1rootdisk1,11May1810:26ram11 brw-rw----1rootdisk1,12May1810:26ram12 brw-rw----1rootdisk1,13May1810:26ram13 brw-rw----1rootdisk1,14May1810:26ram14 brw-rw----1rootdisk1,15May1810:26ram15 brw-rw----1rootdisk1,2May1810:26ram2 brw-rw----1rootdisk1,3May1810:26ram3 brw-rw----1rootdisk1,4May1810:26ram4 brw-rw----1rootdisk1,5May1810:26ram5 ... 字符文件(Character):也是设备文件,对访问系统硬件组件提供了非缓冲串行接口。它们与设备的通信工作方式是一次只传输一个字符的数据。 列出某目录下的字符文件: Shell #ls-l/dev|grep"^c" 输出例子 crw-------1rootroot10,235May1815:54autofs crw-------1rootroot10,234May1815:54btrfs-control crw-------1rootroot5,1May1810:26console crw-------1rootroot10,60May1810:26cpu_dma_latency crw-------1rootroot10,203May1815:54cuse crw-------1rootroot10,61May1810:26ecryptfs crw-rw----1rootvideo29,0May1810:26fb0 crw-rw-rw-1rootroot1,7May1810:26full crw-rw-rw-1rootroot10,229May1810:26fuse crw-------1rootroot251,0May1810:27hidraw0 crw-------1rootroot10,228May1810:26hpet crw-r--r--1rootroot1,11May1810:26kmsg crw-rw----+1rootroot10,232May1810:26kvm crw-------1rootroot10,237May1810:26loop-control crw-------1rootroot10,227May1810:26mcelog crw-------1rootroot249,0May1810:27media0 crw-------1rootroot250,0May1810:26mei0 crw-r-----1rootkmem1,1May1810:26mem crw-------1rootroot10,57May1810:26memory_bandwidth crw-------1rootroot10,59May1810:26network_latency crw-------1rootroot10,58May1810:26network_throughput crw-rw-rw-1rootroot1,3May1810:26null crw-r-----1rootkmem1,4May1810:26port crw-------1rootroot108,0May1810:26ppp crw-------1rootroot10,1May1810:26psaux crw-rw-rw-1roottty5,2May1817:40ptmx crw-rw-rw-1rootroot1,8May1810:26random 符号链接文件(Symboliclink):符号链接是指向系统上其他文件的引用。因此,符号链接文件是指向其它文件的文件,那些文件可以是目录或常规文件。 列出某目录下的符号链接文件: Shell #ls-l/dev/|grep"^l" 输出例子 lrwxrwxrwx1rootroot3May1810:26cdrom->sr0 lrwxrwxrwx1rootroot11May1815:54core->/proc/kcore lrwxrwxrwx1rootroot13May1815:54fd->/proc/self/fd lrwxrwxrwx1rootroot4May1810:26rtc->rtc0 lrwxrwxrwx1rootroot8May1810:26shm->/run/shm lrwxrwxrwx1rootroot15May1815:54stderr->/proc/self/fd/2 lrwxrwxrwx1rootroot15May1815:54stdin->/proc/self/fd/0 lrwxrwxrwx1rootroot15May1815:54stdout->/proc/self/fd/1 Linux中使用ln工具可以创建一个符号链接文件,如下所示: #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:47pipe1 prw-rw-r--1tecminttecmint0May1817:47pipe2 prw-rw-r--1tecminttecmint0May1817:47pipe3 prw-rw-r--1tecminttecmint0May1817:47pipe4 prw-rw-r--1tecminttecmint0May1817:47pipe5 在Linux中可以使用mkfifo工具来创建一个命名管道,如下所示: #mkfifopipe1 #echo"Thisisnamedpipe1">pipe1 在上的例子中,我们创建了一个名叫pipe1的命名管道,然后使用echo命令加入一些数据,这之后在处理输入的数据时shell变成非交互式的了(LCTT译注:被管道占住了)。 然后,我们打开另外一个shell终端,运行另外的命令来打印出刚加入管道的数据。 #whilereadline;doecho"Thiswaspassed-'$line'";done 套接字文件(socket):提供进程间通信方法的文件,它们能在运行在不同环境中的进程之间传输数据和信息。 这是说,套接字可以为运行网络上不同机器中的进程提供数据和信息传输。 一个socket运行的例子是网页浏览器连接到网站服务器的过程。 #ls-l/dev/|grep"^s" 输出例子: srw-rw-rw-1rootroot0May1810:26log 下面是使用C语言编写的调用socket()系统调用的例子。 intsocket_desc=socket(AF_INET,SOCK_STREAM,0); 上例中: · AF_INET指的是地址域(IPv4) · SOCK_STREAM指的是类型(默认使用TCP协议连接) · 0指协议(IP协议) 使用socket_desc来引用管道文件,它跟文件描述符是一样的,然后再使用系统函数read()和write()来分别从这个管道文件读写数据。 目录文件 这是一些特殊的文件,既可以包含普通文件又可包含其它的特殊文件,它们在Linux文件系统中是以根(/)目录为起点分层组织存在的。 列出某目录下的目录文件: #ls-l/|grep"^d" 输出例子: drwxr-xr-x2rootroot4096May515:49bin drwxr-xr-x4rootroot4096May515:58boot drwxr-xr-x2rootroot4096Apr112015cdrom drwxr-xr-x17rootroot4400May1810:27dev drwxr-xr-x168rootroot12288May1810:28etc drwxr-xr-x3rootroot4096Apr112015home drwxr-xr-x25rootroot4096May515:44lib drwxr-xr-x2rootroot4096May515:44lib64 drwx------2rootroot16384Apr112015lost+found drwxr-xr-x3rootroot4096Apr102015media drwxr-xr-x3rootroot4096Feb2317:54mnt drwxr-xr-x16rootroot4096Apr3016:01opt dr-xr-xr-x223rootroot0May1815:54proc drwx------19rootroot4096Apr911:12root drwxr-xr-x27rootroot920May1810:54run drwxr-xr-x2rootroot12288May515:57sbin drwxr-xr-x2rootroot4096Dec12014srv dr-xr-xr-x13rootroot0May1815:54sys drwxrwxrwt13rootroot4096May1817:55tmp drwxr-xr-x11rootroot4096Mar3116:00usr drwxr-xr-x12rootroot4096Nov122015var 您可以使用mkdir命令来创建一个目录。 #mkdir-m1666tecmint.com #mkdir-m1666news.tecmint.com #mkdir-m1775linuxsay.com 结论 现在应该对为什么Linux系统中一切都是文件以及Linux系统中可以存在哪些类型的文件有一个清楚的认识了。 您可以通过阅读更多有关各个文件类型的文章和对应的创建过程等来增加更多知识。我希望这篇教程对您有所帮助。有任何疑问或有补充的知识,请留下评论,一起来讨论。