GLOB_APPEND | pglob предположительно является действительным результатом предыдущего вызова glob() , и любые результаты этого вызова добавляются к результатам предыдущего вызова. Это облегчает универсализацию множества шаблонов. |
GLOB_NOESCAPE | Обычно если операции универсализации предшествует символ , она воспринимается как обычный символ. Например, шаблон а* обычно соответствует только файлу по имени а* . Если устанавливается GLOB_NOESCAPE , символ теряет свое особое значение, aa * соответствует любому имени файла, начинающемуся с символов а . В таком случае имена а. и acd будут соответствовать, но arachnid — нет, поскольку оно не содержит . |
GLOB_PERIOD | Большинство оболочек не позволяют применять операции универсализации для файловых имен, начинающихся с . (запустите ls * в своем домашнем каталоге и сравните полученное с результатом ls - а . ). Функция glob() обычно ведет себя подобным образом, но GLOB_PERIOD позволяет операциям универсализации работать с ведущим символом. Значение GLOB_PERIOD в POSIX не определено. |
GLOB_BRACE | Многие оболочки (следуя примеру csh ) разворачивают последовательности с фигурными скобками как альтернативы; например, шаблон {a, b} разворачивается до a b , а шаблон a {, b, c} — до a ab ас . GLOB_BRACE делает возможным такое поведение. Значение GLOB_BRACE в POSIX не определено. |
GLOB_NOMAGIС | Действует подобно GLOB_NOCHECK за исключением того, что он добавляет шаблон к списку результатов только в том случае, если она не содержит специальных знаков. Значение GLOB_NOMAGIC в POSIX не определено. |
GLOB_TILDE | Включает расширение с тильдой, в котором ~ или подстрока ~/ разворачиваются до пути к домашнему каталогу текущего пользователя, а ~user — до пути к домашнему каталогу пользователя user. Значение GLOB_TILDE в POSIX не определено. |
GLOB_ONLYDIR | Совпадает только с каталогами, а не с другими типами файлов. Значение GLOB_ONLYDIR в POSIX не определено. |
Часто glob()
наталкивается на каталоги, к которым у процесса нет доступа, что вызывает ошибки. Хотя ошибку можно каким-то образом обработать, однако если glob()
возвращает ошибку (GLOB_ERR
), операцию универсализации нельзя перезапустить там, где предыдущая операция универсализации столкнулась с ошибкой. Поскольку сложно одновременно устранять ошибки, происходящие во время выполнения glob()
, и завершать универсализацию, glob()
позволяет передать ошибку в специально предусмотренную для этого функцию, которая определяется в третьем параметре glob()
.
Прототип этой функции показан ниже.
int globerr(const char * pathname, int globerrno);
Функции передается путевое имя, вызвавшее ошибку, и значение errno
, возвращенное одним из системных вызовов opendir()
, readdir()
или stat()
. Если функция ошибки возвращает величину больше нуля, glob()
возвращается с ошибкой. В противном случае операция универсализации продолжается.
Результаты универсализации хранятся в структуре glob_t
, на которую ссылается pglob
. Она включает описанные ниже элементы, позволяющие абоненту найти согласованные имена файлов.
gl_pathc | Количество путевых имен, соответствующих шаблону. |
gl_pathv | Массив путевых имен, соответствующих шаблону. |
После использования возвращенного результата glob_t
занимаемую им память следует освободить, передав его в globfree()
.
void globfree(glob_t * pglob);
Системный вызов glob()
возвращает GLOB_NOSPACE
в случае нехватки памяти, GLOB_ABEND
, если ошибка чтения привела к неудачному выполнению функции, GLOB_NOMATCH
, если соответствия не были найдены, или 0
, если функция выполнилась удачно и нашла соответствия.
Для иллюстрации работы glob()
ниже приведена программа globit
, которая принимает множество шаблонов в качестве аргументов, универсализирует их и отображает результат. В случае ошибки отображается сообщение, описывающее ошибку, а операция универсализации продолжается.
1: /* globit.с */
2:
3: #include <errno.h>
4: #include <glob.h>
5: #include <stdio.h>
6: #include <string.h>
7: #include <unistd.h>
8:
9: /* Это функция ошибки, которая передается в glob(). Она просто отображает