Linux программирование в примерах
Шрифт:
Обратите внимание, что теперь счетчик ссылок каждого из файлов равен 1. На уровне С ссылки создаются с помощью системного вызова
link
:
#include <unistd.h> /* POSIX */
int link(const char *oldpath, const char *newpath);
При успешном создании ссылки возвращается 0, в противном случае (-1), при этом errno отражает ошибку. Важным-случаем ошибки является тот, когда
newpath
уже существует. Система не удалит его для вас, поскольку попытка сделать это может вызвать несовместимости в файловой системе. 5.1.3.1.
Программа
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 {
81 --argc;
82 ++argv;
83 }
84
85 if (argc < 3)
86 {
87 error(0, 0, _("too few arguments"));
88 usage(EXIT_FAILURE);
89 }
90
91 if (3 < argc)
92 {
93 error(0, 0, _("too many arguments"));
94 usage(EXIT_FAILURE);
95 }
96
97 if (link(argv[1], argv[2]) != 0)
98 error(EXIT_FAILURE, errno, _("cannot create link %s to %s"),
99 quote_n(0, argv[2]), quote_n(1, argv[1]));
100
101 exit(EXIT_SUCCESS);
102 }
Строки 67–75
link
вызывается лишь с двумя аргументами. Сам системный вызов link
осуществляется в строке 97 (Функция quote_n
обеспечивает отображение аргументов в стиле, подходящем для текущей локали; подробности сейчас несущественны.) 5.1.3.2. Точка и точка-точка
Завершая обсуждение ссылок, давайте взглянем на то, как обрабатываются специальные имена '
.
' и '..
'. На самом деле они просто являются прямыми ссылками. В первом случае '.
' является прямой ссылкой на каталог, содержащий ее, а '..
' — прямой ссылкой на родительский каталог. Операционная система создает для вас эти ссылки; как упоминалось ранее, код уровня пользователя не может создать прямую ссылку на каталог. Этот пример иллюстрирует ссылки:
$ pwd /* Отобразить текущий каталог */
/tmp
$ ls -ldi /tmp /* Показать номер его индекса */
225345 drwxrwxrwt 14 root root 4096 May 4 16:15 /tmp
$ mkdir x /* Создать новый каталог */
$ ls -ldi x /* И показать номер его индекса */
52794 drwxr-xr-x 2 arnold devel 4096 May 4 16:27 x
$ ls -ldi x/. x/.. /* Показать номера индексов . И .. */
52794 drwxr-xr-x 2 arnold devel 4096 May 4 16:27 x/.
225345 drwxrwxrwt 15 root root 4096 May 4 16:27 x/..
Родительский каталог корневого каталога (
/..
) является особым случаем; мы отложим его обсуждение до главы 8 «Файловые системы и обход каталогов». 5.1.4. Переименование файлов
При данном способе отображения элементами каталога имен на номера индексов, переименование файла концептуально очень просто:
Поделиться:
Популярные книги
Ты не мой Boy 2
6. Самбисты
Любовные романы:
современные любовные романы
короткие любовные романы
5.00
рейтинг книги
Курсант: назад в СССР
1. Курсант
Фантастика:
попаданцы
альтернативная история
7.33
рейтинг книги
Энфис. Книга 1
1. Эрра
Фантастика:
боевая фантастика
рпг
5.70
рейтинг книги
Сама себе хозяйка
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Возвращение Низвергнутого
5. Изгой
Фантастика:
фэнтези
9.40
рейтинг книги
Последний Паладин. Том 5
5. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Вечная Война. Книга V
5. Вечная Война
Фантастика:
юмористическая фантастика
космическая фантастика
7.29
рейтинг книги
Архил...? Книга 2
2. Архил...?
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Золотая осень 1977
3. Регрессор в СССР
Фантастика:
альтернативная история
7.36
рейтинг книги
Доктора вызывали? или Трудовые будни попаданки
Фантастика:
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Приручитель женщин-монстров. Том 2
2. Покемоны? Какие покемоны?
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Его наследник
1. Наследники Сильных
Любовные романы:
современные любовные романы
эро литература
5.87
рейтинг книги
Не грози Дубровскому! Том Х
10. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Игра топа. Революция
3. Игра топа
Фантастика:
фэнтези
7.45