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

原文出处: Aaron Kili 译文出处:runningwater

在 Unix 和它衍生的比如 Linux 系统中,一切都可以看做文件。虽然它仅仅只是一个泛泛的概念,但这是事实。如果有不是文件的,那它一定是正运行的进程。

要理解这点,可以举个例子,您的根目录(/)的空间充斥着不同类型的 Linux 文件。当您创建一个文件或向系统传输一个文件时,它会在物理磁盘上占据的一些空间,而且是一个特定的格式(文件类型)。

虽然 Linux 系统中文件和目录没有什么不同,但目录还有一个重要的功能,那就是有结构性的分组存储其它文件,以方便查找访问。所有的硬件组件都表示为文件,系统使用这些文件来与硬件通信。

这些思想是对 Linux 中的各种事物的重要阐述,因此像文档、目录(Mac OS X 和 Windows 系统下称之为文件夹)、键盘、监视器、硬盘、可移动媒体设备、打印机、调制解调器、虚拟终端,还有进程间通信(IPC)和网络通信等输入/输出资源都是定义在文件系统空间下的字节流。

一切都可看作是文件,其最显著的好处是对于上面所列出的输入/输出资源,只需要相同的一套 Linux 工具、实用程序和 API。

虽然在 Linux 中一切都可看作是文件,但也有一些特殊的文件,比如套接字和命令管道。

Linux 文件类型的不同之处?

Linux 系统中有三种基本的文件类型:

普通/常规文件特殊文件目录文件

普通/常规文件

它们是包含文本、数据、程序指令等数据的文件,其在 Linux 系统中是最常见的一种。包括如下:

可读文件二进制文件图像文件压缩文件等等

特殊文件

特殊文件包括以下几种:

块文件(block):设备文件,对访问系统硬件部件提供了缓存接口。它们提供了一种通过文件系统与设备驱动通信的方法。

有关于块文件一个重要的性能就是它们能在指定时间内传输大块的数据和信息。

列出某目录下的块文件:

Shell

1

# ls -l /dev | grep "^b"

输出例子

Shell

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

brw-rw---- 1root disk 7, 0May1810:26loop0

brw-rw---- 1root disk 7, 1May1810:26loop1

brw-rw---- 1root disk 7, 2May1810:26loop2

brw-rw---- 1root disk 7, 3May1810:26loop3

brw-rw---- 1root disk 7, 4May1810:26loop4

brw-rw---- 1root disk 7, 5May1810:26loop5

brw-rw---- 1root disk 7, 6May1810:26loop6

brw-rw---- 1root disk 7, 7May1810:26loop7

brw-rw---- 1root disk 1, 0May1810:26ram0

brw-rw---- 1root disk 1, 1May1810:26ram1

brw-rw---- 1root disk 1, 10May1810:26ram10

brw-rw---- 1root disk 1, 11May1810:26ram11

brw-rw---- 1root disk 1, 12May1810:26ram12

brw-rw---- 1root disk 1, 13May1810:26ram13

brw-rw---- 1root disk 1, 14May1810:26ram14

brw-rw---- 1root disk 1, 15May1810:26ram15

brw-rw---- 1root disk 1, 2May1810:26ram2

brw-rw---- 1root disk 1, 3May1810:26ram3

brw-rw---- 1root disk 1, 4May1810:26ram4

brw-rw---- 1root disk 1, 5May1810:26ram5

...

字符文件(Character): 也是设备文件,对访问系统硬件组件提供了非缓冲串行接口。它们与设备的通信工作方式是一次只传输一个字符的数据。

列出某目录下的字符文件:

Shell

1

# ls -l /dev | grep "^c"

输出例子

Shell

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

crw------- 1root root 10,235May1815:54autofs

crw------- 1root root 10,234May1815:54btrfs-control

crw------- 1root root 5, 1May1810:26console

crw------- 1root root 10, 60May1810:26cpu_dma_latency

crw------- 1root root 10,203May1815:54cuse

crw------- 1root root 10, 61May1810:26ecryptfs

crw-rw---- 1root video 29, 0May1810:26fb0

