-r--r--r-- 1 you 29 Sep 27 12:11 junk

$ chmod 666 junk $

Можно использовать флаг

-t
команды
ls
, который применяется для сортировки файлов по времени (по умолчанию принимается время последней модификации), совместно с флагами
или
-r
, чтобы узнать порядок, в котором изменились индексные дескрипторы или читались файлы:

$ ls recipes

apple

pie

$ ls -lut total 2

drwxrwxrwx 4 you 64 Sep 27 12:11 recipes

-rw-rw-rw- 1 you 29 Sep 27 06:11 junk

У каталога

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

Очень важное понять значение индексного дескриптора, причем не для того, чтобы оценить действие флагов команды

ls
. По существу, индексные дескрипторы и есть файлы. Иерархия каталогов предоставляет только удобный способ именования файлов. Внутреннее системное имя файла или индекс файла — это номер индексного дескриптора, содержащего информацию о файле. Команда
ls -i
выдает индекс файла в десятичной форме:

$ date > x

$ ls -i

15768 junk

15274 recipes

15852 x

$

Именно индекс файла хранится в первых двух байтах каталога, предшествующих имени. Команда

od -d
выдает информацию не в восьмеричной форме по байтам, а в десятичной, объединив по два байта в одно целое, и поэтому мы увидим на экране индекс файла:

$od -с .

0000000   4  ; . \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0

0000020 273 (  .  . \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0

0000040 252  ; p  е  ц  п  т  ы \0 \0 \0 \0 \0 \0 \0 \0

0000060 230  = j  u  n  к \0 \0 \0 \0 \0 \0 \0 \0 \0 \0

0000100 354  = x \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0

0000120

od -d .

0000000 15156 00046 00000 00000 00000 00000 00000 00000

0000020 10427 11822 00000 00000 00000 00000 00000 00000

0000040 15274 25970 26979 25968 00115 00000 00000 00000

0000060 15768 30058 27502 00000 00000 00000 00000 00000

0000100 15852 00120 00000 00000 00000 00000 00000 00000

0000120

$

Первые два байта в каждой строке каталога являются единственной связью между именем файла и его содержимым. Именно поэтому имя файла в каталоге называется связью: оно связывает имя в иерархии каталогов с индексным дескриптором и, тем самым, с информацией. Один и тот же индекс файла может появиться в нескольких каталогах. Команда

rm
в действительности удаляет не индексный дескриптор, а строку каталога или связь. Только когда последняя связь файла исчезает, система удаляет индексный дескриптор, а значит, и сам файл.

Если индекс файла в строке каталога равен нулю, это означает, что связь удалена, но сам файл не обязательно удален — могут существовать связи где-нибудь еще. Можно убедиться в том, что индекс файла становится равным нулю при удалении файла:

$ rm x $ od -d .

0000000 15156 00046 00000 00000 00000 00000 00000 00000

0000020 10427 11822 00000 00000 00000 00000 00000 00000

0000040 15274 25970 26979 25968 00115 00000 00000 00000

0000060 15768 30058 27502 00000 00000 00000 00000 00000

0000100 00000 00120 00000 00000 00000 00000 00000 00000

0000120

$

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

ln
, имеющая приведенный ниже синтаксис, устанавливает связь с уже существующим файлом:

$ ln old-file new-file

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

/bin/ed
под названием
/bin/е
, так что пользователи могут вызывать редактор как
е
. Две связи одного файла указывают на одну и ту же запись, а значит, имеют один и тот же индекс файла:

$ ln junk linktojunk

$ ls -li total 3

15768 -rw-rw-rw- 2 you 29 Sep 27 12:07 junk

15768 -rw-rw-rw- 2 you 29 Sep 27 12:07 linktojunk

15274 drwxrwxrwx 4 you 64 Sep 27 09:34 recipes

$

Целое число, выдаваемое между правом доступа и именем владельца файла, является числом связей файла. Поскольку каждая связь ссылается на индексный дескриптор, все связи одинаково, важны — нет разницы между первой связью и последующими. (Заметим, что общий объем занимаемого на диске пространства, сообщаемый командой

ls
, вычисляется неверно из-за двойного подсчета).

Если изменить файл, то изменение обнаружится при обращении к файлу под любым из его имен, так как все связи ссылаются на один файл:

$ echo x > junk

$ ls -l total 3

-rw-rw-rw- 2 you  2 Sep 27 12:37 junk

-rw-rw-rw- 2 you  2 Sep 27 12:37 linktojunk

drwxrwxrwx 4 you 64 Sep 27 09:34 recipes

$ rm linktojunk

$ ls -l total 2

-rw-rw-rw- 1 you  2 Sep 27 12:37 junk

drwxrwxrwx 4 you 64 Sep 27 09:34 recipes

$

После удаления файла

linktojunk
число связей опять становится равным единице. Как уже отмечалось, при удалении файла уничтожается лишь связь. Сам же файл сохраняется до тех пор, пока не будет удалена последняя связь. На практике, конечно, большинство файлов имеет единственную связь, но тем не менее вы убедились в том, что можно простым способом повысить гибкость системы.


Перейти на страницу:
Изменить размер шрифта: