Чтение онлайн

на главную - закладки

Жанры

Linux программирование в примерах

Роббинс Арнольд

Шрифт:

$ echo hello, world > message /* Создать новый файл */

$ ls -il message /* Показать также номер индекса */

228786 -rw-r--r-- 1 arnold devel 13 May 4 15:43 message

Поскольку элементы каталога связывают имена файлов с индексами, у одного файла может быть несколько имен. Каждый элемент каталога, ссылающийся на один и тот же индекс, называется ссылкой (link) или прямой ссылкой (hard link) на файл. Ссылки создаются с помощью

команды
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 <unistd.h> /* POSIX */

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

35 /* Официальное имя этой программы (например, нет префикса 'g'). */

36 #define PROGRAM_NAME "link"

37

38 #define AUTHORS "Michael Stone"

39

40 /* Имя, под которым была запущена данная программа. */

41 char *program_name;

42

43 void

44 usage(int status)

45 {

/* ... для краткости опущено... */

62 }

63

64 int

65 main(int argc, char **argv)

66 {

67 program_name = argv[0];

68 setlocale(LC_ALL, "");

69 bindtextdomain(PACKAGE, LOCALEDIR);

70 textdomain(PACKAGE);

71

72 atexit(close_stdout);

73

74 parse_long_options(argc, argv, PROGRAM_NAME, GNU_PACKAGE,

75 VERSION, AUTHORS, usage);

76

77 /* Вышеприведенное обрабатывает --help и --version.

78 Поскольку других вызовов getopt нет, обработать здесь '--'. */

79 if (1 < argc && STREQ(argv[1], "--"))

80 {

Поделиться:
Популярные книги

На границе империй. Том 10. Часть 2

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
5.00
рейтинг книги
На границе империй. Том 10. Часть 2

Глава рода

Шелег Дмитрий Витальевич
5. Живой лёд
Фантастика:
боевая фантастика
6.55
рейтинг книги
Глава рода

Дворянин

Злотников Роман Валерьевич
2. Император и трубочист
Фантастика:
боевая фантастика
альтернативная история
5.00
рейтинг книги
Дворянин

Хозяин Теней

Петров Максим Николаевич
1. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней

Матабар

Клеванский Кирилл Сергеевич
1. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар

Наномашины, Кошмар Академии! Том 10

Новиков Николай Васильевич
10. Первый среди карапузов
Фантастика:
аниме
попаданцы
5.00
рейтинг книги
Наномашины, Кошмар Академии! Том 10

Гримуар темного лорда VIII

Грехов Тимофей
8. Гримуар темного лорда
Фантастика:
боевая фантастика
альтернативная история
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Гримуар темного лорда VIII

Кодекс Охотника. Книга XXXVI

Винокуров Юрий
36. Кодекс Охотника
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXXVI

Локки 7. Потомок бога

Решетов Евгений Валерьевич
7. Локки
Фантастика:
аниме
эпическая фантастика
фэнтези
5.00
рейтинг книги
Локки 7. Потомок бога

Первый среди равных. Книга IV

Бор Жорж
4. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных. Книга IV

Седина в бороду, Босс… вразнос!

Трофимова Любовь
Юмор:
юмористическая проза
5.00
рейтинг книги
Седина в бороду, Босс… вразнос!

Орленев

Мацкин Александр Петрович
Жизнь в искусстве
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Орленев

Черная метка

Лисина Александра
7. Гибрид
Фантастика:
технофэнтези
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Черная метка

Хозяин Стужи 2

Петров Максим Николаевич
2. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
5.75
рейтинг книги
Хозяин Стужи 2