【Linux】Linux常见文件类型

2023-12-21 17:18:05

在Linux系统中,常见的基本文件类型包括:

  • 普通文件(Regular file):包含文本文件、二进制文件、可执行文件等。
  • 目录(Directory):用于组织和存储其他文件和目录。
  • 链接(Link):类似于Windows系统中的快捷方式,它是一个指向其他文件或目录的特殊文件。
  • 设备文件(Device file):用于与系统中的设备进行交互,分为字符设备文件和块设备文件。
  • 套接字(Socket):用于进程间的网络通信。
  • 管道(FIFO):用于进程间的单向通信。
  • 其他特殊文件类型,如设备节点(Device node)和共享内存(Shared memory)等。

这些文件类型在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下链接分为硬链接和软链接:

  • 软链接Symbolic link,也称为符号链接):可以理解为windows下的快捷方式,可以让你快速链接到目标文件。
  • 硬链接(Hard link):其实底层是同一个文件,只不过inode的links数不为1。

无论是硬链接还是软连接,如果修改任意一方,另外一个文件也会看到这个变化。

软链接的演示

要创建软链接,可以使用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会标红。
1653442869059.png

硬链接的演示

要创建硬链接,可以使用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

块设备文件和字符设备文件的区别

块设备文件和字符设备文件的区别如下:

  • 数据传输方式:块设备文件以固定大小的块为单位进行数据传输,而字符设备文件以字符为单位进行数据传输。块设备文件通常用于与磁盘、U盘等块设备进行交互,而字符设备文件通常用于与终端、键盘等字符设备进行交互。
  • 缓冲方式:块设备文件使用缓冲区进行数据读写,可以进行缓存和批量操作,以提高性能。而字符设备文件直接将数据传递给设备,不进行缓存,适用于实时性要求较高的设备。
  • 访问权限:块设备文件通常需要root权限才能进行读写操作,因为对块设备的读写可能会对文件系统造成影响。而字符设备文件通常可以由普通用户进行读写操作。
  • 设备节点:块设备文件的设备节点类型为b,字符设备文件的设备节点类型为c。在/dev目录下,块设备文件的设备节点名称通常以sd开头(如sda、sdb),字符设备文件的设备节点名称通常以tty开头(如tty1、ttyUSB0)。
  • 文件访问方式:块设备文件可以像普通文件一样进行随机访问,可以使用seek操作来定位到文件的任意位置进行读写。而字符设备文件通常只能进行顺序访问,不能使用seek操作。

在使用这些设备文件时,可以通过文件系统挂载来访问块设备文件,以便读写文件系统中的数据。而字符设备文件通常通过设备节点直接与设备进行交互,如读取终端输入、发送数据到打印机等。

需要注意的是,块设备文件和字符设备文件的操作方式和使用方法可能会有所不同,因此在使用时需要根据具体的设备类型和需求进行选择。

socket套接字

套接字(Socket)是一种用于实现进程间通信的机制,它提供了一种在不同主机上的进程之间进行网络通信的方式。套接字可以通过文件系统中的特殊文件来表示,这些特殊文件被称为套接字文件。

套接字文件类型有两种:

  • 流套接字文件(Stream socket file):流套接字是一种基于TCP协议的套接字,它提供了可靠的、面向连接的通信。在文件系统中,流套接字文件的设备节点类型为s。
  • 数据报套接字文件(Datagram socket file):数据报套接字是一种基于UDP协议的套接字,它提供了无连接的、不可靠的通信。在文件系统中,数据报套接字文件的设备节点类型为u。

通常在/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)是一种特殊的文件类型,用于实现进程间的通信。它可以将一个进程的输出直接传递给另一个进程的输入,从而实现数据的传输和共享。

管道有两种类型:

  • 匿名管道(Anonymous pipe):匿名管道是最简单的一种管道形式,它在创建时不需要指定任何特定的名称。匿名管道只能用于具有亲缘关系(父子进程)的进程之间的通信。它通过使用pipe系统调用来创建,返回两个文件描述符,一个用于读取数据,一个用于写入数据。在使用匿名管道时,写入的数据会被传递到读取端,进程间的通信是单向的。
  • 命名管道(Named pipe):命名管道也被称为FIFO(First In First Out),它是一种具有命名的特殊文件。命名管道可以用于不具有亲缘关系的进程之间的通信。命名管道通过使用mkfifo命令或mkfifo系统调用来创建,创建后的命名管道将在文件系统中具有一个路径和名称。进程可以通过打开该路径来读取和写入数据,进程间的通信是双向的。

无论是匿名管道还是命名管道,它们都是通过读取和写入文件描述符来进行数据传输的。进程可以将数据写入管道的写入端,而另一个进程可以从管道的读取端读取数据。

管道命令可以将前一个命令的输出作为后一个命令的输入:

head -8 test.txt | tail -1 

例如上面的命令就可以只输出文本test.txt中第8行的信息。

管道的使用可以通过shell命令、C语言的标准输入输出函数(如pipe、read、write)等来实现。管道的主要特点是数据传输是按照先进先出(FIFO)的顺序进行的。

文章来源:https://blog.csdn.net/u022812849/article/details/135132216
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。