Linux программирование в примерах
Шрифт:
int (*gl_lstat)(const char *, struct stat*)
Указатель на альтернативную версию
lstat
.
int (*gl_stat)(const char*, struct stat*)
Указатель на альтернативную версию
stat
. Указатели на альтернативные версии стандартных функций предназначены главным образом для использования в реализации GLIBC; крайне маловероятно, что вы когда-нибудь их используете. Поскольку GLIBC предусматривает поле
gl_flags
и дополнительные значения флагов, справочная страница и руководство Info документируют оставшуюся часть структуры GLIBC glob_t
. В табл. 12.3 перечислены дополнительные флаги. Таблица 12.3.
glob
Флаг | Значение |
---|---|
GLOB_ALTDIRFUNC | Использовать для доступа к каталогам альтернативные функции (см. текст) |
GLOB_BRACE | Выполнить раскрытие фигурных скобок в стиле csh и Bash. |
GLOB_MAGCHAR | Вставить gl_flags , если были найдены метасимволы. |
GLOB_NOMAGIC | Вернуть шаблон, если он не содержит метасимволов |
GLOB_ONLYDIR | По возможности сопоставлять лишь каталоги. См. текст. |
GLOB_PERIOD | Разрешить соответствие метасимволов наподобие * и ? начальной точке |
GLOB_TILDE | Выполнить раскрывание тильды в стиле оболочки. |
GLOB_TILDE_CHECK | Подобно GLOB_TILDE , но если есть проблемы с указанным домашним каталогом, вернуть GLOB_NOMATCH вместо помещения pattern в список. |
Флаг
GLOB_ONLYDIR
действует в качестве подсказки реализации, потому что вызывающий интересуется лишь каталогами. Главным его предназначением является использование другими функциями в GLIBC, а вызывающий по-прежнему должен быть готов обрабатывать файлы, не являющиеся каталогами. Вам не следует использовать этот флаг в своих программах. glob
может быть вызвана более одного раза: при первом вызове флаг GLOB_APPEND
не должен быть указан, при всех последующих вызовах он должен быть указан. Вы не можете между вызовами изменять gl_offs
, а если вы изменили какие-нибудь значения в gl_pathv
или gl_pathc
, нужно их восстановить перед последующим вызовом glob
. Возможность многократного вызова
glob
позволяет накапливать результаты в одном списке. Это довольно практично, приближается к мощным возможностям раскрывания групповых символов оболочки, но на уровне языка программирования С. glob
возвращает 0, если не было проблем, или одно из значений из табл. 12.4, если были. Таблица 12.4. Возвращаемые
glob
значения Флаг | Значение |
---|---|
GLOB_ABORTED | Просмотр остановлен раньше времени, поскольку был установлен GLOB_ERR или функция (*errfunc) возвратила ненулевой результат |
GLOB_NOMATCH | Ни одно имя файла не соответствовало pattern ,
GLOB_NOCHECK не был установлен |
GLOB_NOSPACE | Была проблема с выделением динамической памяти |
globfree
освобождает всю память, которую динамически выделила glob
Следующая программа, ch12-glob.с
, демонстрирует glob
:
1 /* ch12-glob.c --- демонстрирует glob. */
2
3 #include <stdio.h>
4 #include <errno.h>
5 #include <glob.h>
6
7 char *myname;
8
9 /* globerr --- выводит сообщение об ошибке для glob */
10
11 int globerr(const char *path, int eerrno)
12 {
13 fprintf(stderr, "%s: %s: %s\n", myname, path, strerror(eerrno));
14 return 0; /* let glob keep going */
15 }
16
17 /* main --- раскрывает символы подстановки в командной строке и выводит результаты */
18
19 int main(int argc, char **argv)
20 {
21 int i;
22 int flags = 0;
23 glob_t results;
24 int ret;
25
26 if (argc == 1) {
27 fprintf(stderr, "usage: %s wildcard ...\n", argv[0]);
28 exit(1);
29 }
30
31 myname = argv[0]; /* для globerr */
32
33 for (i = 1; i < argc; i++) {
34 flags |= (i > 1 ? GLOB_APPEND : 0);
35 ret = glob(argv[i], flags, globerr, &results);
36 if (ret != 0) {
37 fprintf(stderr, "%s: problem with %s (%s),
38 stopping early\n", myname, argv[i],
39 /* опасно: */ (ret == GLOB_ABORTED ? "filesystem problem" :
40 ret == GLOB_NOMATCH ? "no match of pattern" :
41 ret == GLOB_NOSPACE ? "no dynamic memory" :
42 "unknown problem"));
43 break;
44 }
45 }
46
47 for (i = 0; i < results.gl_pathc; i++)
48 printf("%s\n", results.gl_pathv[i]);
49
50 globfree(&results);
51 return 0;
52 }
Строка 7 определяет
myname
, которая указывает на имя программы; эта переменная для сообщений об ошибках от globerr
, определенной в строках 11–15. Строки 33–45 являются основой программы. Они перебирают в цикле шаблоны, приведенные в командной строке, вызывая для каждого
glob
для добавления к списку результатов. Большую часть цикла составляет обработка ошибок (строки 36–44). Строки 47–48 выводят результирующий список, а строки 50–51 проводят завершающую очистку и возвращаются.
Поделиться:
Популярные книги
Измена. (Не)любимая жена олигарха
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Генерал-адмирал. Тетралогия
Генерал-адмирал
Фантастика:
альтернативная история
8.71
рейтинг книги
Не грози Дубровскому!
1. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Мне нужна жена
Любовные романы:
современные любовные романы
6.88
рейтинг книги
Третий
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Все ведьмы – стервы, или Ректору больше (не) наливать
1. Все ведьмы - стервы
Фантастика:
юмористическая фантастика
5.00
рейтинг книги
Вечный Данж. Трилогия
Фантастика:
фэнтези
юмористическая фантастика
6.77
рейтинг книги
Прометей: Неандерталец
4. Прометей
Фантастика:
героическая фантастика
альтернативная история
7.88
рейтинг книги
Невеста
Любовные романы:
любовно-фантастические романы
эро литература
8.54
рейтинг книги
Егерь
1. Сопряжение
Фантастика:
боевая фантастика
попаданцы
рпг
7.00
рейтинг книги
Дарующая счастье
Любовные романы:
любовно-фантастические романы
6.96
рейтинг книги
Аромат невинности
Любовные романы:
любовно-фантастические романы
эро литература
9.23
рейтинг книги
Сводный гад
2. Самбисты
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Чемпион
3. Мания крафта
Фантастика:
фэнтези
рпг
5.38