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

на главную

Жанры

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

Оба возвращают 0 при успехе и (-1) при ошибке, с соответствующим

errno
. Аргумент
mode
для
mkdir
представляет права доступа, которые должны быть использованы для каталога. Он полностью идентичен аргументам
mode
для
creat
и
open
, обсуждавшимся в разделе 4.6 «Создание файлов».

Обе функции обрабатывают '

.
' и '
..
' в создаваемом или удаляемом каталоге. Перед удалением каталог должен быть пуст; если это не так,
errno
устанавливается в
ENOTEMPTY
. (В данном случае, «пуст» означает, что каталог содержит только '
.
' и '
..
'.)

Новым каталогам, как и всем файлам, присваивается идентификационный номер группы. К сожалению, его работа запутана. Мы отложим обсуждение до раздела 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:

$ ch05-trymkdir

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

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

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

mkdir("/tmp/t1") returns 0: errno = 0 [Success]

mkdir("/tmp/u1") returns 0: errno = 0 [Success]

mkdir("/tmp/u1/u2") returns 0: errno = 0 [Success]

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

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

mkdir("/tmp/v1/") returns 0: errno = 0 [Success]

mkdir("/tmp/v1/v2/") returns 0: errno = 0 (Success]

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

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

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

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

В оригинальных системах Unix чтение содержимого каталогов было просто. Программа открывала каталог с помощью

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

53

См

/usr/src/cmd/rmdir
с в дистрибутиве V7 — Примеч. автора.

60 if ((fd = open(name, 0)) < 0) {

61 fprintf(stderr, "rmdir: %s unreadable\n", name);

62 ++Errors;

63 return;

64 }

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

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

67 if (!strcmp(dir.d_name, ".") || !strcmp(dir.d_name, ".."))

68 continue;

69 fprintf(stderr, "rmdir: %s not empty\n", name);

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

Кодекс Охотника. Книга X

Винокуров Юрий
10. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
6.25
рейтинг книги
Кодекс Охотника. Книга X

Я до сих пор князь. Книга XXII

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

Анти-Ксенонская Инициатива

Вайс Александр
7. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Анти-Ксенонская Инициатива

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

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

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

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

Зеркало силы

Кас Маркус
3. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Зеркало силы

Законы Рода. Том 6

Андрей Мельник
6. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 6

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

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

Ваше Сиятельство

Моури Эрли
1. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Ваше Сиятельство

Сирота

Шмаков Алексей Семенович
1. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Сирота

Любовь Носорога

Зайцева Мария
Любовные романы:
современные любовные романы
9.11
рейтинг книги
Любовь Носорога

Черный Маг Императора 19

Герда Александр
19. Черный маг императора
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Черный Маг Императора 19

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

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

Идеальный мир для Лекаря 19

Сапфир Олег
19. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 19