文件与目录
文件
文件本质上是一个存放数据的容器。逻辑上,文件由一个以文件尾结束的连续字节流组成。物理上,文件由存储在磁盘这类稳定介质中的一系列的数据块组成。UNIX文件系统中,每一个存放在磁盘上的文件由以下两部分组成:
数据块——实际存放文件数据的磁盘块。
inode——UNIX文件系统中用于描述文件特征的数据结构,它包含文件的重要信息,如数据在磁盘上的地址,文件中数据块的大小,文件的属主是谁等。inode也称为文件索引结点或信息结点。在同一个文件系统中,每一个inode有唯一的标识号,称为inode号,也称为文件顺序号。
尽管应用极少关心文件在磁盘上的物理位置,通常也不关心inode号,但知道什么是inode对深入理解UNIX文件会有所帮助,因为应用常常会要关心文件的以下信息,所有这些信息都存储在文件的inode中。
文件的类型:UNIX文件系统有几种不同类型的文件:普通文件、目录、特别文件、有名管道(FIFO)、符号链接和套接字。
文件的属主关系:拥有此文件的用户和组。
文件的访问权限:是否允许文件属主、同组用户以及其他人读、写或执行该文件。
文件的时间戳:文件的修改时间、最后一次访问时间、最后一次修改inode的时间。
UNIX命令“ls-l”可查看到inode的大部分内容,“ls-i”可显示出文件的inode号,而命令stat则几乎列出了inode的每一项内容。例如,在Linux系统中用命令stat可查看到某个文件的inode状态如下:
$ stat myoutput
File: myoutput
Size: 37 Blocks: 8 IO Block: 4096 regular file
Device: 805h/2053d Inode: 1840083 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ xqm) Gid: ( 1000/ xqm)
Access: 2022-07-20 17:06:57.792862203 +0800
Modify: 2022-07-20 17:06:53.984795065 +0800
Change: 2022-07-20 17:06:53.984795065 +0800
Birth: -
输出中的第二行给出了文件的大小、块数以及类型(普通文件),第三行给出了文件驻存的设备ID、inode号、链接数;第四行指出了文件的访问权限、它的属主ID和组ID;最后三行给出了文件的三种时间戳。
stat()、fstat()和lstat()函数
在程序中查看文件的特征,即它的inode状态信息,可用stat()、fstat()和lstat()函数。
#include <sys/types.h>
#include <sys/stat.h>
int stat (const char *pathname, struct stat *buf);
int fstat(int fd, struct stat *buf);
long int lstat (const char *pathname, struct stat *buf);
其中,fstat()返回与描述字filedes相连文件的特征。stat()和lstat()返回路径名pathname指定文件的特征。当给定的文件不是符号链接(4.2.4节)时,这两个函数的结果相同;当文件是符号链接时,stat()返回链接所引用的文件的特征,而lstat()返回链接本身的特征。返回的文件特征存储在buf所指类型为stat的结构中,此结构的存储空间由应用程序提供。stat结构的完整定义会随系统不同而稍有不同,但至少都含有表4-1中列出的成员。
stat()十分有用,当应用程序需要知道文件的诸如属主ID、访问权