Файл - это индекс с метаданными, среди которых список указателей, где найти данные.
Чтобы получить доступ к файлу, необходимо связать его с каталогом (представьте каталоги как телефонные каталоги, а не папки), то есть добавьте одну или несколько записей в один из нескольких каталогов, чтобы связать имя с этим файлом.
Все эти ссылки, эти имена файлов указывают на один и тот же файл. Нет ни одного оригинала, а других ссылок. Все они являются точками доступа к одному и тому же файлу (одному и тому же узлу) в дереве каталогов. Когда вы получаете размер файла ( lstat
системный вызов), вы извлекаете информацию (эти метаданные, упомянутые выше), хранящиеся в inode, не имеет значения, какое имя файла, какую ссылку вы используете для ссылки на этот файл ,
В противоположность этому, символические ссылки - это другой файл (другой индекс), содержимое которого представляет собой путь к целевому файлу. Как и любой другой файл, эти символические ссылки должны быть связаны с каталогом (должно иметь имя), чтобы вы могли получить к ним доступ. Вы также можете иметь несколько ссылок на символические ссылки, или, другими словами, символические ссылки могут иметь несколько имен (в одном или нескольких каталогах).
$ touch a
$ ln a b
$ ln -s a c
$ ln c d
$ ls -li [a-d]
10486707 -rw-r--r-- 2 stephane stephane 0 Aug 27 17:05 a
10486707 -rw-r--r-- 2 stephane stephane 0 Aug 27 17:05 b
10502404 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:05 c -> a
10502404 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:05 d -> a
Над номером файла 10486707 находится обычный файл. Две записи в текущем каталоге (одна с именем a
, другая с именем b
) ссылаются на него. Поскольку счетчик ссылок равен 2, мы знаем, что в текущем каталоге или любом другом каталоге нет другого имени этого файла. Файл с номером 10502404 - это другой файл, на этот раз с типом символической ссылки, дважды связанный с текущим каталогом. Его содержание (цель) - это относительный путь «а».
Обратите внимание, что если бы 10502404 был связан с другим каталогом, отличным от текущего, он обычно указывал бы на другой файл в зависимости от того, как к нему обращались.
$ mkdir 1 2
$ echo foo > 1/a
$ echo bar > 2/a
$ ln -s a 1/b
$ ln 1/b 2/b
$ ls -lia 1 2
1:
total 92
10608644 drwxr-xr-x 2 stephane stephane 4096 Aug 27 17:26 ./
10485761 drwxrwxr-x 443 stephane stephane 81920 Aug 27 17:26 ../
10504186 -rw-r--r-- 1 stephane stephane 4 Aug 27 17:24 a
10539259 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:26 b -> a
2:
total 92
10608674 drwxr-xr-x 2 stephane stephane 4096 Aug 27 17:26 ./
10485761 drwxrwxr-x 443 stephane stephane 81920 Aug 27 17:26 ../
10539044 -rw-r--r-- 1 stephane stephane 4 Aug 27 17:24 a
10539259 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:26 b -> a
$ cat 1/b
foo
$ cat 2/b
bar
Файлы не имеют имен, связанных с ними, кроме как в каталогах, которые связывают их. Место, занимаемое их именами, является записями в этих каталогах, это учитывается в размере файла / использовании диска в каталогах.
Вы заметите, что системный вызов для удаления файла unlink
. То есть вы не удаляете файлы, вы отсоединяете их от каталогов, на которые они ссылаются. После того, как вы отменили связь с последним каталогом, в котором была запись в данный файл, этот файл затем уничтожается (если его нет у процесса) открыт).
lstat
системного вызова, который получает их размер.