Подтвердить что ты не робот

Почему номера индексов начинаются с 1, а не 0?

Сценарий языка C подсчитывает индексы массива от 0. Почему номера индексов начинаются с 1, а не 0?

Если inode 0 зарезервирован для некоторого специального использования, то в чем значение inode 0?

4b9b3361

Ответ 1

Обычно индекс 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).

Ответ 2

0 используется как значение дозорного значения для указания нулевого или отсутствующего индексного дескриптора. подобно тому, как указатели могут быть NULL на C. без дозорного, вам нужен дополнительный бит, чтобы проверить, был ли установлен индекс inode в структуре.

подробнее здесь:

Все адреса блоков и индексов начинаются с 1. Первый блок на диске - это блок 1. 0 используется для указания нет блок. (Разреженные файлы могут иметь эти внутри них)

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

например, в старых файловых системах, где каталоги были представлены как фиксированный массив записей в файлах, удаление файла приведет к тому, что этот индекс inode val будет равен 0. При перемещении каталога любая запись с индексным дескриптором 0 будет проигнорирована.

Ответ 3

OSX указывает, что inode 0 означает удаленный файл, который еще не удален; это может быть также использовано в других файловых системах, поскольку OSX является производным от BSD, хотя, по крайней мере, NetBSD, похоже, теперь удалил это использование.

См. справочную страницу OSX для getdirentries http://developer.apple.com/library/ios/#documentation/System/Conceptual/ManPages_iPhoneOS/man2/getdirentries.2.html

Ответ 4

Когда я писал файловую систему давным-давно, я использовал inode 0 для псевдо файла .badblocks.

В некоторых файловых системах .badblocks фактически присутствует в корневом каталоге как обычный файл, принадлежащий root и mode 0. root может открыть его, но чтение или запись - undefined.

Существует некоторая древняя традиция, что inodes начинаются с 1, # 1 - это .badblocks, а # 2 - корневой каталог. Несмотря на то, что .badblocks не особенно хорошо гарантирован, многие файловые системы уходят с пути, чтобы сделать root # 2.