Скачиваний:
56
Добавлен:
08.01.2014
Размер:
2.6 Mб
Скачать

4.3.1. Снова о системных вызовах link и unlink

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

Если в каталоге с рис. 4.2 создать ссылку на файл abc с именем xyz при помощи следующего вызова

link('abc', 'xyz');

то рассматриваемый участок каталога будет выглядеть примерно так, как показано на рис. 4.3. При удалении ссылки при помощи системного вызова unlink соответствующие байты, содержащие имя файла, освобождаются для дальнейшего использования. Если имя файла представляет последнюю ссылку на этот файл, то вся связанная с ним структура индексных дескрипторов стирается. Связанные с файлом блоки на диске, которые содержали данные файла, добавляются к поддерживаемому системой списку свободных блоков и становятся пригодными для дальнейшего использования. В большинстве систем UNIX восстановление удаленных файлов невозможно.

120

f

r

e

d

\0

207

b

o

o

k

m

a

r

k

\0

235

a

b

c

\0

235

x

y

z

\0

Рис. 4.3. Пример каталога с новым файлом

4.3.2. Точка и двойная точка

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

$ cat ./fred

которая выведет на экран файл fred в текущем каталоге, или

$ ls .

которая выведет список файлов в текущем каталоге. Двойная точка является стандартным способом ссылки на родительский каталог текущего рабочего каталог, то есть каталог, содержащий текущий каталог. Поэтому команда

$ cd ..

позволяет пользователю переместиться на один уровень вверх по дереву каталогов.

Фактически имена «точка» (.) и «двойная точка» (..) просто являются ссылками на текущий рабочий каталог и родительский каталог соответственно, и любой каталог UNIX содержит в первых двух позициях эти два имени. Другими словами, во время создания каталога в него автоматически добавляются эти два имени.

Можно более ясно это представить себе, рассмотрев участок дерева каталогов, приведенный на рис. 4.4.

ben

book

memos

|

|

chap1

chap2

chap3

kd

kh

mv

Рис. 4.4. Часть дерева каталогов

Если рассмотреть каждый из каталогов ben, book и memos, то откроется картина, похожая на рис. 4.5. Нужно обратить внимание на то, что в каталоге book номер записи с именем . равен 260, а номер записи с именем .. равен 123, и эти номера соответствуют элементам book и . в родительском каталоге ben. Аналогично имена . и .. в каталоге memos (с номерами узлов 401 и 123) соответствуют каталогу memos и имени . в каталоге ben.

Соседние файлы в папке Полищук, Семериков. Системное программирование в UNIX средствами Free Pascal