目录
1、普通文件
2、目录文件
3、字符设备文件
4、块设备文件
5、符号链接文件
6、套接字文件
7、管道文件
8、stat命令和ls命令
8.1、stat命令
8.2、ls命令
9、stat、fstat、lstat函数
9.1、stat函数
9.2、fstat函数
9.3、lstat函数
在Windows系统中,操作系统通常通过文件名后缀来识别文件类型。例如,C语言头文件使用“.h”后缀,C语言源文件使用“.c”后缀,文本文件使用“.txt”后缀,压缩包文件使用“.zip”后缀。打开文件时,Windows会根据文件名后缀确定文件类型,然后调用相应的程序打开它。例如,打开“.c”文件时会使用C代码编辑器,打开“.zip”文件时会使用解压软件。
然而,在Linux系统中,文件类型并不是通过文件后缀名来识别的。这并不意味着文件名后缀可以随意添加。文件名和后缀主要是为了方便“人”查看和识别。尽管Linux系统不依赖后缀来识别文件,但规范地使用后缀仍然很重要。例如,C源文件应以“.c”结尾,C头文件应以“.h”结尾,Shell脚本文件应以“.sh”结尾。这是为了方便我们自己查看和管理文件。
在Linux系统中,共有七种文件类型:
- 普通文件;
- 目录文件;
- 字符设备文件;
- 块设备文件;
- 符号链接文件;
- 套接字文件;
- 管道文件。
1、普通文件
普通文件(regular file)是Linux系统中最常见的文件类型,如文本文件、二进制文件以及我们编写的源代码文件等。普通文件中的数据存储在系统磁盘中,可以访问和读取这些文件中的内容,文件内容以字节为单位进行存储和访问。
普通文件可以分为两大类:文本文件和二进制文件。
文本文件:文本文件的内容由ASCII码字符构成。虽然文件本质上都是数字(因为计算机只识别0和1,磁盘上的文件内容也是由0和1构成),但文本文件中的数字应该被理解为对应的ASCII字符码。例如,常见的.c、.h、.sh、.txt文件都是文本文件。文本文件的优点是方便人类阅读、浏览和编写。
示例:
cat example.txt
二进制文件:二进制文件中存储的也是数字,但这些数字不是文本字符编码,而是真正的数值。例如,Linux系统下的可执行文件、C代码编译后的.o文件、.bin文件等都是二进制文件。
示例:
hexdump -C example.bin
2、目录文件
目录文件(directory file)是用于组织和管理其他文件和子目录的特殊文件。目录文件包含指向其他文件和目录的列表,使得文件系统具有层次结构。目录文件的主要作用是提供一种方式来组织文件系统中的数据,使得文件和目录可以以一种树状结构进行管理。
3、字符设备文件
字符设备文件(Character Device File)是一种特殊的文件类型,用于与字符设备进行直接的字符流通信。字符设备通常是那些可以一次一个字符地读写的设备,如键盘、鼠标、串口(serial port)和终端(terminal)。
4、块设备文件
块设备文件(block device file)是一种特殊的文件类型,用于与块设备进行交互。块设备是一种数据存储设备,允许以固定大小的块(通常为512字节或更大的倍数)进行数据读写操作。常见的块设备包括硬盘、光盘、USB存储设备等。
下图中agpgart、autofs、btrfs-control、console 等这些都是字符设备文件,而 loop0、loop1这些便是块设备文件。
5、符号链接文件
符号链接文件(symbolic link file,也称为软链接)是一种特殊的文件类型,用于指向另一个文件或目录。符号链接类似于Windows系统中的快捷方式。符号链接文件包含指向目标文件或目录的路径,而不是文件内容本身。它们允许用户方便地访问和管理文件和目录。
在上图中,cdrom、cdrw、fd、initctl等这些文件都是符号链接文件,箭头所指向的文件路径便是符号链接文件所指向的文件。
6、套接字文件
套接字文件是Linux系统中用于进程间通信的特殊文件类型,常用于本地进程间通信。它们允许同一台机器上的进程通过文件系统中的套接字文件进行通信。通过使用编程接口,可以方便地创建和管理套接字文件,实现高效的进程间通信。
7、管道文件
管道文件(pipe)是一种特殊的文件类型,用于在进程间进行通信。管道文件提供了一种单向数据流的机制,其中一个进程向管道写入数据,而另一个进程从管道读取数据。管道文件在命令行中广泛用于将一个命令的输出传递给另一个命令作为输入。
8、stat命令和ls命令
stat
命令和 ls
命令是Linux系统中常用的两个命令,用于查看文件和目录的详细信息。
8.1、stat
命令
stat
命令用于显示文件或文件系统的详细状态信息。它提供的信息包括文件的大小、权限、所有者、修改时间、访问时间等。
查看单个文件的信息:
stat example.txt
输出示例:
File: example.txt
Size: 1234 Blocks: 8 IO Block: 4096 regular file
Device: 803h/2051d Inode: 1234567 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ user) Gid: ( 1000/ user)
Access: 2024-06-06 12:00:00.000000000 +0000
Modify: 2024-06-06 12:00:00.000000000 +0000
Change: 2024-06-06 12:00:00.000000000 +0000
Birth: -
查看目录的信息:
stat /home/user
输出示例:
File: /home/user
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: 803h/2051d Inode: 567890 Links: 2
Access: (0755/drwxr-xr-x) Uid: ( 1000/ user) Gid: ( 1000/ user)
Access: 2024-06-06 12:00:00.000000000 +0000
Modify: 2024-06-06 12:00:00.000000000 +0000
Change: 2024-06-06 12:00:00.000000000 +0000
Birth: -
8.2、ls
命令
ls
命令用于列出目录内容。它有很多选项,可以显示文件的各种信息,如权限、所有者、大小和修改时间等。
显示详细信息:
ls -l
输出示例:
total 12
-rw-r--r-- 1 user user 1234 Jun 6 12:00 example.txt
drwxr-xr-x 2 user user 4096 Jun 6 12:00 documents
drwxr-xr-x 3 user user 4096 Jun 6 12:00 projects
示例参数说明:
- ' - ':代表普通文件,即包含文本内容或二进制数据的文件。
- ' d ':代表目录文件,用于存储其他文件或目录的容器。
- ' c ':代表字符设备文件,用于与字符设备进行通信,如终端设备或串行端口。
- ' b ':代表块设备文件,用于与块设备进行通信,如硬盘驱动器或磁盘分区。
- ' l ':代表符号链接文件,用于指向其他文件或目录的路径。
- ' s ':代表套接字文件,用于进程间通信,通常用于网络通信或本地通信。
- ' p ':代表管道文件,用于进程间通信,允许单向数据流的传输。
通过使用这些命令,可以方便地查看文件和目录的详细信息,以便更好地管理和操作系统中的文件。
9、stat
、fstat
、lstat函数
stat
、fstat
、lstat
是Linux中用于获取文件属性的系统调用函数。它们的主要作用是读取文件的元数据,如文件大小、权限、所有者等。以下是这三个函数的详细说明、作用和使用方法。
stat
:获取指定路径文件的属性信息,解析符号链接指向的文件。fstat
:获取通过文件描述符指定的文件的属性信息。lstat
:获取指定路径文件的属性信息,如果是符号链接,返回链接本身的属性。
这些函数在文件管理和系统编程中非常重要,能够帮助开发者获取文件的详细信息并进行相应处理。理解它们的用法和区别对于编写高效、健壮的程序至关重要。
在Linux中,stat
、fstat
、和lstat
函数都使用同一个结构体struct stat
来存储文件的元数据。这个结构体包含了文件的多种属性信息,如文件大小、文件类型、权限、所有者、时间戳等。
struct stat
结构体定义在头文件<sys/stat.h>
中。它的典型定义如下:
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>struct stat {dev_t st_dev; /* 文件的设备ID */ino_t st_ino; /* 文件的索引节点号 */mode_t st_mode; /* 文件的类型和权限 */nlink_t st_nlink; /* 硬链接数 */uid_t st_uid; /* 所有者用户ID */gid_t st_gid; /* 所有者组ID */dev_t st_rdev; /* 特殊设备ID(如果此文件是设备文件) */off_t st_size; /* 文件大小,以字节为单位 */blksize_t st_blksize; /* 文件系统I/O的块大小 */blkcnt_t st_blocks; /* 分配给此文件的512字节块的数量 */time_t st_atime; /* 最后一次访问时间 */time_t st_mtime; /* 最后一次修改时间 */time_t st_ctime; /* 最后一次状态改变时间(元数据) */
};
各字段的含义如下:
st_dev
:表示文件所在设备的设备号。文件系统中,每个设备都有一个唯一的设备号。st_ino
:表示文件的索引节点号(inode number),它是文件在文件系统中的唯一标识。st_mode
:表示文件的类型和权限。使用位掩码可以提取出文件类型和权限信息。st_nlink
:表示文件的硬链接数量。一个文件可以有多个硬链接,它们共享同一个索引节点。st_uid
:表示文件所有者的用户ID。st_gid
:表示文件所有者的组ID。st_rdev
:如果文件是字符设备或块设备文件,则此字段表示设备号。st_size
:表示文件的大小,以字节为单位。st_blksize
:表示文件系统I/O的块大小。st_blocks
:表示分配给文件的512字节块的数量。st_atime
:表示文件最后一次访问的时间。st_mtime
:表示文件最后一次修改的时间。st_ctime
:表示文件最后一次状态改变的时间(例如,权限修改)。
9.1、stat
函数
int stat(const char *path, struct stat *buf);
参数:
path
:文件路径。buf
:指向stat
结构体的指针,用于存储文件属性信息。
返回值:
- 成功时返回0。
- 失败时返回-1,并设置
errno
来指示错误。
作用: 获取指定路径文件的属性信息。
示例如下:
#include <stdio.h>
#include <sys/stat.h>
#include <time.h>int main() {struct stat fileStat;if (stat("example.txt", &fileStat) < 0) {perror("stat");return 1;}printf("File Size: %ld bytes\n", fileStat.st_size);printf("Number of Links: %lu\n", fileStat.st_nlink);printf("File inode: %lu\n", fileStat.st_ino);printf("File Permissions: ");printf((S_ISDIR(fileStat.st_mode)) ? "d" : "-");printf((fileStat.st_mode & S_IRUSR) ? "r" : "-");printf((fileStat.st_mode & S_IWUSR) ? "w" : "-");printf((fileStat.st_mode & S_IXUSR) ? "x" : "-");printf((fileStat.st_mode & S_IRGRP) ? "r" : "-");printf((fileStat.st_mode & S_IWGRP) ? "w" : "-");printf((fileStat.st_mode & S_IXGRP) ? "x" : "-");printf((fileStat.st_mode & S_IROTH) ? "r" : "-");printf((fileStat.st_mode & S_IWOTH) ? "w" : "-");printf((fileStat.st_mode & S_IXOTH) ? "x" : "-");printf("\n");return 0;
}
9.2、fstat
函数
int fstat(int fd, struct stat *buf);
参数:
fd
:文件描述符。buf
:指向stat
结构体的指针,用于存储文件属性信息。
返回值:
- 成功时返回0。
- 失败时返回-1,并设置
errno
来指示错误。
作用: 获取通过文件描述符指定的文件的属性信息。
示例如下:
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main() {struct stat fileStat;int fd = open("example.txt", O_RDONLY);if (fd < 0) {perror("open");return 1;}if (fstat(fd, &fileStat) < 0) {perror("fstat");close(fd);return 1;}printf("File Size: %ld bytes\n", fileStat.st_size);printf("Number of Links: %lu\n", fileStat.st_nlink);printf("File inode: %lu\n", fileStat.st_ino);close(fd);return 0;
}
9.3、lstat
函数
int lstat(const char *path, struct stat *buf);
参数:
path
:文件路径。buf
:指向stat
结构体的指针,用于存储文件属性信息。
返回值:
- 成功时返回0。
- 失败时返回-1,并设置
errno
来指示错误。
作用: 获取指定路径文件的属性信息,但如果路径是符号链接,返回链接本身的属性,而不是链接指向的文件。
示例如下:
#include <stdio.h>
#include <sys/stat.h>int main() {struct stat fileStat;if (lstat("symlink", &fileStat) < 0) {perror("lstat");return 1;}printf("File Size: %ld bytes\n", fileStat.st_size);printf("Number of Links: %lu\n", fileStat.st_nlink);printf("File inode: %lu\n", fileStat.st_ino);printf("File Permissions: ");printf((S_ISLNK(fileStat.st_mode)) ? "l" : "-");printf((fileStat.st_mode & S_IRUSR) ? "r" : "-");printf((fileStat.st_mode & S_IWUSR) ? "w" : "-");printf((fileStat.st_mode & S_IXUSR) ? "x" : "-");printf((fileStat.st_mode & S_IRGRP) ? "r" : "-");printf((fileStat.st_mode & S_IWGRP) ? "w" : "-");printf((fileStat.st_mode & S_IXGRP) ? "x" : "-");printf((fileStat.st_mode & S_IROTH) ? "r" : "-");printf((fileStat.st_mode & S_IWOTH) ? "w" : "-");printf((fileStat.st_mode & S_IXOTH) ? "x" : "-");printf("\n");return 0;
}