crw-rw-rw- 1root root 1, 7May1810:26full

crw-rw-rw- 1root root 10,229May1810:26fuse

crw------- 1root root 251, 0May1810:27hidraw0

crw------- 1root root 10,228May1810:26hpet

crw-r--r-- 1root root 1, 11May1810:26kmsg

crw-rw----+1root root 10,232May1810:26kvm

crw------- 1root root 10,237May1810:26loop-control

crw------- 1root root 10,227May1810:26mcelog

crw------- 1root root 249, 0May1810:27media0

crw------- 1root root 250, 0May1810:26mei0

crw-r----- 1root kmem 1, 1May1810:26mem

crw------- 1root root 10, 57May1810:26memory_bandwidth

crw------- 1root root 10, 59May1810:26network_latency

crw------- 1root root 10, 58May1810:26network_throughput

crw-rw-rw- 1root root 1, 3May1810:26null

crw-r----- 1root kmem 1, 4May1810:26port

crw------- 1root root 108, 0May1810:26ppp

crw------- 1root root 10, 1May1810:26psaux

crw-rw-rw- 1root tty 5, 2May1817:40ptmx

crw-rw-rw- 1root root 1, 8May1810:26random

符号链接文件(Symbolic link) : 符号链接是指向系统上其他文件的引用。因此,符号链接文件是指向其它文件的文件,那些文件可以是目录或常规文件。

列出某目录下的符号链接文件:

Shell

1

# ls -l /dev/ | grep "^l"

输出例子

Shell

1

2

3

4

5

6

7

8

lrwxrwxrwx 1root root 3May1810:26cdrom->sr0

lrwxrwxrwx 1root root 11May1815:54core->/proc/kcore

lrwxrwxrwx 1root root 13May1815:54fd->/proc/self/fd

lrwxrwxrwx 1root root 4May1810:26rtc->rtc0

lrwxrwxrwx 1root root 8May1810:26shm->/run/shm

lrwxrwxrwx 1root root 15May1815:54stderr->/proc/self/fd/2

lrwxrwxrwx 1root root 15May1815:54stdin->/proc/self/fd/0

lrwxrwxrwx 1root root 15May1815:54stdout->/proc/self/fd/1

Linux 中使用 ln工具就可以创建一个符号链接文件,如下所示:

Shell

1

2

3

# touch file1.txt

# ln -s file1.txt /home/tecmint/file1.txt [创建符号链接文件]

# ls -l /home/tecmint/ | grep "^l" [列出符号链接文件]

在上面的例子中,首先我们在 /tmp目录创建了一个名叫 file1.txt的文件,然后创建符号链接文件,将 /home/tecmint/file1.txt指向 /tmp/file1.txt文件。

管道(Pipe)和命令管道(Named pipe) : 将一个进程的输出连接到另一个进程的输入,从而允许进程间通信(IPC)的文件。

命名管道实际上是一个文件,用来使两个进程彼此通信,就像一个 Linux 管道一样。

列出某目录下的管道文件:

Shell

1

# ls -l | grep "^p"

输出例子:

Shell

1

2

3

4

5

prw-rw-r--1tecmint tecmint 0May1817:47pipe1

prw-rw-r--1tecmint tecmint 0May1817:47pipe2

prw-rw-r--1tecmint tecmint 0May1817:47pipe3

prw-rw-r--1tecmint tecmint 0May1817:47pipe4

prw-rw-r--1tecmint tecmint 0May1817:47pipe5

在 Linux 中可以使用 mkfifo工具来创建一个命名管道,如下所示:

Shell

1

2

# mkfifo pipe1

# echo "This is named pipe1" > pipe1

在上的例子中,我们创建了一个名叫 pipe1的命名管道,然后使用 echo 命令加入一些数据,这之后在处理输入的数据时 shell 就变成非交互式的了(LCTT 译注:被管道占住了)。

然后,我们打开另外一个 shell 终端,运行另外的命令来打印出刚加入管道的数据。

Shell

1

# while read line ;do echo "This was passed-'$line' "; done

套接字文件(socket) : 提供进程间通信方法的文件,它们能在运行在不同环境中的进程之间传输数据和信息。

