如果你是新来的Linux,或已经使用了数个月,那么你一定听说过或读到的语句,如“ 在Linux中,一切都是文件 ”。
一切都是Linux中的文件和文件类型
另请阅读: 5有用的命令来管理Linux的文件类型
这实际上是真的,虽然它只是一个泛化概念,在Unix及其衍生物如Linux中,一切都被视为一个文件。 如果某些内容不是文件,那么它必须作为系统上的进程运行。
要理解这一点,就拿上你的根的空间量(/)
目录总是由不同类型的Linux的文件所占用。 当创建文件或将文件传输到系统时,它在物理磁盘上占用一些空间,并且被认为是特定格式(文件类型)。
此外,Linux系统不区分文件和目录,但目录做一项重要工作,即将其他文件分组存储在层次结构中以方便定位。 所有硬件组件都表示为文件,系统使用这些文件与它们进行通信。
这个想法是对Linux的一个伟大属性的重要描述,其中输入/输出资源,如您的文档,目录(Mac OS X和Windows中的文件夹),键盘,显示器,硬盘驱动器,可移动媒体,打印机,调制解调器,虚拟终端以及进程间和网络通信是由文件系统空间定义的字节流。
一切都是文件的一个显着优点是,可以在上述输入/输出资源上使用相同的一组Linux工具,实用程序和API。
尽管一切都在Linux是一个文件,有一定的特殊文件,这些文件不仅仅是例如文件的详细套接字和命名管道 。
Linux中不同类型的文件是什么?
在Linux中,基本上有三种类型的文件:
- 普通/常规文件
- 特殊文件
- 目录
普通/常规文件
这些是包含文本,数据或程序指令的文件数据,它们是在Linux系统上可以找到的最常见类型的文件,包括:
- 可读文件
- 二进制文件
- 图像文件
- 压缩文件等。
特殊文件
特殊文件包括:
块的文件 :这些设备文件提供到系统硬件组件的缓冲存取。 它们提供通过文件系统与设备驱动程序通信的方法。
关于块的文件的一个重要方面是,它们可以在给定时间传输数据和信息的一个较大块。
列出目录中的块文件套接字:
# ls -l /dev | grep "^b"
示例输出
brw-rw---- 1 root disk 7, 0 May 18 10:26 loop0 brw-rw---- 1 root disk 7, 1 May 18 10:26 loop1 brw-rw---- 1 root disk 7, 2 May 18 10:26 loop2 brw-rw---- 1 root disk 7, 3 May 18 10:26 loop3 brw-rw---- 1 root disk 7, 4 May 18 10:26 loop4 brw-rw---- 1 root disk 7, 5 May 18 10:26 loop5 brw-rw---- 1 root disk 7, 6 May 18 10:26 loop6 brw-rw---- 1 root disk 7, 7 May 18 10:26 loop7 brw-rw---- 1 root disk 1, 0 May 18 10:26 ram0 brw-rw---- 1 root disk 1, 1 May 18 10:26 ram1 brw-rw---- 1 root disk 1, 10 May 18 10:26 ram10 brw-rw---- 1 root disk 1, 11 May 18 10:26 ram11 brw-rw---- 1 root disk 1, 12 May 18 10:26 ram12 brw-rw---- 1 root disk 1, 13 May 18 10:26 ram13 brw-rw---- 1 root disk 1, 14 May 18 10:26 ram14 brw-rw---- 1 root disk 1, 15 May 18 10:26 ram15 brw-rw---- 1 root disk 1, 2 May 18 10:26 ram2 brw-rw---- 1 root disk 1, 3 May 18 10:26 ram3 brw-rw---- 1 root disk 1, 4 May 18 10:26 ram4 brw-rw---- 1 root disk 1, 5 May 18 10:26 ram5 ...
字符文件 :这些也是设备文件提供到系统硬件组件缓冲串行访问。 它们通过一次一个字符地传输数据来提供与设备的通信方式。
在目录中列出字符文件套接字:
# ls -l /dev | grep "^c"
示例输出
crw------- 1 root root 10, 235 May 18 15:54 autofs crw------- 1 root root 10, 234 May 18 15:54 btrfs-control crw------- 1 root root 5, 1 May 18 10:26 console crw------- 1 root root 10, 60 May 18 10:26 cpu_dma_latency crw------- 1 root root 10, 203 May 18 15:54 cuse crw------- 1 root root 10, 61 May 18 10:26 ecryptfs crw-rw---- 1 root video 29, 0 May 18 10:26 fb0 crw-rw-rw- 1 root root 1, 7 May 18 10:26 full crw-rw-rw- 1 root root 10, 229 May 18 10:26 fuse crw------- 1 root root 251, 0 May 18 10:27 hidraw0 crw------- 1 root root 10, 228 May 18 10:26 hpet crw-r--r-- 1 root root 1, 11 May 18 10:26 kmsg crw-rw----+ 1 root root 10, 232 May 18 10:26 kvm crw------- 1 root root 10, 237 May 18 10:26 loop-control crw------- 1 root root 10, 227 May 18 10:26 mcelog crw------- 1 root root 249, 0 May 18 10:27 media0 crw------- 1 root root 250, 0 May 18 10:26 mei0 crw-r----- 1 root kmem 1, 1 May 18 10:26 mem crw------- 1 root root 10, 57 May 18 10:26 memory_bandwidth crw------- 1 root root 10, 59 May 18 10:26 network_latency crw------- 1 root root 10, 58 May 18 10:26 network_throughput crw-rw-rw- 1 root root 1, 3 May 18 10:26 null crw-r----- 1 root kmem 1, 4 May 18 10:26 port crw------- 1 root root 108, 0 May 18 10:26 ppp crw------- 1 root root 10, 1 May 18 10:26 psaux crw-rw-rw- 1 root tty 5, 2 May 18 17:40 ptmx crw-rw-rw- 1 root root 1, 8 May 18 10:26 random
符号链接文件 :一个符号链接是到系统上的其他文件的引用。 因此,符号链接文件是指向其他文件的文件,它们可以是目录或常规文件。
列出目录中的符号链接套接字:
# ls -l /dev/ | grep "^l"
示例输出
lrwxrwxrwx 1 root root 3 May 18 10:26 cdrom -> sr0 lrwxrwxrwx 1 root root 11 May 18 15:54 core -> /proc/kcore lrwxrwxrwx 1 root root 13 May 18 15:54 fd -> /proc/self/fd lrwxrwxrwx 1 root root 4 May 18 10:26 rtc -> rtc0 lrwxrwxrwx 1 root root 8 May 18 10:26 shm -> /run/shm lrwxrwxrwx 1 root root 15 May 18 15:54 stderr -> /proc/self/fd/2 lrwxrwxrwx 1 root root 15 May 18 15:54 stdin -> /proc/self/fd/0 lrwxrwxrwx 1 root root 15 May 18 15:54 stdout -> /proc/self/fd/1
您可以使用符号链接ln
在Linux工具,如下面的例子。
# touch file1.txt # ln -s file1.txt /home/youcl/file1.txt [create symbolic link] # ls -l /home/youcl/ | grep "^l" [List symbolic links]
在上面的例子中,我创建了一个名为file1.txt
在/ tmp目录下 ,然后创建符号链接,/home/youcl/file1.txt指向/tmp/file1.txt。
管或命名管道 :这些文件,允许由一个处理的输出连接到另一输入端的进程间通信。
命名管道实际上是两个进程用于与每个进程通信的文件,它充当Linux管道。
在目录中列出管道套接字:
# ls -l | grep "^p"
示例输出
prw-rw-r-- 1 youcl youcl 0 May 18 17:47 pipe1 prw-rw-r-- 1 youcl youcl 0 May 18 17:47 pipe2 prw-rw-r-- 1 youcl youcl 0 May 18 17:47 pipe3 prw-rw-r-- 1 youcl youcl 0 May 18 17:47 pipe4 prw-rw-r-- 1 youcl youcl 0 May 18 17:47 pipe5
您可以使用mkfifo子程序在Linux中创建一个命名管道如下。
# mkfifo pipe1 # echo "This is named pipe1" > pipe1
在上面的例子中,我创建了一个叫做命名管道pipe1
,然后我用的推移,一些数据给它echo命令 ,后壳成为联合国的互动,同时处理输入。
然后我打开另一个shell并运行another命令打印输出传递给管道。
# while read line ;do echo "This was passed-'$line' "; done<pipe1
套接字文件 :这些是提供进程间通信的一种手段文件,但它们可以在不同的环境中运行的进程之间传输的数据和信息。
这意味着套接字在网络上的不同机器上运行的进程之间提供数据和信息传递。
一个显示套接字工作的例子是Web浏览器与Web服务器建立连接。
# ls -l /dev/ | grep "^s"
示例输出
srw-rw-rw- 1 root root 0 May 18 10:26 log
这是一个套接字示例使用在C上创建socket()
系统调用。
int socket_desc= socket(AF_INET, SOCK_STREAM, 0 );
在上面:
-
AF_INET
是地址族(IPv4)的 -
SOCK_STREAM
是类型(连接TCP协议导向) -
0
是协议(IP协议)
来指socket文件,使用socket_desc
,这是相同的文件描述符,并使用read()
和write()
系统调用来读出并分别从套接字写。
目录
这些是存储包括普通及其他特殊文件的特殊文件,它们在从根开始的层次结构中的Linux文件系统的组织(/)
目录中。
列出目录中的套接字:
# ls -l / | grep "^d"
示例输出
drwxr-xr-x 2 root root 4096 May 5 15:49 bin drwxr-xr-x 4 root root 4096 May 5 15:58 boot drwxr-xr-x 2 root root 4096 Apr 11 2015 cdrom drwxr-xr-x 17 root root 4400 May 18 10:27 dev drwxr-xr-x 168 root root 12288 May 18 10:28 etc drwxr-xr-x 3 root root 4096 Apr 11 2015 home drwxr-xr-x 25 root root 4096 May 5 15:44 lib drwxr-xr-x 2 root root 4096 May 5 15:44 lib64 drwx------ 2 root root 16384 Apr 11 2015 lost+found drwxr-xr-x 3 root root 4096 Apr 10 2015 media drwxr-xr-x 3 root root 4096 Feb 23 17:54 mnt drwxr-xr-x 16 root root 4096 Apr 30 16:01 opt dr-xr-xr-x 223 root root 0 May 18 15:54 proc drwx------ 19 root root 4096 Apr 9 11:12 root drwxr-xr-x 27 root root 920 May 18 10:54 run drwxr-xr-x 2 root root 12288 May 5 15:57 sbin drwxr-xr-x 2 root root 4096 Dec 1 2014 srv dr-xr-xr-x 13 root root 0 May 18 15:54 sys drwxrwxrwt 13 root root 4096 May 18 17:55 tmp drwxr-xr-x 11 root root 4096 Mar 31 16:00 usr drwxr-xr-x 12 root root 4096 Nov 12 2015 var
您可以使用mkdir命令创建一个目录。
# mkdir -m 1666 youcl.com # mkdir -m 1666 news.youcl.com # mkdir -m 1775 linuxsay.com
概要
您现在应该清楚地了解为什么Linux中的一切都是一个文件,以及可以在Linux系统上退出的不同类型的文件。
您可以通过阅读有关单个文件类型的更多信息来添加更多内容,并创建它们。 我希望这篇指南对您有所帮助,对于您希望分享的任何问题和其他信息,请留下评论,我们将讨论更多。