在Linux系统中,常见的基本文件类型包括:
这些文件类型在Linux系统中都有各自的标识符和权限设置,下面分别演示各种文件类型的特性。
ll命令打印出来结果的第一列表示文件的类型。
普通文件类型对应ll命令第一列显示的-
。
$ ll
-rw-rw-r-- 1 vagrant vagrant 7 Dec 21 06:07 ooxx.txt
目录类型对应ll命令第一列显示的d
。
$ ll
drwxrwxr-x 2 vagrant vagrant 4096 Dec 21 06:07 test/
Linux下链接分为硬链接和软链接:
无论是硬链接还是软连接,如果修改任意一方,另外一个文件也会看到这个变化。
要创建软链接,可以使用ln命令的-s选项,
$ ln -s xxx.txt yyy.txt
可以发现xxx.txt和yyy.txt的inode号不同,是两个不一样的文件,xxx.txt是源文件,yyy.txt是一个快捷方式:
$ stat xxx.txt
File: `xxx.txt'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd00h/64768d Inode: 1197701 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2021-03-01 19:04:47.324964864 +0800
Modify: 2021-03-01 19:04:47.324964864 +0800
Change: 2021-03-01 19:04:47.324964864 +0800
# stat yyy.txt
File: `yyy.txt' -> `xxx.txt'
Size: 7 Blocks: 0 IO Block: 4096 symbolic link
Device: fd00h/64768d Inode: 1197702 Links: 1
Access: (0777/lrwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2021-03-01 19:05:56.010964909 +0800
Modify: 2021-03-01 19:05:56.010964909 +0800
Change: 2021-03-01 19:05:56.010964909 +0800
删除源文件:
$ ll
total 0
-rw-r--r--. 1 root root 0 Mar 1 19:04 xxx.txt
lrwxrwxrwx. 1 root root 7 Mar 1 19:05 yyy.txt -> xxx.txt
$ rm -rf xxx.txt
源文件被删除了,那么快捷方式就会报错,shell会标红。
要创建硬链接,可以使用ln命令。
$ ln test.txt xxx.txt
可以发现test.txt和xxx.txt其实是同一个inode号,也就是说这两个链接指向的是同一个文件,Links为2表示有两个链接指向它:
$ stat test.txt
File: `test.txt'
Size: 58 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 1197702 Links: 2
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2021-03-01 17:57:03.273967638 +0800
Modify: 2021-03-01 17:57:03.273967638 +0800
Change: 2021-03-01 17:57:31.313967620 +0800
$ stat xxx.txt
File: `xxx.txt'
Size: 58 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 1197702 Links: 2
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2021-03-01 17:57:03.273967638 +0800
Modify: 2021-03-01 17:57:03.273967638 +0800
Change: 2021-03-01 17:57:31.313967620 +0800
随便删除其中一个文件,inode对应的links数就会减一。
$ rm -rf test.txt
$ stat xxx.txt
File: `xxx.txt'
Size: 58 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 1197702 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2021-03-01 17:57:03.273967638 +0800
Modify: 2021-03-01 17:57:03.273967638 +0800
Change: 2021-03-01 17:59:44.479967355 +0800
硬链接和软链接是两种不同类型的链接方式,用于创建文件之间的关联。它们具有一些区别和特点,下面是它们的主要区别:
总的来说,硬链接提供了一种更紧密的文件关联方式,它们与原始文件共享相同的inode和数据块。而软链接提供了一种更灵活的文件关联方式,它们是一个特殊的文件,指向原始文件的路径。
在实际应用中,硬链接常用于创建文件的备份和共享文件,而软链接常用于创建快捷方式和跨文件系统的链接。
需要注意的是,软链接可能会因为目标文件的移动或删除而失效,而硬链接则不会受到影响。在选择使用硬链接还是软链接时,需要根据具体的需求和场景进行判断。
在Linux系统中,块设备文件(Block device file)和字符设备文件(Character device file)是用于与设备进行交互的两种不同类型的设备文件。
块设备文件类型对应ll命令第一列显示的b
,可以看出sda硬盘对应的文件类型为b(块设备文件)。
$ ll /dev
brw-rw----. 1 root disk 8, 0 Nov 16 2019 sda
brw-rw----. 1 root disk 8, 1 Nov 16 2019 sda1
brw-rw----. 1 root disk 8, 2 Nov 16 2019 sda2
字符设备文件类型对应ll命令第一列显示的c
,tty终端命令行对应的文件类型为c(字符设备文件)。
$ ll /dev
crw-rw-rw-. 1 root tty 5, 0 Nov 16 2019 tty
crw--w----. 1 root tty 4, 0 Nov 16 2019 tty0
crw--w----. 1 root tty 4, 1 Nov 16 2019 tty1
块设备文件和字符设备文件的区别如下:
在使用这些设备文件时,可以通过文件系统挂载来访问块设备文件,以便读写文件系统中的数据。而字符设备文件通常通过设备节点直接与设备进行交互,如读取终端输入、发送数据到打印机等。
需要注意的是,块设备文件和字符设备文件的操作方式和使用方法可能会有所不同,因此在使用时需要根据具体的设备类型和需求进行选择。
套接字(Socket)是一种用于实现进程间通信的机制,它提供了一种在不同主机上的进程之间进行网络通信的方式。套接字可以通过文件系统中的特殊文件来表示,这些特殊文件被称为套接字文件。
套接字文件类型有两种:
通常在/var/run这个目录中看到这种文件类型。
使用 ls -l 或者ll命令后,块设备文件的第一个字符是 “s”(sockets)
流套接字文件的设备节点类型对应ll命令第一列显示的s
:
$ ll /run/systemd/notify
srwxrwxrwx 1 root root 0 Dec 20 07:37 /run/systemd/notify=
套接字文件允许进程通过文件系统接口来进行套接字的读取、写入和控制操作。通过打开套接字文件,进程可以创建套接字并与其他进程进行通信,发送和接收数据。
需要注意的是,套接字文件并不是普通的文件,它们是用于实现进程间通信的特殊文件类型。在使用套接字文件时,需要使用套接字编程接口(如socket、bind、connect、send、recv等函数)来进行套接字的操作。
管道(Pipe)是一种特殊的文件类型,用于实现进程间的通信。它可以将一个进程的输出直接传递给另一个进程的输入,从而实现数据的传输和共享。
管道有两种类型:
无论是匿名管道还是命名管道,它们都是通过读取和写入文件描述符来进行数据传输的。进程可以将数据写入管道的写入端,而另一个进程可以从管道的读取端读取数据。
管道命令可以将前一个命令的输出作为后一个命令的输入:
head -8 test.txt | tail -1
例如上面的命令就可以只输出文本test.txt中第8行的信息。
管道的使用可以通过shell命令、C语言的标准输入输出函数(如pipe、read、write)等来实现。管道的主要特点是数据传输是按照先进先出(FIFO)的顺序进行的。