这就是说,套接字可以为运行网络上不同机器中的进程提供数据和信息传输。

一个 socket 运行的例子就是网页浏览器连接到网站服务器的过程。

Shell

1

# ls -l /dev/ | grep "^s"

输出例子:

Shell

1

srw-rw-rw- 1root root 0May1810:26log

下面是使用 C 语言编写的调用 socket()系统调用的例子。

Shell

1

intsocket_desc=socket(AF_INET,SOCK_STREAM,0);

上例中:

AF_INET指的是地址域(IPv4)SOCK_STREAM指的是类型(默认使用 TCP 协议连接)0指协议(IP 协议)

使用 socket_desc来引用管道文件,它跟文件描述符是一样的,然后再使用系统函数 read()和 write()来分别从这个管道文件读写数据。

目录文件

这是一些特殊的文件,既可以包含普通文件又可包含其它的特殊文件,它们在 Linux 文件系统中是以根(/)目录为起点分层组织存在的。

列出某目录下的目录文件:

Shell

1

# ls -l / | grep "^d"

输出例子:

Shell

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

drwxr-xr-x 2root root 4096May 515:49bin

drwxr-xr-x 4root root 4096May 515:58boot

drwxr-xr-x 2root root 4096Apr11 2015cdrom

drwxr-xr-x 17root root 4400May1810:27dev

drwxr-xr-x168root root12288May1810:28etc

drwxr-xr-x 3root root 4096Apr11 2015home

drwxr-xr-x 25root root 4096May 515:44lib

drwxr-xr-x 2root root 4096May 515:44lib64

drwx------ 2root root16384Apr11 2015lost+found

drwxr-xr-x 3root root 4096Apr10 2015media

drwxr-xr-x 3root root 4096Feb2317:54mnt

drwxr-xr-x 16root root 4096Apr3016:01opt

dr-xr-xr-x223root root 0May1815:54proc

drwx------ 19root root 4096Apr 911:12root

drwxr-xr-x 27root root 920May1810:54run

drwxr-xr-x 2root root12288May 515:57sbin

drwxr-xr-x 2root root 4096Dec 1 2014srv

dr-xr-xr-x 13root root 0May1815:54sys

drwxrwxrwt 13root root 4096May1817:55tmp

drwxr-xr-x 11root root 4096Mar3116:00usr

drwxr-xr-x 12root root 4096Nov12 2015var

您可以使用 mkdir 命令来创建一个目录。

Shell

1

2

3

# mkdir -m 1666 tecmint.com

# mkdir -m 1666 news.tecmint.com

# mkdir -m 1775 linuxsay.com

结论

现在应该对为什么 Linux 系统中一切都是文件以及 Linux 系统中可以存在哪些类型的文件有一个清楚的认识了。

您可以通过有关各个文件类型的文章和对应的创建过程等来增加更多知识。我希望这篇教程对您有所帮助。有任何疑问或有补充的知识,请留下评论,一起来讨论。

责任编辑:

