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

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

1 ... 49 50 51 52 53 ... 253 ВПЕРЕД
Перейти на страницу:

Новым каталогам, как и всем файлам, присваивается идентификационный номер группы. К сожалению, его работа запутана. Мы отложим обсуждение до раздела 11.5.1 «Группа по умолчанию для новых файлов и каталогов».

Обе функции работают на одном уровне каталога за раз. Если /somedir существует, a /somedir/sub1 нет, 'mkdir("/somedir/sub1/sub2")' завершится неудачей. Каждый компонент в длинном пути должен создаваться отдельно (в соответствии с опцией -р mkdir, см. mkdir(1)).

Также, если pathname завершается символом '/', на некоторых системах mkdir() и rmdir() потерпят неудачу, а на других нет. Следующая программа, ch05-trymkdir.с, демонстрирует оба аспекта.

1  /* ch05-trymkdir.c --- Демонстрирует поведение mkdir().

2     Любезность Nelson H.F. Beebe. */

3

4  #include <stdio.h>

5  #include <stdlib.h>

6  #include <errno.h>

7

8  #if !defined(EXIT_SUCCESS)

9  #define EXIT_SUCCESS 0

10 #endif

11

12 void do_test(const char *path)

13 {

14  int retcode;

15

16  errno = 0;

17  retcode = mkdir(path, 0755);

18  printf("mkdir("%s") returns %d: errno = %d [%s)n",

19   path, retcode, errno, strerror(errno));

20 }

21

22 int main(void)

23 {

24  do_test("/tmp/t1/t2/t3/t4"); /*Попытка создания в подкаталоге*/

25  do_test("/tmp/t1/t2/t3");

26  do_test("/tmp/t1/t2");

27  do_test("/tmp/t1");

28

29  do_test("/tmp/u1"); /* Создать подкаталоги */

30  do_test("/tmp/u1/u2");

31  do_test("/tmp/u1/u2/u3");

32  do_test("/tmp/u1/u2/u3/u4");

33

34  do_test("/tmp/v1/"); /* Как обрабатывается завершающий '/'? */

35  do_test("/tmp/v1/v2/");

36  do_test("/tmp/v1/v2/v3/");

37  do_test("/tmp/v1/v2/v3/v4/");

38

39  return(EXIT_SUCCESS);

40 }

Вот результаты для GNU/Linux:

$ <b>ch05-trymkdir</b>

mkdir(&quot;/tmp/t1/t2/t3/t4&quot;) returns -1: errno = 2 [No such file or directory)

mkdir(&quot;/tmp/t1/t2/t3&quot;) returns -1: errno = 2 [No such file or directory)

mkdir(&quot;/tmp/t1/t2&quot;) returns -1: errno = 2 [No such file or directory]

mkdir(&quot;/tmp/t1&quot;) returns 0: errno = 0 [Success]

mkdir(&quot;/tmp/u1&quot;) returns 0: errno = 0 [Success]

mkdir(&quot;/tmp/u1/u2&quot;) returns 0: errno = 0 [Success]

mkdir(&quot;/tmp/u1/u2/u3&quot;) returns 0: errno = 0 [Success]

mkdir(&quot;/tmp/u1/u2/u3/u4&quot;) returns 0: errno = 0 [Success]

mkdir(&quot;/tmp/v1/&quot;) returns 0: errno = 0 [Success]

mkdir(&quot;/tmp/v1/v2/&quot;) returns 0: errno = 0 (Success]

mkdir(&quot;/tmp/v1/v2/v3/&quot;) returns 0: errno = 0 [Success]

mkdir(&quot;/tmp/v1/v2/v3/v4/&quot;) returns 0: errno = 0 [Success]

Обратите внимание, как GNU/Linux принимает завершающий слеш. Не все системы так делают.

5.3. Чтение каталогов

В оригинальных системах Unix чтение содержимого каталогов было просто. Программа открывала каталог с помощью open() и непосредственно читала двоичные структуры struct direct, по 16 байтов за раз. Следующий фрагмент кода из программы V7 rmdir[53], строки 60–74. Он показывает проверку на пустоту каталога.

60 if ((fd = open(name, 0)) &lt; 0) {

61  fprintf(stderr, &quot;rmdir: %s unreadablen&quot;, name);

62  ++Errors;

63  return;

64 }

65 while (read(fd, (char*)&amp;dir, sizeof dir) == sizeof dir) {

66  if (dir.d_ino == 0) continue;

67  if (!strcmp(dir.d_name, &quot;.&quot;) || !strcmp(dir.d_name, &quot;..&quot;))

68   continue;

69  fprintf(stderr, &quot;rmdir: %s not emptyn&quot;, name);

70  ++Errors;

71  close(fd);

72  return;

73 }

74 close(fd);

В строке 60 каталог открывается для чтения (второй аргумент равен 0, что означает O_RDONLY). В строке 65 читается struct direct. В строке 66 проверяется, не является ли элемент каталога пустым, т. е. с номером индекса 0. Строки 67 и 68 проверяют на наличие '.' и '..'. По достижении строки 69 мы знаем, что было встречено какое-то другое имя файла, следовательно, этот каталог не пустой.

1 ... 49 50 51 52 53 ... 253 ВПЕРЕД
Перейти на страницу:

Откройте для себя мир чтения на siteknig.com - месте, где каждая книга оживает прямо в браузере. Здесь вас уже ждёт произведение Linux программирование в примерах - Роббинс Арнольд, относящееся к жанру Интернет. Никаких регистраций, никаких преград - только вы и история, доступная в полном формате. Наш литературный портал создан для тех, кто любит комфорт: хотите читать с телефона - пожалуйста; предпочитаете ноутбук - идеально! Все книги открываются моментально и представлены полностью, без сокращений и скрытых страниц. Каталог жанров поможет вам быстро найти что-то по настроению: увлекательный роман, динамичное фэнтези, глубокую классику или лёгкое чтение перед сном. Мы ежедневно расширяем библиотеку, добавляя новые произведения, чтобы вам всегда было что открыть "на потом". Сегодня на siteknig.com доступно более 200000 книг - и каждая готова стать вашей новой любимой. Просто выбирайте, открывайте и наслаждайтесь чтением там, где вам удобно.

Комментарии (0)