Лучший способ понять что такое ссылка - рассмотреть пример. Давайте создадим обычный файл:
$ 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 с номером 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 никто не ссылается. То есть он не имеет имени.