备注

对于由内核自动生成的伪文件,内核报告的文件大小(stat.st_size; statx.stx_size)不正确。例如,对于/ proc目录下的许多文件,返回值0,而/ sys下的各种文件报告的大小为4096字节,即使文件内容较小。对于此类文件,应该简单地尝试读取尽可能多的字节(如果要将aq \ 0aq解释为字符串,则将其附加到返回的缓冲区中)。

说明

每个文件都有一个包含有关该文件的元数据的索引节点。应用程序可以使用返回一个stat结构的stat(2)(或相关调用)或返回一个statx结构的statx(2)来检索此元数据。

以下是通常在文件inode中发现或与之相关的信息的列表,以及由stat(2)和statx(2)返回的相应结构字段的名称:

Device where inode resides
stat.st_dev; statx.stx_dev_minor和statx.stx_dev_major
每个索引节点(以及关联的文件)都驻留在设备上托管的文件系统中。该设备由其主要ID(标识设备的通用类别)和次要ID(标识通用类别中的特定实例)的组合来标识。
Inode number
stat.st_ino; statx.stx_ino
文件系统中的每个文件都有一个唯一的索引节点号。保证索引节点号仅在文件系统内是唯一的(即,相同的索引节点号可能由不同的文件系统使用,这是硬链接可能不会跨越文件系统边界的原因)。该字段包含文件的索引节点号。
File type and mode
stat.st_mode; statx.stx_mode
请参阅下面有关文件类型和模式的讨论。
Link count
stat.st_nlink; statx.stx_nlink
该字段包含到文件的硬链接数。使用link(2)创建指向现有文件的其他链接。
User ID
st_uid stat.st_uid; statx.stx_uid
该字段记录文件所有者的用户标识。对于新创建的文件,文件用户ID是创建过程的有效用户ID。可以使用chown(2)更改文件的用户ID。
Group ID
stat.st_gid; statx.stx_gid
索引节点记录文件的组所有者的ID。对于新创建的文件,文件组ID是父目录的组ID或创建过程的有效组ID,具体取决于父目录上是否设置了set-group-ID位(请参见下文) 。可以使用chown(2)更改文件的组ID。
Device represented by this inode
stat.st_rdev; statx.stx_rdev_minor和statx.stx_rdev_major
如果此文件(inode)代表一个设备,则该inode会记录该设备的主要和次要ID。
File size
stat.st_size; statx.stx_size
该字段以字节为单位给出文件的大小(如果是常规文件或符号链接)。符号链接的大小是它包含的路径名的长度,没有终止的空字节。
Preferred block size for I/O
stat.st_blksize; statx.stx_blksize
该字段为有效的文件系统I / O提供了"首选"块大小。 (以较小的块写入文件可能会导致读取-修改-重写效率低下。)
Number of blocks allocated to the file
stat.st_blocks; statx.stx_size
该字段指示分配给文件的块数,以512字节为单位(当文件有孔时,该数目可以小于st_size / 512)。
POSIX.1标准注意到该标准未定义stat结构的st_blocks成员的单位。在许多实现中,它是512个字节;在一些系统上,使用不同的单位,例如1024。此外,该单位可能基于每个文件系统而不同。
Last access timestamp (atime)
stat.st_atime; statx.stx_atime
这是文件的最后访问时间戳。它通过文件访问(例如execve(2),mknod(2),pipe(2),utime(2)和read(2)(大于零字节))进行更改。其他接口(例如mmap(2))可能会也可能不会更新atime时间戳
某些文件系统类型允许以这样的方式安装:文件和/或目录访问不会导致更新atime时间戳。 (请参阅mount(8)中的noatime,nodiratime和relatime,以及mount(2)中的相关信息。)此外,如果使用O_NOATIME标志打开文件,则不会更新atime时间戳;参见open(2)。
File creation (birth) timestamp (btime)
(未在stat结构中返回); statx.stx_btime
文件的创建时间戳。这是在文件创建时设置的,以后不会更改。
历史上btime时间戳在UNIX系统上不存在,并且大多数Linux文件系统目前不支持。
Last modification timestamp (mtime)
stat.st_mtime; statx.stx_mtime
这是文件的最后修改时间戳。它通过文件修改(例如,大于零字节的mknod(2),truncate(2),utime(2)和write(2))进行更改。此外,通过在该目录中创建或删除文件来更改目录的mtime时间戳。对于所有者,组,硬链接数或模式的更改,不会更改mtime时间戳。
Last status change timestamp (ctime)
stat.st_ctime; statx.stx_ctime
这是文件的最后状态更改时间戳。通过写入或设置inode信息(即所有者,组,链接数,模式等)来更改它。

时间戳记字段报告在世界时(UTC)1970-01-02 00:00:00 +0000,用零点测量的时间(请参阅time(7))。

XFS,JFS,Btrfs和ext4(从Linux 2.6.23开始)支持纳秒级时间戳。 ext2,ext3和Reiserfs不支持纳秒级时间戳。为了返回具有纳秒精度的时间戳,将stat和statx结构中的时间戳字段定义为包含纳秒分量的结构。有关详细信息,请参见stat(2)和statx(2)。在不支持亚秒级时间戳记的文件系统上,stat和statx结构中的纳秒字段返回值为0。

