Сценарий языка C подсчитывает индексы массива от 0. Почему номера индексов начинаются с 1, а не 0?
Если inode 0 зарезервирован для некоторого специального использования, то в чем значение inode 0?
Сценарий языка C подсчитывает индексы массива от 0. Почему номера индексов начинаются с 1, а не 0?
Если inode 0 зарезервирован для некоторого специального использования, то в чем значение inode 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 как номер inode root. В общем случае файловая система может свободно выбирать свои номера inode и зарезервированные значения ino (за исключением 0).
0 используется как значение дозорного значения для указания нулевого или отсутствующего индексного дескриптора. подобно тому, как указатели могут быть NULL на C. без дозорного, вам нужен дополнительный бит, чтобы проверить, был ли установлен индекс inode в структуре.
подробнее здесь:
Все адреса блоков и индексов начинаются с 1. Первый блок на диске - это блок 1. 0 используется для указания нет блок. (Разреженные файлы могут иметь эти внутри них)
http://uranus.chrysocome.net/explore2fs/es2fs.htm
например, в старых файловых системах, где каталоги были представлены как фиксированный массив записей в файлах, удаление файла приведет к тому, что этот индекс inode val будет равен 0. При перемещении каталога любая запись с индексным дескриптором 0 будет проигнорирована.
OSX указывает, что inode 0 означает удаленный файл, который еще не удален; это может быть также использовано в других файловых системах, поскольку OSX является производным от BSD, хотя, по крайней мере, NetBSD, похоже, теперь удалил это использование.
См. справочную страницу OSX для getdirentries http://developer.apple.com/library/ios/#documentation/System/Conceptual/ManPages_iPhoneOS/man2/getdirentries.2.html
Когда я писал файловую систему давным-давно, я использовал inode 0 для псевдо файла .badblocks
.
В некоторых файловых системах .badblocks
фактически присутствует в корневом каталоге как обычный файл, принадлежащий root и mode 0. root может открыть его, но чтение или запись - undefined.
Существует некоторая древняя традиция, что inodes начинаются с 1, # 1 - это .badblocks
, а # 2 - корневой каталог. Несмотря на то, что .badblocks
не особенно хорошо гарантирован, многие файловые системы уходят с пути, чтобы сделать root # 2.