Найти пути, соответствующие шаблону
#include <glob.h>int glob( const char *pattern,int flags,int (*errfunc)( const char *epath,int error ),glob_t *pglob );
Необходимо создать структуру glob_t перед вызовом glob(). Функция glob() выделяет необходимые ресурсы для массива gl_pathv. Используйте globfree() для освобождения этих ресурсов.
libc
Функция glob() находит пути, соответствующие заданному шаблону.
Чтобы иметь доступ к пути, glob() должен иметь разрешение на поиск для каждого компонента пути, кроме последнего, и разрешение на чтение для каждого каталога каждого компонента имени файла шаблона, который содержит любой из специальных символов (*, ?, [ и ]).
Аргумент errfunc - это указатель на функцию-обработчик ошибок с прототипом:
int errfunc( const char *epath, int error );
Функция errfunc вызывается, когда glob() встречает каталог, который он не может открыть или прочитать. Аргументы функции:
Функция errfunc должна возвращать 0, если функция glob() должна продолжаться, или ненулевое значение, если функция glob() должна прекратить поиск.
Вы можете установить для errfunc значение NULL, чтобы игнорировать эти типы ошибок.
Аргумент flags может иметь любую комбинацию следующих битов:
NULL указателей нужно добавить в начало pglob->pathv. После вызова glob() pglob->pathv будет содержать NULL указатели pglob->gl_offs, за которыми следуют пути pglob->gl_pathc, за которыми следует NULL указатель. Это может быть полезно, если вы создаете команду, которая будет применяться к совпадающим файлам. Следующие флаги являются расширениями BSD:
GLOB_NOCHECK без магических символов (csh). ARG_MAX. 0 в случае успешного завершения, или код ошибки.
GLOB_ERR или функция errfunc вернула ненулевое значение. GLOB_NOCHECK не был установлен в flags. Простой пример для поиска всех файлов с расширением .c в текущей директории и вывода их в том порядке, в котором их нашла файловая система.
#include <unistd.h>#include <stdio.h>#include <glob.h>int main( void ){glob_t paths;int retval;paths.gl_pathc = 0;paths.gl_pathv = NULL;paths.gl_offs = 0;retval = glob( "*.c", GLOB_NOCHECK | GLOB_NOSORT, NULL, &paths );if( retval == 0 ){int idx;for ( idx = 0; idx < paths.gl_pathc; idx++ ){printf( "[%d]: %s\n", idx, paths.gl_pathv[idx] );}globfree( &paths );} else {puts( "glob() failed" );}return (0);}
POSIX 1003.1
Не изменйяте значения в pglob между вызовами glob() и globfree().
glob_t, globfree(), wordexp(), wordfree()
Предыдущий раздел: Описание API системной библиотеки