Создание связей - информация для программистов

Связь - это соответствие между именем файла и i-узлом (жесткая связь) или между двумя именами файлов (символьная связь).

Связывание обеспечивает доступ к i-узлу по нескольким именам. В записях каталога имена файлов и i-узлы указываются попарно. Имена файлов упрощают работу пользователя с файлами, а i-узлы содержат фактические дисковые адреса данных файла. Счетчик всех связей с i-узлом хранится в поле i_nlink i-узла. Функции создания и уничтожения связей работают с именами файлов, а не с дескрипторами файлов. Поэтому при создании связей файлы можно не открывать.

Процессы могут считывать и изменять содержимое i-узла под любым из связанных с ним имен файлов. В AIX различают жесткие и символьные связи.

Жесткие связи

Функция Описание
связь Функция создания жесткой связи. Наличие жесткой связи гарантирует существование файла, так как при ее создании увеличивается на единицу значение счетчика связей i_nlink в i-узле.
unlink Функция освобождения связи. Если освободить все жесткие связи с i-узлом, файл становится недоступным.

Жесткие связи должны связывать имена файлов с i-узлами, расположенными в той же файловой системе, так как номер i-узла является уникальным только в пределах одной файловой системы. Жесткая связь всегда устанавливается для конкретного файла, поскольку при создании жесткой связи создается запись каталога, в которой указывается соответствие имени нового файла и i-узла. Владельцем файла является создатель исходного файла, он же определяет права доступа к файлу. С другой стороны, все жесткие связи для операционной системы равноправны.

Пример: Если файл /u/tom/bob связан с файлом /u/jack/foo, то значение счетчика связей i_nlink файла foo будет равно 2. Обе жесткие связи равноправны. Если удалить /u/jack/foo, то он будет продолжать существовать под именем /u/tom/bob и будет доступен пользователям, обращающимся к каталогу tom. Однако владельцем файла останется jack, даже если файл /u/jack/foo удален. Пространство, выделенное для файла, считается пространством пользователя jack и учитывается при определении его лимита дискового пространства. Изменить принадлежность файла можно с помощью функции chown.

Символьная ссылка

Символьная связь представляет собой файл, содержащий путь. Для создания символьной связи служит команда symlink. Если процесс обнаруживает символьную связь, то содержащийся в ней путь добавляется к пути, по которому процесс выполняет поиск. Если в символьной связи указан полный путь, процесс выполняет поиск по дереву от корневого каталога до файла, имя которого указано в символьной связи. Если имя файла в символьной связи начинается не с символа / (косой черты), процесс предполагает, что этот путь отсчитывается от расположения символьной связи. Функция unlink удаляет как жесткие, так и символьные связи.

Символьные связи могут связывать файлы из разных файловых систем, так как операционная система считает их обычными файлами, а не частью структуры файловой системы. Наличие символьной связи не гарантирует существования целевого файла, так как символьная связь не влияет на поле i_nlink i-узла.

Функция Описание
readlink Функция чтения содержимого символьной связи. Многие функции (в том числе open и stat) работают с именами файлов, указанными в символьной связи.
lstat Эта функция служит для создания отчета о состоянии файла, содержащего символьную связь, и не выполняет переход по указанной связи. Список процедур, выполняющих переход по символьной связи, приведен в описании функции symlink.

Символьные связи также называют гибкими связями, так как они ссылаются на файл по его имени. Если удалить или переместить целевой файл, то символьную связь невозможно будет установить.

Пример: Символьная связь с файлом /u/joe/foo - это файл, в котором хранится строка /u/joe/foo. Если владелец файла foo удалит его, то вызовы функций по символьной связи будут приводить к ошибке. Если затем владелец создаст новый файл с именем foo в том же каталоге, то связь будет указывать на новый файл. Этот тип связи потому и называется гибкой связью, что i-узел, с которым она установлена, можно заменить другим.

В выводе команды ls -l символ l в первой позиции означает символьную связь. В последнем столбце вывода связи между файлами представлены в виде Путь2 -> Путь1 (или новое-имя -> старое-имя).

Функция Описание
remove Эта функция также удаляет имя файла путем вызова функции unlink или rmdir.

Связи с каталогами

Функция Описание

Если нужно создать дополнительную связь с каталогом, рекомендуется создать символьную связь. Символьные связи не нарушают работу записей каталогов . и .. и поддерживают пустые стандартные каталоги. Ниже приведен пример пустого стандартного каталога /u/joe/foo и значений i_nlink.

/u
Значения пустые значения пустые значения Каталог
68     j o e 0
/u/joe
mkdir ("foo", 0666)
Значения пустые значения пустые значения Каталог
68     n 0 0 0
      n n 0 0
235     f o o 0

 

/u/joe/foo
Значения пустые значения пустые значения Каталог
235     n 0 0 0
68     n n 0 0
Значений i_nlink

 i = 68

n_link 3

Для i = 68 n_link равно 3 (/u; /u/joe; /u/joe/foo ).

i = 235

n_link 2

Для i = 235 n_link равно 2 (/u/joe; /u/joe/foo ).