INODE - Linux手册页
Linux程序员手册 第7部分
更新日期: 2020-08-13
名称
inode-文件inode信息
说明
每个文件都有一个包含有关该文件的元数据的索引节点。应用程序可以使用返回一个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_IFMT | 0170000 | bit mask for the file type bit field |
S_IFSOCK | 0140000 | socket |
S_IFLNK | 0120000 | symbolic link |
S_IFREG | 0100000 | regular file |
S_IFBLK | 0060000 | block device |
S_IFDIR | 0040000 | directory |
S_IFCHR | 0020000 | character device |
S_IFIFO | 0010000 | FIFO |
因此,要测试常规文件(例如),可以编写:
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_ISUID | 04000 | set-user-ID bit (see execve(2)) |
S_ISGID | 02000 | set-group-ID bit (see below) |
S_ISVTX | 01000 | sticky bit (see below) |
S_IRWXU | 00700 | owner has read, write, and execute permission |
S_IRUSR | 00400 | owner has read permission |
S_IWUSR | 00200 | owner has write permission |
S_IXUSR | 00100 | owner has execute permission |
S_IRWXG | 00070 | group has read, write, and execute permission |
S_IRGRP | 00040 | group has read permission |
S_IWGRP | 00020 | group has write permission |
S_IXGRP | 00010 | group has execute permission |
S_IRWXO | 00007 | others (not in group) have read, write, and execute permission |
S_IROTH | 00004 | others have read permission |
S_IWOTH | 00002 | others have write permission |
S_IXOTH | 00001 | others have execute permission |
设置组ID位(S_ISGID)有几种特殊用途。对于目录,它指示该目录将使用BSD语义:在该目录中创建的文件将从该目录继承其组ID,而不是从创建过程的有效组ID继承,并且在该目录中创建的目录还将获得S_ISGID位。对于可执行文件,set-group-ID位使执行文件的进程的有效组ID更改,如execve(2)中所述。对于未设置组执行位(S_IXGRP)的文件,set-group-ID位表示强制性文件/记录锁定。
目录上的粘贴位(S_ISVTX)意味着该目录中的文件只能由文件的所有者,目录的所有者和特权进程重命名或删除。
遵循规范
如果需要从获得blkcnt_t或blksize_t类型的定义,则定义_XOPEN_SOURCE的值等于或大于500(在包含任何头文件之前)。
POSIX.1-1990没有描述S_IFMT,S_IFSOCK,S_IFLNK,S_IFREG,S_IFBLK,S_IFDIR,S_IFCHR,S_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_IREAD,S_IWRITE,S_IEXEC,其中POSIX规定了同义词S_IRUSR,S_IWUSR,S_IXUSR。
备注
对于由内核自动生成的伪文件,内核报告的文件大小(stat.st_size; statx.stx_size)不正确。例如,对于/ proc目录下的许多文件,返回值0,而/ sys下的各种文件报告的大小为4096字节,即使文件内容较小。对于此类文件,应该简单地尝试读取尽可能多的字节(如果要将aq \ 0aq解释为字符串,则将其附加到返回的缓冲区中)。
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。