为什么inode号从1开始而不是0?

C语言约定从0开始统计数组索引。为什么inode号从1开始,而不是从0开始?

如果inode 0保留是为了某些特殊用途,那么inode 0的意义是什么?

Solutions Collecting From Web of "为什么inode号从1开始而不是0?"

通常,inode 0被保留,因为返回值0通常表示错误。 Linux内核中的多个方法 – 特别是在所有文件系统共享的VFS层 – 返回一个ino_t,例如find_inode_number 。

有更多的保留inode号码。 例如在ext2中 :

#define EXT2_BAD_INO 1 /* Bad blocks inode */ #define EXT2_ROOT_INO 2 /* Root inode */ #define EXT2_BOOT_LOADER_INO 5 /* Boot loader inode */ #define EXT2_UNDEL_DIR_INO 6 /* Undelete directory inode */ 

而ext3有:

 #define EXT3_BAD_INO 1 /* Bad blocks inode */ #define EXT3_ROOT_INO 2 /* Root inode */ #define EXT3_BOOT_LOADER_INO 5 /* Boot loader inode */ #define EXT3_UNDEL_DIR_INO 6 /* Undelete directory inode */ #define EXT3_RESIZE_INO 7 /* Reserved group descriptors inode */ #define EXT3_JOURNAL_INO 8 /* Journal inode */ 

和ext4有:

 #define EXT4_BAD_INO 1 /* Bad blocks inode */ #define EXT4_ROOT_INO 2 /* Root inode */ #define EXT4_USR_QUOTA_INO 3 /* User quota inode */ #define EXT4_GRP_QUOTA_INO 4 /* Group quota inode */ #define EXT4_BOOT_LOADER_INO 5 /* Boot loader inode */ #define EXT4_UNDEL_DIR_INO 6 /* Undelete directory inode */ #define EXT4_RESIZE_INO 7 /* Reserved group descriptors inode */ #define EXT4_JOURNAL_INO 8 /* Journal inode */ 

其他文件系统使用ino 1作为根节点号。 一般来说,一个文件系统可以自由选择它的索引节点号和保留的ino值(0除外)。

0用作标记值以指示null或无inode。 类似于C中指针可以是NULL的情况,没有标记,你需要额外的一点来测试一个struct中的inode是否被设置。

更多信息在这里:

所有块和inode地址从1开始。磁盘上的第一个块是块1. 0用于指示没有块。 (稀疏文件可以有这些内部)

http://uranus.chrysocome.net/explore2fs/es2fs.htm

例如,在旧文件系统中,目录被表示为一个固定的文件入口数组,删除一个文件会导致在遍历该目录时将入口的inode val设置为0,任何inode为0的入口都将被忽略。

OSX指定inode 0表示已删除的文件尚未删除; 这可能也被用在其他文件系统中,因为OSX是BSD派生的,尽管至少NetBSD似乎已经删除了这个用法。

请参阅OSX联机帮助页http://developer.apple.com/library/ios/#documentation/System/Conceptual/ManPages_iPhoneOS/man2/getdirentries.2.html

当我很久以前写了一个文件系统的时候,我使用inode 0作为.badblocks伪文件。

在某些文件系统上.badblocks实际上是作为根和模式0所拥有的常规文件存在于根目录中的.badblocks可以打开它,但是读或写它是未定义的。

从1开始有一些古老的传统,#1是.badblocks ,#2是根目录。 尽管.badblocks没有得到很好的保证,但是很多文件系统都是为了创建第二个根节点。