Символическая ссылка представляет собой небольшой файл , который содержит местоположение (т.е. пути и имя файла) целевой файл, с флагом в записи каталога , указывающей , что это символическое.
Когда вы открываете символическую ссылку, ОС будет следовать местоположению, чтобы найти целевой файл. Если цель сама является символической ссылкой, она также следует своему расположению (1) (2), пока местоположение не укажет на файл, который не является символической ссылкой (назовем его FinalFile ). Затем операционная система получает инод в FinalFile (индексный дескриптор содержит метаданные , как изменения времени и имеет также указатель на данные файла). Наконец открывается индекс FinalFile . Отныне процесс использует этот индекс для чтения / записи в файл. В результате изменение имени или пути символической ссылки, удаление символической ссылки, изменение пути или имени FinalFile или даже удаление FinalFile(3) не влияет на процесс; это все еще читает из того же самого inode.
В большинстве случаев операции с данными файла над символической ссылкой будут влиять на FinalFile (например, чтение и запись в символическую ссылку будут считывать / записывать в FinalFile ), но существуют исключения: readlink()
системный вызов считывает содержимое самой символической ссылки.
С другой стороны, операции с метаданными файла (например, переименование или удаление) обычно влияют на символическую ссылку. Но здесь есть и исключения: lstat()
системный вызов похож stat()
, за исключением того, что он возвращает информацию о самой символической ссылке, а не о FinalFile (2).
(1) Существует ограничение на количество уровней, и все становится немного сложнее, если местоположение в символической ссылке является относительным путем.
(2) Прочитайте символическую ссылку (7): обработка символьных ссылок для более подробной информации.man 7 symlink
(3) Команда rm
или unlink()
системный вызов физически не удаляют файл. Он удаляет запись каталога, которая указывает на индекс файла. Сам файл удаляется только если как а) нет больше записей каталога (жесткие ссылки) , которые относятся к его инода и б) ни один процесс не имеет файл открыт.