诠释Linux 中“一切都是文件”概念和相应的文件类型

发表于:2016-8-24 11:29

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Aaron Kili    来源:51Testing软件测试网采编

  在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系统中可以存在哪些类型的文件有一个清楚的认识了。
  您可以通过阅读更多有关各个文件类型的文章和对应的创建过程等来增加更多知识。我希望这篇教程对您有所帮助。有任何疑问或有补充的知识,请留下评论,一起来讨论。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号