3. Ссылки

Наилучшим способом понять, что такое ссылка, будет рассмотрение примера. Давайте создадим (обычный) файл:

$ pwd
/home/queen/example
$ ls
$ touch a
$ ls -il a
32555 -rw-rw-r--    1 queen     queen            0 Dec 10 08:12 a

Опция -i команды ls выводит номер inode в первом поле выходных данных. Как видите, до того как мы создали файл a, в каталоге не было никаких файлов. Однако нас интересует третье поле, которое представляет собой количество ссылок на файл (ну... на самом деле ссылок на inode).

Команду touch a можно разделить на два независимых действия:

А теперь введем следующее:

$ ln a b
$ ls -il a b
32555 -rw-rw-r--    2 queen     queen            0 Dec 10 08:12 a
32555 -rw-rw-r--    2 queen     queen            0 Dec 10 08:12 b
$

Мы создали другую ссылку на тот же самый inode. Как видите, мы не создали файл с именем b. Вместо этого мы просто добавили другую ссылку на inode под номером 32555 в том же каталоге и присвоили этой новой ссылке имя b. Как видите в информации, выданной командой ls -l, счетчик ссылок для inode'а теперь равен 2, а не 1.

Теперь делаем следующее:

$ rm a
$ ls -il b
32555 -rw-rw-r--    1 queen     queen            0 Dec 10 08:12 b
$

Мы видим, что даже несмотря на то, что мы удалили «оригинальный файл», inode все равно существует. Но теперь единственная ссылка на этот inode - это файл с именем /home/queen/example/b.

Следовательно, файл в UNIX® не имеет имени; вместо этого он имеет одну или несколько ссылок в одном или нескольких каталогах.

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

Типичными примерами несвязанных файлов (т.е. не имеющих имен) являются сетевые подключения. Вы никогда не увидите файла, соответствующему вашему подключению к веб-сайту Mandrakelinux, в своем дереве файлов, в каком бы каталоге вы его не искали. Аналогично, когда вы используете канал в shell'е, inode, соответствующий этому каналу, существует, но ссылки на него нет. Другим примером использования inode'ов без имен являются временные файлы. Вы создаете временный файл, открываете его, а затем удаляете. Файл существует, пока он открыт, но больше его никто не может открыть (т.к. не существует имени для его открытия). Отсюда следует, что если приложение завершается аварийно, временный файл удаляется автоматически.