Категории
Самые читаемые
PochitayKnigi » Компьютеры и Интернет » Интернет » Linux программирование в примерах - Роббинс Арнольд

Linux программирование в примерах - Роббинс Арнольд

Читать онлайн Linux программирование в примерах - Роббинс Арнольд

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 44 45 46 47 48 49 50 51 52 ... 253
Перейти на страницу:

После удаления ссылки создание еще одного файла с прежним именем создает новый файл:

$ <b>rm message</b> /* Удалить старое имя */

$ <b>echo &quot;What's happenin?&quot; &gt; message</b> /* Повторно использовать имя */

$ <b>ls -il msg message</b> /* Отобразить сведения */

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 &lt;unistd.h&gt; /* 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 &quot;link&quot;

37

38  #define AUTHORS &quot;Michael Stone&quot;

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, &quot;&quot;);

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 &lt; argc &amp;&amp; STREQ(argv[1], &quot;--&quot;))

80   {

81    --argc;

82    ++argv;

83   }

84

85   if (argc &lt; 3)

86   {

87    error(0, 0, _(&quot;too few arguments&quot;));

88    usage(EXIT_FAILURE);

89   }

90

91   if (3 &lt; argc)

92   {

93    error(0, 0, _(&quot;too many arguments&quot;));

94    usage(EXIT_FAILURE);

95   }

96

97   if (link(argv[1], argv[2]) != 0)

98    error(EXIT_FAILURE, errno, _(&quot;cannot create link %s to %s&quot;),

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. Точка и точка-точка

Завершая обсуждение ссылок, давайте взглянем на то, как обрабатываются специальные имена '.' и '..'. На самом деле они просто являются прямыми ссылками. В первом случае '.' является прямой ссылкой на каталог, содержащий ее, а '..' — прямой ссылкой на родительский каталог. Операционная система создает для вас эти ссылки; как упоминалось ранее, код уровня пользователя не может создать прямую ссылку на каталог. Этот пример иллюстрирует ссылки:

$ <b>pwd</b> /* Отобразить текущий каталог */

/tmp

$ <b>ls -ldi /tmp</b> /* Показать номер его индекса */

225345 drwxrwxrwt 14 root root 4096 May 4 16:15 /tmp

$ <b>mkdir x</b> /* Создать новый каталог */

$ <b>ls -ldi x</b> /* И показать номер его индекса */

1 ... 44 45 46 47 48 49 50 51 52 ... 253
Перейти на страницу:
Тут вы можете бесплатно читать книгу Linux программирование в примерах - Роббинс Арнольд.
Комментарии