ext2/3/4といったファイルシステムにあるinode番号について。inodeはファイルシステム内にあるファイルやディレクトリなどのオブジェクトを示すものであり、inode番号はそれらを識別するための番号であり、同じファイルシステム上でユニークな値、かつ、正の整数です。上限値は環境に依存しますが、LinuxのC言語ではino_tという型が用意されており、符号無し32ビット整数だったり符号無し64ビット整数だったりします。
このinode番号をプログラムで使用する場合、当然ino_t型の変数を用意して使用することになりますが、初期値や無効値には何を指定すればよいか悩みました。符号無しなので-1を使用することはできません。
いろいろ調べていて、0にするのが適切であるとの見解に至りました
/usr/include/linux/ext2_fs.h(あるいはext3_fs.h)を見てみるとinode番号に関して次のような定義があります。
/* * Special inode numbers */ #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 */ /* First non-reserved inode for old ext2 filesystems */ #define EXT2_GOOD_OLD_FIRST_INO 11
10までが予約されていて、通常は11以降の番号が振られる、ということを示しています。0については「Special inode numbers」でもないので、初期値や無効値として利用するにはちょうど良い、と考えました。手元のLinuxで0番が使われていないことを確認してみました。
> find / -inum 0 -print >
使われていませんでした。 ということで、0をinode番号の初期値や無効値として利用することにしました。