Жесткая ссылка и символические ссылки в Unix

Я просто хотел уточнить, является ли жесткая/символическая ссылка фактически созданным файлом ??

Я выполнил команду:

ln source hardlink
ln -s source softlink

-- Команда ls показывает эти 2 ссылки в виде файла.

Итак, мой вопрос: действительно ли ln / ln -s создает файл?

С уважением, darkie15


person name_masked    schedule 11.05.2010    source источник


Ответы (2)


И да и нет :-)

В UNIX содержимое файла отличается от записей каталога для этого файла. У вас может быть несколько записей каталога, указывающих на одно и то же содержимое (описание того, как работает) и вот хитрый момент:

Все эти записи каталога одинаковы. Хотя одна из них может быть создана первой, в ней нет ничего особенного. Если вы удалите его, содержимое не исчезнет, ​​только запись в каталоге. Содержимое исчезнет, ​​как только индексный дескриптор будет иметь нулевые записи каталога, указывающие на него (и все процессы закроют файл - раньше я был укушен, пытаясь очистить место на диске, удаляя файлы журнала, только чтобы найти это, потому что процесс все еще имеет файл open содержимое файла не восстанавливается, даже если на него не указывают никакие записи каталога).

Это для жестких ссылок.

Мягкие ссылки немного сложнее. Они создают своего рода «файл» (отдельный inode), содержащий путь к целевому файлу. И эти ссылки не равны. Удаление оригинала оставит вам мягкую ссылку, указывающую в никуда.

Поскольку индексные дескрипторы уникальны в данной файловой системе, жесткие ссылки не могут ссылаться на данные в другой файловой системе.

Программные ссылки не имеют этого ограничения, поскольку они хранят путь к целевому файлу, а не его индексный дескриптор.

Следующая расшифровка может помочь:

$ echo hello >f1
$ ln f1 f2
$ ln -s f1 f3
$ ls -ial f*
    7385 -rw-r--r-- 2 pax None 6 May 11 14:09 f1
    7385 -rw-r--r-- 2 pax None 6 May 11 14:09 f2
    4672 lrwxrwxrwx 1 pax None 6 May 11 14:09 f3 -> f1
$ cat f1
    hello
$ cat f2
    hello
$ cat f3
    hello
$ rm f1
$ ls -ial f*
    7385 -rw-r--r-- 2 pax None 6 May 11 14:09 f2
    4672 lrwxrwxrwx 1 pax None 6 May 11 14:09 f3 -> f1
$ cat f1
    cat: f1: No such file or directory
$ cat f2
    hello
$ cat f3
    cat: f3: No such file or directory

Я использовал только последние четыре цифры номера индекса, чтобы сделать запись короткой (и не поразить вас номерами индексов, такими как 43910096366994672), но вы можете видеть, что f1 и f2 имеют один и тот же индекс, тогда как f3 разные. Вы также можете видеть, что содержимое файла, изначально созданного как f1, сохраняется после его удаления, потому что f2 все еще ссылается на него.

Однако, поскольку f3 ссылается на имя f1, а не на его индексный дескриптор, вы получаете сообщение об ошибке при попытке его использования.


В сторону: вам должно нравиться, когда UNIX играет с вами вот так:

$ ls f*
    f2  f3
$ cat f3 # What the ...?
    cat: f3: No such file or directory

Почти так же весело, как создать файл с именем spacebackspacex, а затем наблюдать, как кто-то пытается его удалить :-)

person paxdiablo    schedule 11.05.2010
comment
rm \ <TAB> ? Я не понимаю, как backspace (^?) сделает это еще сложнее :) - person unode; 09.12.2010

Ни один из них не создает файл.

Файл на диске идентифицируется «inode». Каталоги сопоставляют имена файлов с индексными дескрипторами. Жесткая ссылка означает «создать новое имя файла в этом каталоге, которое указывает на тот же индекс, что и файл, который я называю».

Символическая ссылка означает «создать новое имя файла в этом каталоге, которое указывает на любой индексный дескриптор, на который указывают другие файлы».

Как указывает mangoman в комментарии, символическая ссылка создает файл с именем цели ссылки, но вы не должны обращать на это внимание. Это специальный файл, который не относится к вашему делу.

person David M    schedule 11.05.2010
comment
в случае мягкой ссылки создается файл, содержащий абсолютный путь к месту назначения. - person Chintan Parikh; 11.05.2010