
Если мягкая ссылка и жесткая ссылка указывают на файл.
А дескриптор файла — это дескриптор файла, указывающий на открытый файл.
Тогда в чем же разница между ними, если оба они являются своего рода указателем на файл?
Также жесткая ссылка указывает на адрес расположения содержимого файла и дескриптор файла тоже указывает на содержимое файла, тогда что именно здесь отличается? Также имеет ли жесткая ссылка свои собственные дескрипторы файлов.
решение1
С философской точки зрения можно утверждать, что они ничем не отличаются.
Но они совершенно разные по тому, почему, где и как они используются и реализуются.
Во-первых, как жесткие, так и мягкие/символические ссылки являются записями каталога, то есть записями в специально отформатированном файле, называемом каталогом, где каждая запись содержит имя и номер инода — последний относится к реальной структуре, содержащей метаданные файла (разрешения, размер и т. д.) и список блоков данных — структуру, которая называется «инодом».
Разница между жесткой и символической ссылкой заключается в том, что в то время как inode, на который указывает жесткая ссылка, содержит фактические данные, inode, на который указывает символическая ссылка, содержит путь к другому файлу. По сути, символические ссылки сами по себе являютсяжесткийссылки, указывающие на особый тип файлов, например, именованные каналы, файлы сокетов доменов Unix и т. д.
Теперь, когда ядро открывает файл, оно создает в памяти структуру, дублирующую inode с диска и содержащую некоторые из тех же метаданных (разрешения, список блоков, содержащих данные, размер и т. д.). На эту структуру указывает другая структура, называемая «описанием открытого файла» (которая содержит такие данные, как указатель позиции, был ли файл открыт в режиме чтения-записи или только для чтения, должен ли он читаться и записываться в неблокируемом режиме и т. д.). Наконец, на эту структуру указывает запись в другой структуре ядра (на процесс), массиве/таблице, называемой таблицей дескрипторов файлов.
«Дескриптор файла», целое число, возвращаемое системными вызовами типа open(2), является индексом в этой таблице.
На индексный дескриптор в памяти могут указывать несколько «описаний открытых файлов», на которые, в свою очередь, могут указывать несколько файловых дескрипторов из нескольких процессов.
Некоторые системные вызовы, такие как open(2), будут обрабатывать символические ссылки особым образом: когда открываемый ими файл оказывается символической ссылкой, они продолжают пытаться открыть файл, названный по пути, который является его содержимым.
Как дисковые структуры (каталоги, иноды), так и структуры ядра/памяти (иноды, описания открытых файлов) используют подсчет ссылок, чтобы отслеживать, какие объекты какие используют. (Нет, в ядре нет никакого сборщика мусора Mark & Sweep, который бы перебирал указатели в памяти или на диске, чтобы определить, на какие объекты больше не ссылаются из других мест ;-)).