Создание связей - информация для программистов
Связь - это соответствие между именем файла и 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 (или новое-имя -> старое-имя).
| Функция | Описание |
|---|---|
| unlink | Функция удаления записи каталога. Параметр Путь указывает имя отсоединяемого файла. По завершении вызова unlink счетчик связей i-узла уменьшается на 1. |
| remove | Эта функция также удаляет имя файла путем вызова функции unlink или rmdir. |
Связи с каталогами
| Функция | Описание |
|---|---|
| mkdir | Эта функция создает записи новых каталогов, создавая тем самым жесткие связи с с i-узлом, соответствующим новому каталогу. |
Если нужно создать дополнительную связь с каталогом, рекомендуется создать символьную связь. Символьные связи не нарушают работу записей каталогов . и .. и поддерживают пустые стандартные каталоги. Ниже приведен пример пустого стандартного каталога /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 ).