3. Ссылки

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

$ pwd
/home/queen/example
$ ls
$ touch a
$ ls -il a
32555 -rw-r--r--  1 queen queen 0 Aug  6 19:26 a

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

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

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

$ ln a b
$ ls -il a b
32555 -rw-r--r--  2 queen queen 0 Aug  6 19:26 a
32555 -rw-r--r--  2 queen queen 0 Aug  6 19:26 b
$

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

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

$ rm a
$ ls -il b
32555 -rw-r--r--  1 queen queen 0 Aug  6 19:26 b
$

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

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

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

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