Ссылки

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

$ 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 с номером 32555 равен 2, так как на этот самый inode ссылаются два файла a и b.

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

   $ 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 не имеет никакого названия; вместо этого, он имеет одну или более ссылок на себя в одном или более каталогах.

Сами каталоги также размещены в inodes, но количество ссылок на них, в отличие от всех других типов файлов, совпадает с числом подкаталогов. На каталог всегда есть по крайней мере две ссылки: каталог непосредственно (.) и его каталог предыдущего уровня (..).

Типичным примером файла, на который никто не ссылается, (то есть он не имеет имени) есть сетевое подключение: вы никогда не сможете увидеть на своем диске файл, соответствующий вашему сетевому подключению к web-сайту Linux Mandrake. Подобная ситуация возникает в случае, когда вы используете канал в shell. В этом случае существует inode, соответствующий этому каналу, но на этот inode никто не ссылается. То есть он не имеет имени.