В большинстве нативных файловых систем Linux имена файлов могут быть длиной до 255 символов. Взаимосвязь между каталогами и индексными дескрипторами показана на рис. 18.1, иллюстрирующем часть содержимого таблицы индексных дескрипторов файловой системы и соответствующих файлов каталогов, которые предназначены для файла из примера (/etc/passwd).
Несмотря на то что процесс может открыть каталог, он не может применять системный вызов read() для чтения его содержимого. Для извлечения содержимого каталога процесс должен использовать системные вызовы и библиотечные функции, обсуждаемые далее в этой главе. (В некоторых реализациях UNIX можно выполнять системный вызов read() для каталога, но такое поведение не является портируемым.) Не может процесс и изменить содержимое каталога с помощью системного вызова write(); он может лишь косвенно (то есть через запрос к ядру) менять содержимое благодаря таким системным вызовам, как open() (для создания нового файла), link(), mkdir(), symlink(), unlink() и rmdir(). Все эти системные вызовы описаны далее в главе, за исключением open(), который был описан в разделе 4.3.)
Нумерация в таблице индексных дескрипторов начинается с 1, а не с 0, поскольку значение 0 в поле индексного дескриптора для каталога говорит о том, что данная запись не используется. Индексный дескриптор 1 применяется для маркировки неисправных блоков в файловой системе. Корневой каталог файловой системы (/) всегда хранится в записи индексного дескриптора 2 (как показано на рис. 18.1), чтобы ядро знало, откуда начинать анализ имени пути.
Рис. 18.1.
Если обратиться к списку информации, хранимой в индексном дескрипторе файла (раздел 14.4), можно увидеть, что индексный дескриптор не содержит имени файла; оно определяется только путем сопоставления внутри списка каталога. Это приводит к удобному следствию: можно создавать несколько имен — в том же каталоге или в каком-либо другом, — соотносящихся с одним и тем же индексным дескриптором. Такие имена называются
Все нативные файловые системы Linux и UNIX поддерживают жесткие ссылки. Тем не менее многие файловые системы, отличные от UNIX (например, VFAT, разработанная компанией Microsoft), их не поддерживают. (Однако файловая система NTFS компании Microsoft все же поддерживает жесткие ссылки.)
Работая в оболочке, можно создать новые жесткие ссылки на существующий файл с помощью команды ln, как показано в следующем сеансе:
$ echo — n 'It is good to collect things,' > abc
$ ls — li abc
122232 —rw-r — r- 1 mtk users 29 Jun 15 17:07 abc
$ ln abc xyz
$ echo ' but it is better to go on walks.' >> xyz
$ cat abc
It is good to collect things, but it is better to go on walks.
$ ls — li abc xyz
122232 —rw-r — r- 2 mtk users 63 Jun 15 17:07 abc
122232 —rw-r — r- 2 mtk users 63 Jun 15 17:07 xyz
Номера индексных дескрипторов, выводимые (как первый столбец) командой ls — li, подтверждают то, что уже было видно из результатов работы команды cat: имена abc и xyz соотносятся с одной и той же записью индексного дескриптора и, следовательно, с одним и тем же файлом. В третьем поле, выводимом командой ls — li, можно увидеть счетчик ссылок для данного индексного дескриптора. После выполнения команды ln abc xyz счетчик ссылок для индексного дескриптора, соотносящегося с файлом abc, возрастает до 2, поскольку теперь на этот файл ссылаются два имени. (Такой же счетчик ссылок отображается для файла xyz, поскольку он соотносится с тем же индексным дескриптором.)
Если удалить одно из этих имен файлов, второе имя и сам файл останутся:
$ rm abc
$ ls — li xyz
122232 —rw-r — r— 1 mtk users 63 Jun 15 17:07 xyz
Запись индексного дескриптора и блоки данных для файла удаляются (освобождаются), только когда счетчик ссылок становится нулевым — то есть после удаления всех имен данного файла. Подведем итог: команда rm удаляет имя файла из списка каталога, уменьшает на 1 счетчик ссылок в соответствующем индексном дескрипторе и, если этот счетчик ссылок становится нулевым, освобождает индексный дескриптор и блоки данных, с которыми он соотносится.
Все имена (ссылки) для какого-либо файла являются эквивалентными: ни у одного из них (например, у первого) нет преимущества над остальными. Как мы увидели в приведенном выше примере, после удаления первого имени, относящегося к файлу, физический файл продолжает существовать, но доступен только путем использования другого имени.