Наилучшим способом понять, что такое ссылка, будет рассмотрение примера. Давайте создадим (обычный) файл:
$ 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 можно разделить на два независимых действия:
создание inode'а, которому операционная система присвоила номер 32555, и которой является файлом обычного типа;
и создание ссылки на этот inode с именем a в текущем каталоге /home/queen/example. Поэтому файл /home/queen/example/a - это ссылка на inode с номером 32555, и в настоящий момент она является единственной: счетчик ссылок показывает 1.
$ 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'ов без имен являются временные файлы. Вы создаете временный файл, открываете его, а затем удаляете. Файл существует, пока он открыт, но больше никто не может открыть его (т.к. не существует имени для его открытия). Отсюда, если приложение завершается аварийно, временный файл удаляется автоматически.