一切皆文件和 Linux 中的文件类型
如果您是 Linux 新手或已经使用了几个月,那么您一定听过或读过“在 Linux 中,一切都是文件”这样的说法。
这实际上是正确的,尽管它只是一个概括概念,在 Unix 及其衍生产品(如 Linux)中,一切都被视为一个文件。如果某物不是文件,那么它一定是作为系统上的进程运行的。
要理解这一点,请举个例子,您的 (/)
根目录上的空间量总是被特定格式(文件类型)占用。

另外,Linux 系统不区分文件和目录,但目录有一项重要的工作,就是将其他文件分组存储在层次结构中,以便于定位。您所有的硬件组件都表示为文件,系统使用这些文件与它们进行通信。
这个想法是对 Linux 的一个重要特性的重要描述,其中输入/输出资源,例如您的文档、目录(Mac OS X 和 Windows 中的文件夹)、键盘、显示器、硬盘驱动器、可移动媒体、打印机、调制解调器、虚拟终端,以及进程间和网络通信是由文件系统空间定义的字节流。
一切皆文件的一个显着优势是可以在上述输入/输出资源上使用同一组 Linux 工具、实用程序和 API。虽然 Linux 中的一切都是文件,但有一些特殊文件不仅仅是文件,例如套接字和命名管道。
Linux 中的不同类型的文件?
在 Linux 中,基本上有三种类型的文件:
- 普通/常规文件
- 特殊文件
- 目录
普通/普通文件
这些是包含文本、数据或程序指令的文件数据,它们是您可以在 Linux 系统上找到的最常见的文件类型,它们包括:
- 可读文件
- 二进制文件
- 图片文件
- 压缩文件等。
特殊文件
特殊文件包括以下内容:
Linux 块文件
这些是提供对系统硬件组件的缓冲访问的设备文件。它们提供了一种通过文件系统与设备驱动程序通信的方法。
块 文件的一个重要方面是它们可以在给定时间传输大量数据和信息。
使用 ls 命令列出目录中的块文件套接字:
# ls -l /dev | grep "^b"
brw-rw---- root disk 0 B Wed Apr 26 08:39:09 2023 loop0
brw-rw---- root disk 0 B Wed Apr 26 08:39:09 2023 loop1
brw-rw---- root disk 0 B Wed Apr 26 08:39:09 2023 loop2
brw-rw---- root disk 0 B Wed Apr 26 08:39:09 2023 loop3
brw-rw---- root disk 0 B Wed Apr 26 08:39:09 2023 loop4
brw-rw---- root disk 0 B Wed Apr 26 08:39:09 2023 loop5
brw-rw---- root disk 0 B Wed Apr 26 08:39:09 2023 loop6
brw-rw---- root disk 0 B Wed Apr 26 08:39:09 2023 loop7
brw-rw---- root disk 0 B Wed Apr 26 08:39:09 2023 sda
brw-rw---- root disk 0 B Wed Apr 26 08:39:09 2023 sda1
brw-rw---- root disk 0 B Wed Apr 26 08:39:10 2023 sda2
brw-rw---- root disk 0 B Wed Apr 26 08:39:09 2023 sdb
brw-rw---- root disk 0 B Wed Apr 26 08:39:09 2023 sdb1
brw-rw---- root disk 0 B Wed Apr 26 08:39:09 2023 sdb2
brw-rw---- root disk 0 B Wed Apr 26 08:39:09 2023 sdb3
...
Linux 字符文件
这些也是提供对系统硬件组件的无缓冲串行访问的设备文件。它们通过一次传输一个字符的数据来提供一种与设备通信的方式。
列出目录中的字符文件套接字:
# ls -l /dev | grep "^c"
crw-r--r-- root root 0 B Wed Apr 26 08:39:09 2023 autofs
crw-rw---- root disk 0 B Wed Apr 26 08:39:09 2023 btrfs-control
crw--w---- root tty 0 B Wed Apr 26 08:39:09 2023 console
crw------- root root 0 B Wed Apr 26 08:39:09 2023 cpu_dma_latency
crw------- root root 0 B Wed Apr 26 08:39:09 2023 cuse
crw------- root root 0 B Wed Apr 26 08:39:09 2023 ecryptfs
crw-rw---- root video 0 B Wed Apr 26 08:39:09 2023 fb0
crw-rw-rw- root root 0 B Wed Apr 26 08:39:09 2023 full
crw-rw-rw- root root 0 B Wed Apr 26 08:39:09 2023 fuse
crw------- root root 0 B Wed Apr 26 08:39:09 2023 hidraw0
crw------- root root 0 B Wed Apr 26 08:39:09 2023 hidraw1
crw------- root root 0 B Wed Apr 26 08:39:09 2023 hidraw2
crw------- root root 0 B Wed Apr 26 08:39:09 2023 hidraw3
crw------- root root 0 B Wed Apr 26 08:39:09 2023 hpet
crw------- root root 0 B Wed Apr 26 08:39:09 2023 hwrng
crw------- root root 0 B Wed Apr 26 08:39:09 2023 i2c-0
crw------- root root 0 B Wed Apr 26 08:39:12 2023 i2c-1
crw------- root root 0 B Wed Apr 26 08:39:12 2023 i2c-2
crw------- root root 0 B Wed Apr 26 08:39:12 2023 i2c-3
crw-r--r-- root root 0 B Wed Apr 26 08:39:09 2023 kmsg
crw-rw----+ root kvm 0 B Wed Apr 26 08:39:09 2023 kvm
crw-rw---- root disk 0 B Wed Apr 26 08:39:09 2023 loop-control
crw-rw---- root lp 0 B Wed Apr 26 08:39:09 2023 lp0
crw------- root root 0 B Wed Apr 26 08:39:09 2023 mcelog
crw------- root root 0 B Wed Apr 26 08:39:09 2023 mei0
...
Linux 符号链接文件
符号链接是对系统上另一个文件的引用。因此,符号链接文件是指向其他文件的文件,它们可以是目录,也可以是普通文件。
列出目录中的符号链接套接字:
# ls -l /dev/ | grep "^l"
lrwxrwxrwx root root 13 B Wed Apr 26 08:39:04 2023 fd ⇒ /proc/self/fd
lrwxrwxrwx root root 11 B Wed Apr 26 08:39:04 2023 core ⇒ /proc/kcore
lrwxrwxrwx root root 12 B Wed Apr 26 08:39:09 2023 initctl ⇒ /run/initctl
lrwxrwxrwx root root 28 B Wed Apr 26 08:39:09 2023 log ⇒ /run/systemd/journal/dev-log
lrwxrwxrwx root root 4 B Wed Apr 26 08:39:09 2023 rtc ⇒ rtc0
lrwxrwxrwx root root 15 B Wed Apr 26 08:39:04 2023 stderr ⇒ /proc/self/fd/2
lrwxrwxrwx root root 15 B Wed Apr 26 08:39:04 2023 stdin ⇒ /proc/self/fd/0
lrwxrwxrwx root root 15 B Wed Apr 26 08:39:04 2023 stdout ⇒ /proc/self/fd/1
...
您可以在 Linux 中使用 ln
实用程序创建符号链接,如下例所示。
# touch file1.txt
# ln -s file1.txt /home/tecmint/file1.txt [create symbolic link]
# ls -l /home/tecmint/ | grep "^l" [List symbolic links]
在上面的示例中,我在 /tmp 目录中创建了一个名为 file1.txt
的文件,然后创建了符号链接 /home/tecmint/file1.txt< 指向 /tmp/file1.txt。
Linux 管道或命名管道
这些文件允许通过将一个进程的输出连接到另一个进程的输入来进行进程间通信。命名管道实际上是两个进程用来相互通信的文件,它充当 Linux 管道。
列出目录中的管道套接字:
# ls -l | grep "^p"
prw-rw-r-- 1 tecmint tecmint 0 Apr 18 17:47 pipe1
prw-rw-r-- 1 tecmint tecmint 0 Apr 18 17:47 pipe2
prw-rw-r-- 1 tecmint tecmint 0 Apr 18 17:47 pipe3
prw-rw-r-- 1 tecmint tecmint 0 Apr 18 17:47 pipe4
prw-rw-r-- 1 tecmint tecmint 0 Apr 18 17:47 pipe5
您可以使用 mkfifo 实用程序在 Linux 中创建命名管道,如下所示。
# mkfifo pipe1
# echo "This is named pipe1" > pipe1
在上面的示例中,我创建了一个名为 pipe1
的命名管道,然后我使用 echo 命令将一些数据传递给它,之后 shell 在处理输入时变得非交互式。
然后我打开另一个 shell 并运行另一个命令来打印出传递给管道的内容。
# while read line ;do echo "This was passed-'$line' "; done<pipe1
Linux 套接字文件
这些是提供进程间通信方式的文件,但它们可以在不同环境中运行的进程之间传输数据和信息。
这意味着套接字提供在网络上不同机器上运行的进程之间的数据和信息传输。
一个展示套接字工作的例子是网络浏览器连接到网络服务器。
# ls -l /dev/ | grep "^s"
srw-rw-rw- 1 root root 0 Apr 18 10:26 log
这是使用 socket()
系统调用在 C 中创建的套接字示例。
int socket_desc= socket(AF_INET, SOCK_STREAM, 0 );
在上面:
AF_INET
是地址族(IPv4)SOCK_STREAM
是类型(连接是面向TCP协议的)0
是协议(IP Protocol)
要引用套接字文件,请使用与文件描述符相同的socket_desc
,并使用read()
和write()
分别从套接字读取和写入的系统调用。
Linux 特殊目录
这些是存储普通文件和其他特殊文件的特殊文件,它们在 Linux 文件系统中以从根 (/)
目录开始的层次结构组织。
列出目录中的套接字:
# ls -l / | grep "^d"
drwxr-xr-x root root 4.0 KB Fri Apr 21 10:21:42 2023 boot
drwxr-xr-x root root 4.0 KB Wed Oct 6 22:55:05 2021 cdrom
drwxr-xr-x root root 4.4 KB Wed Apr 26 08:39:12 2023 dev
drwxr-xr-x root root 12 KB Sat Apr 22 10:59:02 2023 etc
drwxr-xr-x root root 4.0 KB Wed Oct 6 22:55:12 2021 home
drwx------ root root 16 KB Wed Oct 6 22:52:31 2021 lost+found
drwxr-xr-x root root 4.0 KB Thu Oct 7 18:03:09 2021 media
drwxr-xr-x root root 4.0 KB Mon Jul 18 11:34:54 2022 mnt
drwxr-xr-x root root 4.0 KB Tue Apr 4 15:09:01 2023 opt
dr-xr-xr-x root root 0 B Wed Apr 26 08:39:04 2023 proc
drwx------ root root 4.0 KB Fri Apr 7 11:28:42 2023 root
drwxr-xr-x root root 1.1 KB Wed Apr 26 08:44:09 2023 run
drwxr-xr-x root root 4.0 KB Wed Dec 15 13:23:40 2021 srv
dr-xr-xr-x root root 0 B Wed Apr 26 08:39:04 2023 sys
drwxrwxrwt root root 4.0 KB Wed Apr 26 10:14:23 2023 tmp
drwxr-xr-x root root 4.0 KB Sat Jul 3 22:29:26 2021 usr
drwxr-xr-x root root 4.0 KB Thu Mar 30 10:46:04 2023 var
您可以使用 mkdir 命令创建一个目录。
# mkdir -m 1666 linux教程
# mkdir -m 1666 news.linux教程
# mkdir -m 1775 linuxsay.com
概括
您现在应该清楚地了解为什么 Linux 中的一切都是文件以及 Linux 系统上可以存在的不同类型的文件。
您可以通过阅读有关各个文件类型及其创建方式的更多信息来添加更多内容。我希望本指南对您有所帮助,如有任何问题和您想分享的其他信息,请发表评论,我们将进行更多讨论。