GLOB(3) | Руководство программиста Linux | GLOB(3) |
glob, globfree - ищет имена путей по шаблону, освобождает память после glob()
#include <glob.h>
int glob(const char *pattern, int flags, int (*errfunc) (const char *epath, int eerrno), glob_t *pglob); void globfree(glob_t *pglob);
Функция glob() ищет все совпадения имён путей с заданным шаблоном pattern, согласно правилам, используемым оболочкой (смотрите glob(7)). Расширения тильды или подстановка параметров не выполняется; если это нужно, то используйте wordexp(3).
Функция globfree() освобождает динамически выделенное хранилище, полученное в последнем вызове glob().
Результаты вызова glob() сохраняются в структуре, на которую указывает pglob. Эта структура имеет тип glob_t (объявлен в <glob.h>) и содержит следующие элементы, определённые в POSIX.2 (их может быть и больше, в виде расширений):
typedef struct { size_t gl_pathc; /* количество совпавших путей */ char **gl_pathv; /* список совпавших имён путей. */ size_t gl_offs; /* зарезервированные в gl_pathv слоты. */ } glob_t;
Результаты размещаются в динамически выделяемом хранилище.
Значение параметра flags формируется побитовым сложением нуля или более следующих символических констант, которые меняют ход работы glob():
В flags также могу быть включены следующие флаги, которые являются расширениями GNU и отсутствуют в POSIX.2:
Если errfunc не равно NULL, то в случае ошибки она будет вызвана с параметрами epath (указатель на путь, в котором произошла ошибка) и eerrno (полученное значение errno после вызова одной из функций opendir(3), readdir(3) или stat(2)).Если errfunc вернёт ненулевое значение или если флаг GLOB_ERR установлен, то glob() закончит работу после вызова errfunc.
При успешном выполнении в pglob->gl_pathc содержится количество совпадающих имён, а pglob->gl_pathv содержит указатель на список указателей на найденные имена. Список указателей завершается указателем null.
Вызов glob() может выполняться несколько раз. В этом случае флаг GLOB_APPEND должен быть включён в flags при втором и последующих вызовах.
Как расширение GNU, при обнаружении метасимволов pglob->gl_flags — набор задаваемых флагов, сложенный с GLOB_MAGCHAR (с помощью операции ИЛИ).
При успешном выполнении glob() возвращает ноль. Другие возможные возвращаемые значения:
Описание терминов данного раздела смотрите в attributes(7).
Интерфейс | Атрибут | Значение |
glob() | Безвредность в нитях | MT-Unsafe race:utent env sig:ALRM timer locale |
globfree() | Безвредность в нитях | MT-Safe |
В приведённой выше таблице utent в race:utent означает, что если любая из функций setutent(3), getutent(3) или endutent(3) используется одновременно в нескольких нитях программы, то может возникнуть состязательность по данным. Эти функции вызываются из glob(), поэтому мы используем race:utent для напоминания.
POSIX.1-2001, POSIX.1-2008, POSIX.2.
Элементы структуры gl_pathc и gl_offs объявлены с типом size_t в glibc 2.1 (как и должны указываться, согласно POSIX.2), но указаны как int в glibc 2.0.
Функция glob() может завершиться с ошибкой из-за ошибок в используемых её функций: malloc(3) или opendir(3). Эти функции записывают коды своих ошибок в переменную errno.
Пример использования приводится ниже, в нём имитируется набор строки
ls -l *.c ../*.c
в оболочке:
glob_t globbuf; globbuf.gl_offs = 2; glob("*.c", GLOB_DOOFFS, NULL, &globbuf); glob("../*.c", GLOB_DOOFFS | GLOB_APPEND, NULL, &globbuf); globbuf.gl_pathv[0] = "ls"; globbuf.gl_pathv[1] = "-l"; execvp("ls", &globbuf.gl_pathv[0]);
ls(1), sh(1), stat(2), exec(3), fnmatch(3), malloc(3), opendir(3), readdir(3), wordexp(3), glob(7)
2019-03-06 | GNU |