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

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

Жанры

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

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

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

Здравствуй, 1985-й

Иванов Дмитрий
2. Девяностые
Фантастика:
альтернативная история
5.25
рейтинг книги
Здравствуй, 1985-й

Камень Книга седьмая

Минин Станислав
7. Камень
Фантастика:
фэнтези
боевая фантастика
6.22
рейтинг книги
Камень Книга седьмая

Источник

Билик Дмитрий Александрович
11. Бедовый
Фантастика:
юмористическое фэнтези
городское фэнтези
мистика
7.00
рейтинг книги
Источник

Моров. Том 1 и Том 2

Кощеев Владимир
1. Моров
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Моров. Том 1 и Том 2

Туполев

Бодрихин Николай Георгиевич
1327. Жизнь замечательных людей
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Туполев

Лекарь Империи 15

Карелин Сергей Витальевич
15. Лекарь Империи
Фантастика:
городское фэнтези
аниме
фэнтези
попаданцы
6.80
рейтинг книги
Лекарь Империи 15

Хозяин Теней 5

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

Инкарнатор

Прокофьев Роман Юрьевич
1. Стеллар
Фантастика:
боевая фантастика
рпг
7.30
рейтинг книги
Инкарнатор

Я уже царь. Книга XXIX

Дрейк Сириус
29. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я уже царь. Книга XXIX

Третий. Том 4

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

Убивать чтобы жить 4

Бор Жорж
4. УЧЖ
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 4

На границе империй. Том 8

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

Товарищ "Чума"

lanpirot
1. Товарищ "Чума"
Фантастика:
попаданцы
альтернативная история
4.00
рейтинг книги
Товарищ Чума

Третий. Том 2

INDIGO
2. Отпуск
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий. Том 2