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);
Поделиться:
Популярные книги
Анна Иоановна
9. Романовы. Династия в романах
Проза:
историческая проза
5.60
рейтинг книги
Бастард Императора. Том 14
14. Бастард Императора
Фантастика:
городское фэнтези
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Краем глаза
Детективы:
триллеры
8.62
рейтинг книги
Новое восстание
139. Звездные войны
Фантастика:
боевая фантастика
5.00
рейтинг книги
Старый, но крепкий 4
4. Культивация без насилия
Фантастика:
уся
фэнтези
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 13
13. История Телепата
Фантастика:
боевая фантастика
аниме
попаданцы
фэнтези
7.33
рейтинг книги
Последний реанорец. Том I и Том II
1. Высшая Речь
Фантастика:
фэнтези
7.80
рейтинг книги
Том 6. Письма
6. Есенин Сергей. Полное собрание сочинений в семи томах
Поэзия:
поэзия
5.00
рейтинг книги
Рожденные Небом
2. Вселенная EVE Online
Фантастика:
космическая фантастика
8.61
рейтинг книги
Цикл "Идеальный мир для Лекаря". Компиляция. Книги 1-30
Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Новая хронология Греции
Научно-образовательная:
история
5.00
рейтинг книги
Метатель
1. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Воронцов. Перезагрузка. Книга 4
4. Воронцов. Перезагрузка
Фантастика:
попаданцы
альтернативная история
фэнтези
фантастика: прочее
6.00
рейтинг книги
Массовая культура
Научно-образовательная:
культурология
5.00