“一切皆文件”的解释以及 Linux 中的文件类型
如果你是 Linux 新手或者已经使用了几个月,那么你一定听过或读过这样的说法:“在 Linux 中,一切都是文件”。
事实上,尽管这只是一个广义的概念,但在 Unix 及其衍生产品(如 Linux)中,一切都被视为文件。如果某个东西不是文件,那么它一定是在系统中作为进程运行的。
为了理解这一点,我们举个例子,你的根目录上的空间(/)
总是被不同类型的 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/example/file1.txt [create symbolic link] # ls -l /home/example/ | grep "^l" [List symbolic links]
在上面的例子中,我file1.txt
在/tmp目录中创建了一个名为的文件,然后创建了符号链接/home/example/file1.txt来指向/tmp/file1.txt。
Linux 管道或命名管道
这些文件通过将一个进程的输出连接到另一个进程的输入来实现进程间通信。命名管道实际上是两个进程用来相互通信的文件,它充当 Linux 管道。
列出目录中的管道套接字:
# ls -l | grep "^p" prw-rw-r-- 1 example example 0 Apr 18 17:47 pipe1 prw-rw-r-- 1 example example 0 Apr 18 17:47 pipe2 prw-rw-r-- 1 example example 0 Apr 18 17:47 pipe3 prw-rw-r-- 1 example example 0 Apr 18 17:47 pipe4 prw-rw-r-- 1 example example 0 Apr 18 17:47 pipe5
您可以使用mkfifo实用程序在 Linux 中创建命名管道,如下所示。
# mkfifo pipe1 # echo "This is named pipe1" > pipe1
在上面的例子中,我创建了一个名为的命名管道,然后我使用echo 命令pipe1
向它传递了一些数据,之后 shell 在处理输入时变得非交互性。
然后我打开另一个 shell 并运行另一个命令来打印出传递给管道的内容。
# while read line ;do echo "This was passed-'$line' "; done<pipe1
Linux 套接字文件
这些文件提供了一种进程间通信的方法,但它们可以在不同环境中运行的进程之间传输数据和信息。
这意味着套接字为网络上不同机器上运行的进程之间提供数据和信息传输。
展示套接字工作的一个例子是 Web 浏览器与 Web 服务器的连接。
# ls -l /dev/ | grep "^s" srw-rw-rw- 1 root root 0 Apr 18 10:26 log
这是使用系统调用在C中创建套接字的示例socket()
。
int socket_desc= socket(AF_INET, SOCK_STREAM, 0 );
在上文中:
AF_INET
是地址系列(IPv4)SOCK_STREAM
是类型(连接面向 TCP 协议)0
是协议(IP 协议)
要引用套接字文件,请使用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 example.com # mkdir -m 1666 news.example.com # mkdir -m 1775 linuxsay.com
概括
现在您应该清楚地了解为什么 Linux 中的所有内容都是文件,以及 Linux 系统上可以存在的不同类型的文件。
您可以通过阅读有关各个文件类型及其创建方式的更多信息来添加更多内容。我希望您觉得本指南有用,如果您有任何问题和想要分享的其他信息,请发表评论,我们将进行更多讨论。