Читаем Linux API. Исчерпывающее руководство полностью

В большинстве нативных файловых систем 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.Взаимосвязь между структурами индексных дескрипторов и каталогов для файла /etc/passwd


Если обратиться к списку информации, хранимой в индексном дескрипторе файла (раздел 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 счетчик ссылок в соответствующем индексном дескрипторе и, если этот счетчик ссылок становится нулевым, освобождает индексный дескриптор и блоки данных, с которыми он соотносится.

Все имена (ссылки) для какого-либо файла являются эквивалентными: ни у одного из них (например, у первого) нет преимущества над остальными. Как мы увидели в приведенном выше примере, после удаления первого имени, относящегося к файлу, физический файл продолжает существовать, но доступен только путем использования другого имени.

Перейти на страницу:

Похожие книги

C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных
1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
C# 4.0: полное руководство
C# 4.0: полное руководство

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

Программирование, программы, базы данных