5.1.3. Прямые ссылки
Когда файл создается с помощью open()
или creat()
, система находит не использующийся индекс и присваивает его новому файлу. Она создает для файла элемент каталога с именем файла и номером индекса. Опция -i
команды ls
отображает номер индекса.
$ echo hello, world > message /* Создать новый файл */
$ ls -il message /* Показать также номер индекса */
228786 -rw-r--r-- 1 arnold devel 13 May 4 15:43 message
Поскольку элементы каталога связывают имена файлов с индексами, у одного файла может быть несколько имен. Каждый элемент каталога, ссылающийся на один и тот же индекс, называется ln
. Она используется следующим образом: 'ln
'.
$ ln message msg /* Создать ссылку */
$ cat msg /* Показать содержание нового имени */
hello, world
$ ls -il msg message /* Показать номера индексов */
228786 -rw-r--r-- 2 arnold devel 13 May 4 15:43 message
228786 -rw-r--r-- 2 arnold devel 13 May 4 15:43 msg
Вывод показывает, что номера индексов двух файлов одинаковые, а третье поле расширенного вывода теперь равно 2. Это поле показывает
Нельзя не подчеркнуть:
$ echo "Hi, how ya doin' ?" > msg /* Изменить файл через новое имя */
$ cat message /* Показать содержание через старое имя */
Hi, how ya doin' ?
$ ls -il message msg /* Отобразить сведения. Размер изменился */
228786 -rw-r--r-- 2 arnold devel 19 May 4 15:51 message
228786 -rw-r--r-- 2 arnold devel 19 May 4 15:51 msg
Хотя мы создали две ссылки на один файл в одном каталоге, прямые ссылки не обязательно должны находиться в одном и том же каталоге; они могут находиться в любом каталоге в той же самой файловой системе. (Несколько подробнее это обсуждается в разделе 5.1.6 «Символические ссылки».)
Вдобавок, вы можете создать ссылку на файл, который вам не принадлежит, если у вас есть право записи в каталоге, в котором вы создаете ссылку. (Такой файл сохраняет все атрибуты первоначального файла: владельца, права доступа и т.д. Это потому, что это
После удаления ссылки создание еще одного файла с прежним именем создает новый файл:
$ rm message /* Удалить старое имя */
$ echo "What's happenin?" > message /* Повторно использовать имя */
$ ls -il msg message /* Отобразить сведения */
228794 -rw-r--r-- 1 arnold devel 17 May 4 15:58 message
228786 -rw-r--r-- 1 arnold devel 19 May 4 15:51 msg
Обратите внимание, что теперь счетчик ссылок каждого из файлов равен 1. На уровне С ссылки создаются с помощью системного вызова link()
:
#include
int link(const char *oldpath, const char *newpath);
При успешном создании ссылки возвращается 0, в противном случае (-1), при этом errno отражает ошибку. Важным-случаем ошибки является тот, когда newpath
уже существует. Система не удалит его для вас, поскольку попытка сделать это может вызвать несовместимости в файловой системе.
5.1.3.1. Программа GNU link
Программа ln
сложная и большая. Однако, GNU Coreutils содержит несложную программу link
, которая просто вызывает link()
со своими двумя аргументами. Следующий пример показывает код из файла link.с
, не относящиеся к делу части удалены. Номера строк относятся к действительному файлу.
20 /* Обзор реализации:
21
22 Просто вызывает системную функцию 'link' */
23
/* ...Операторы #include для краткости опущены... */
34