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

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

Жанры

Linux программирование в примерах
Шрифт:

Обратите внимание, что теперь счетчик ссылок каждого из файлов равен 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 {

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 являются типичным шаблоном Coreutils, устанавливающими интернациональные настройки, выход по завершении и анализ аргументов. Строки 79–95 гарантируют, что

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. Переименование файлов

При данном способе отображения элементами каталога имен на номера индексов, переименование файла концептуально очень просто:

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

Чужак из ниоткуда 4

Евтушенко Алексей Анатольевич
4. Чужак из ниоткуда
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чужак из ниоткуда 4

Железный Воин Империи II

Зот Бакалавр
2. Железный Воин Империи
Фантастика:
фэнтези
попаданцы
аниме
5.75
рейтинг книги
Железный Воин Империи II

Иной. Том 1. Школа на краю пустыни

Amazerak
1. Иной в голове
Фантастика:
боевая фантастика
рпг
аниме
5.75
рейтинг книги
Иной. Том 1. Школа на краю пустыни

Страж. Тетралогия

Пехов Алексей Юрьевич
Страж
Фантастика:
фэнтези
9.11
рейтинг книги
Страж. Тетралогия

Страж Кодекса. Книга III

Романов Илья Николаевич
3. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Страж Кодекса. Книга III

Газлайтер. Том 23

Володин Григорий Григорьевич
23. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 23

На гребне обстоятельств

Шелег Дмитрий Витальевич
7. Живой лед
Фантастика:
фэнтези
5.25
рейтинг книги
На гребне обстоятельств

Очкарик

Афанасьев Семён
Фантастика:
фэнтези
5.75
рейтинг книги
Очкарик

Петля, Кадетский корпус. Книга третья

Алексеев Евгений Артемович
3. Петля
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Петля, Кадетский корпус. Книга третья

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

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

Вторая жизнь майора. Цикл

Сухинин Владимир Александрович
Вторая жизнь майора
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Вторая жизнь майора. Цикл

Гранит науки. Том 1

Зот Бакалавр
1. Героями не становятся, ими умирают
Фантастика:
фэнтези
боевая фантастика
5.25
рейтинг книги
Гранит науки. Том 1

Вечный. Книга V

Рокотов Алексей
5. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга V

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

INDIGO
18. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 5