The file type and mode

stat.st_mode字段(对于statx(2),为statx.stx_mode字段)包含文件类型和模式。

POSIX将与掩码S_IFMT对应的stat.st_mode位(请参见下文)称为文件类型,将与掩码07777对应的12位称为文件模式位,并将最低有效9位(0777)作为文件许可位。

为文件类型定义了以下掩码值:

S_IFMT0170000bit mask for the file type bit field
S_IFSOCK0140000socket
S_IFLNK0120000symbolic link
S_IFREG0100000regular file
S_IFBLK0060000block device
S_IFDIR0040000directory
S_IFCHR0020000character device
S_IFIFO0010000FIFO

因此,要测试常规文件(例如),可以编写:

stat(pathname, &sb);
if ((sb.st_mode & S_IFMT) == S_IFREG) {
    /* Handle regular file */
}

由于上述形式的测试是通用的,因此POSIX定义了其他宏,以使st_mode中的文件类型测试可以更简洁地编写:

S_ISREG(m)
它是常规文件吗?
S_ISDIR(m)
目录?
S_ISCHR(m)
角色设备?
S_ISBLK(m)
阻止设备?
S_ISFIFO(m)
FIFO(命名管道)?
S_ISLNK(m)
符号链接? (不在POSIX.1-1996中。)
S_ISSOCK(m)
插座? (不在POSIX.1-1996中。)

前面的代码片段因此可以重写为:

stat(pathname, &sb);
if (S_ISREG(sb.st_mode)) {
    /* Handle regular file */
}

如果定义了以下任何功能测试宏,则将提供大多数上述文件类型测试宏的定义:BSD_SOURCE(在glibc 2.19和更低版本中),SVID_SOURCE(在glibc 2.19和更低版本中)或_DEFAULT_SOURCE(在glibc 2.20和更高版本中) )。此外,如果定义了_XOPEN_SOURCE,则将提供除S_IFSOCK和S_ISSOCK()以外的所有上述宏的定义。

S_IFSOCK的定义也可以通过定义_XOPEN_SOURCE的值等于或大于500来公开,或者(从glibc 2.24开始)通过定义_XOPEN_SOURCE和_XOPEN_SOURCE_EXTENDED来公开。

如果定义了以下任何功能测试宏,则将公开S_ISSOCK()的定义:BSD_SOURCE(在glibc 2.19和更低版本中),DEFAULT_SOURCE(在glibc 2.20和更高版本中),_ XOPEN_SOURCE的值为500或更大,_POSIX_C_SOURCE的值等于或大于200112L,或者(自glibc 2.24起)同时定义_XOPEN_SOURCE和_XOPEN_SOURCE_EXTENDED。

为st_mode字段的文件模式组件定义了以下掩码值:

S_ISUID04000set-user-ID bit (see execve(2))
S_ISGID02000set-group-ID bit (see below)
S_ISVTX01000sticky bit (see below)
S_IRWXU00700owner has read, write, and execute permission
S_IRUSR00400owner has read permission
S_IWUSR00200owner has write permission
S_IXUSR00100owner has execute permission
S_IRWXG00070group has read, write, and execute permission
S_IRGRP00040group has read permission
S_IWGRP00020group has write permission
S_IXGRP00010group has execute permission
S_IRWXO00007others (not in group) have read, write, and execute permission
S_IROTH00004others have read permission
S_IWOTH00002others have write permission
S_IXOTH00001others have execute permission

设置组ID位(S_ISGID)有几种特殊用途。对于目录,它指示该目录将使用BSD语义:在该目录中创建的文件将从该目录继承其组ID,而不是从创建过程的有效组ID继承,并且在该目录中创建的目录还将获得S_ISGID位。对于可执行文件,set-group-ID位使执行文件的进程的有效组ID更改,如execve(2)中所述。对于未设置组执行位(S_IXGRP)的文件,set-group-ID位表示强制性文件/记录锁定。

目录上的粘贴位(S_ISVTX)意味着该目录中的文件只能由文件的所有者,目录的所有者和特权进程重命名或删除。

名称

inode-文件inode信息

遵循规范

如果需要从获得blkcnt_t或blksize_t类型的定义,则定义_XOPEN_SOURCE的值等于或大于500(在包含任何头文件之前)。

POSIX.1-1990没有描述S_IFMTS_IFSOCKS_IFLNKS_IFREGS_IFBLKS_IFDIRS_IFCHRS_IFIFO,S_ISVTX常量,而是指定了使用宏S_ISDIR()等。 S_IF *常量存在于POSIX.1-2001及更高版本中。

S_ISLNK()和S_ISSOCK()宏不在POSIX.1-1996中,但两者都存在于POSIX.1-2001中。前者来自SVID 4,后者来自SUSv2。

UNIX V7(及更高版本的系统)具有S_IREADS_IWRITES_IEXEC,其中POSIX规定了同义词S_IRUSRS_IWUSR,S_IXUSR。

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

INODE - Linux手册页

Linux程序员手册 第7部分
更新日期: 2020-08-13

另外参见

stat(1),stat(2),statx(2),symlink(7)

日期:2019-08-20 18:01:54 来源:oir作者:oir