linux中文件复的概念,诠释 Linux 中“一切都是文件”概念和相应的文件类型相关推荐

  1. 中添加复选框_Word/excel中在方框中打钩/叉的符号,简单方便快捷

    方法1:插入特殊符号 将光标定位于需要打钩的地方,选择[插入]--[符号]--[其他符号]--更改字体为[Windings2] 方法2:使用快捷键 从上面的截图中可以看到设置快捷键,所以在插入特殊符号 ...

  2. 计算机考试ks文件夹,大学计算机考试PPT Word Excel都关了 但是装他们的文件夹KS没关 就提交了有事吗......

    没事的,文件夹的打开.关闭没有实质性的影响. 一般情况电脑会自动保存的,再说你也保存过,所以一般情下会没有问题计算机二级MS OFFICE考试一共分为四大块,第一大题是计算机基础,前面5道最难,会考栈 ...

  3. javafx打包成的jar包中包含excel等office模板文件,如何从jar包中读取这些模板文件?

    实现的Java FX项目中有excel模板文件读取功能,idea下运行可以,但是打包的jar文件在运行时,不能识别jar文件中的excel模板文件,先看看以下代码: String filePath = ...

  4. linux 文件夹换所属用户,Linux中账号管理之权限管理(下)

    linux中的账号管理我们在前面两张已经介绍了一些用户和组的相关概念,常用的配置文件,命令的使用.现在我们来看看账号管理中最傲娇的部分就是我们的权限管理. 一.简单介绍权限的概念 以install.l ...

  5. linux驱动内核哪个文件夹,linux设备驱动归纳总结(一):内核的相关基础概念...

    linux设备驱动归纳总结(一):内核的相关基础概念 1. 内核与 linux 设备驱动的作用与关系 内核:用于管理软硬件资源,并提供运行环境.如分配 4G 虚拟空间等. linux 设备驱动:是连接 ...

  6. Linux系统编程----12(线程概念,Linux线程实现原理,栈中ebp指针和ebp指针,线程的优缺点和共享资源)

    线程概念 什么是线程 在一个程序里的一个执行路线就叫做线程(thread). 更准确的定义是:线程是"一个进程内部的控制序列" 一切进程至少都有一个执行线程 线程在进程内部运行,本 ...

  7. linux文件i节点,深入理解linux中i节点(inode)

    对于Unix系列的操作系统,大多都有v节点.但是对于linux来说,只有通用的i节点,却没有v节点. 下面来探讨一下,linux下的i节点. linux中,文件查找不是通过文件名称来查找的.实际上是通 ...

  8. linux下文件的total是啥,linux中,ls -l命令显示的total的含义。

    当在linux里使用ll或者ls -l命令查看文件详情时,会在第一行看到如下的字样: total 20 drwxr-xr-x 8 user rnd 134 Apr 27 04:40 ./ drwxr- ...

  9. linux怎么进入文件的末尾,如何在Linux中附加到文件的末尾

    在本教程中,我们学习在Linux中的文件末尾附加文本的不同方法,Linux中有几种方法可以实现这一点,但是最简单的方法是将命令输出重定向到目标文件,使用> >字符,你可以将命令的结果输出到 ...

最新文章

  1. 最全面的Unity游戏开发指南视频教程 第2卷
  2. centos7系统下scala安装详解
  3. Count SIN Numbers
  4. 解决Button在IE6、7下的自适应宽度问题
  5. IDEA使用技巧整理
  6. git提取和拉取的区别_git fetch和git pull的区别
  7. 中国移动技术愿景2020+
  8. Edge使用手机版切换到电脑模式的方法
  9. 数字信号处理实验(三):离散时间傅里叶变换
  10. wait notify的错误理解
  11. 排序算法之 归并排序
  12. 厨房里的ERP(MRP)
  13. 关于AI-人工智能看法,进行漫谈。
  14. Linux服务器出现方向键、退格键乱码等现象解决
  15. 业务设计师(产品经理)P级晋升必备职能(P3-P7)
  16. 在公路项目里路缘石滑模机施工作业需要注意这些
  17. 电子计算机工作原理及设计思想为什么理论,动态偏振控制器的工作原理、系统设计及应用...
  18. 如何在线程之间共享资源?
  19. oci连接mysql_PLSQL Developer配置OCI连接远程数据库
  20. 数字平原制作美丽林间小屋风景

热门文章

  1. 【算法大赛直播周】如何赋予机器更多“想象力”?《计算广告》作者刘鹏带你解密深度学习
  2. q语言 科学计数_3岁宝宝说话结巴,被诊断语言障碍,我用1招让孩子口齿清晰,打脸众人!...
  3. 从0成为Facebook广告高手系列教程
  4. js获取的值传到java_使用GraalVM从javascript将变量参数传递给java函数
  5. mysql修改表结构 删除字段_mysql更改表结构:添加、删除、修改字段、调整字段顺序...
  6. Spring配置跨域请求
  7. Spring Boot Maven 打包可执行Jar文件!
  8. python commands_python之commands模块
  9. win 10 1709安装linux,小编详解win10 1709安装教程
  10. maven下设置默认jdk版本和maven项目构建默认使用jdk版本