Разница между файловым дескриптором и мягкой/жесткой ссылкой

Разница между файловым дескриптором и мягкой/жесткой ссылкой

Если мягкая ссылка и жесткая ссылка указывают на файл.

А дескриптор файла — это дескриптор файла, указывающий на открытый файл.

Тогда в чем же разница между ними, если оба они являются своего рода указателем на файл?

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

решение1

С философской точки зрения можно утверждать, что они ничем не отличаются.

Но они совершенно разные по тому, почему, где и как они используются и реализуются.

Во-первых, как жесткие, так и мягкие/символические ссылки являются записями каталога, то есть записями в специально отформатированном файле, называемом каталогом, где каждая запись содержит имя и номер инода — последний относится к реальной структуре, содержащей метаданные файла (разрешения, размер и т. д.) и список блоков данных — структуру, которая называется «инодом».

Разница между жесткой и символической ссылкой заключается в том, что в то время как inode, на который указывает жесткая ссылка, содержит фактические данные, inode, на который указывает символическая ссылка, содержит путь к другому файлу. По сути, символические ссылки сами по себе являютсяжесткийссылки, указывающие на особый тип файлов, например, именованные каналы, файлы сокетов доменов Unix и т. д.

Теперь, когда ядро ​​открывает файл, оно создает в памяти структуру, дублирующую inode с диска и содержащую некоторые из тех же метаданных (разрешения, список блоков, содержащих данные, размер и т. д.). На эту структуру указывает другая структура, называемая «описанием открытого файла» (которая содержит такие данные, как указатель позиции, был ли файл открыт в режиме чтения-записи или только для чтения, должен ли он читаться и записываться в неблокируемом режиме и т. д.). Наконец, на эту структуру указывает запись в другой структуре ядра (на процесс), массиве/таблице, называемой таблицей дескрипторов файлов.

«Дескриптор файла», целое число, возвращаемое системными вызовами типа open(2), является индексом в этой таблице.

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

Некоторые системные вызовы, такие как open(2), будут обрабатывать символические ссылки особым образом: когда открываемый ими файл оказывается символической ссылкой, они продолжают пытаться открыть файл, названный по пути, который является его содержимым.

Как дисковые структуры (каталоги, иноды), так и структуры ядра/памяти (иноды, описания открытых файлов) используют подсчет ссылок, чтобы отслеживать, какие объекты какие используют. (Нет, в ядре нет никакого сборщика мусора Mark & ​​Sweep, который бы перебирал указатели в памяти или на диске, чтобы определить, на какие объекты больше не ссылаются из других мест ;-)).

Связанный контент