Связь - это соответствие между именем файла и i-узлом (жесткая связь) или между двумя именами файлов (символьная связь). Связывание обеспечивает доступ к i-узлу (Работа с i-узлами JFS) по нескольким именам. В записях каталога имена файлов и i-узлы указываются попарно. Имена файлов упрощают работу пользователя с файлами, а i-узлы содержат фактические дисковые адреса данных файла. Счетчик всех ссылок на i-узел хранится в поле i_nlink i-узла. Функции создания и уничтожения связей работают с именами файлов, а не с дескрипторами файлов (Работа с дескрипторами файлов). Поэтому при создании связей файлы можно не открывать.
Процессы могут считывать и изменять содержимое i-узла под любым из связанных с ним имен файлов. В данной операционной системе есть два типа связей: жесткая и символьная.
link | Функция создания жесткой связи. Наличие жесткой связи гарантирует существование файла, так как жесткая связь увеличивает на единицу счетчик связей в поле 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 ).
Связи с каталогами - Обзор
rmdir и remove | Функции удаления связей с каталогами |
Глава 5, Файловые системы и каталоги
Команда ls
Функции chown, link, statx, lstat , stat, fstatx, fstat, fullstat, ffullstat , open, openx, creat, symlink, remove, rmdir и unlink