Ссылки

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

$ 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'ов без имен являются временные файлы. Вы создаете временный файл, открываете его, а затем удаляете. Файл существует, пока он открыт, но больше никто не может открыть его (т.к. не существует имени для его открытия). Отсюда, если приложение завершается аварийно, временный файл удаляется автоматически.