GLOB(3)

명칭
glob, globfree

프로그램 라이브러리
libc - 패턴에 적합하는 패스명을 생성

서식
#include <glob.h> int glob(const char *pattern, int flags, int (*errfunc)(const char *, int), glob_t *pglob) void globfree(glob_t *pglob)

해설
glob() 함수는, 쉘에 의해 사용되는 파일명 패턴의, 적합 규칙을 실장하는 패스명 제네레이터입니다.

인클루드 파일 glob.h (은)는, 적어도 다음에 나타내는 필드가 포함된다 구조체 타입 glob_t (을)를 정의합니다.

    typedef struct {
            int gl_pathc;           /* 지금까지의 합계 패스 카운트 */
            int gl_matchc;          /* 패턴에 적합하는 패스 카운트 */
            int gl_offs;            /* gl_pathv의 최초로 예약되는 필드 */
            int gl_flags;           /* 돌려주어지는 플래그 */
            char **gl_pathv;        /* 패턴에 적합하는 패스의 리스트 */
    } glob_t;

인수 pattern (은)는 전개하는 패스명 패턴의 포인터입니다. glob() 인수는 그 패턴에 대해서, 액세스 가능한 모든 패스명을 맞대고 (매칭), 적합하는 패스명 리스트를 작성합니다. 패스명에 액세스 하기 위한(해) glob() (은)는, 패스 의 각 원가요소 (최종 요소를 제외하다) 에서의 검색 허가와 특수 캐릭터 ‘*’, ‘?’ 또는 ‘[’ 등을 포함한다 pattern 의, 모든 파일명 원가요소 디렉토리의 읽기 포함 허가를 요구합니다.

glob() 인수는, 적합 패스명의 수를 gl_pathc 필드에, 패스명 포인터 리스트 의 포인터를 gl_pathv 필드에 각각 보존합니다. 최종 패스명의 뒤의 최초의 포인터는 NULL 입니다. 패턴에 적합하는 패스명이 전무였던 경우, 돌려주어지는 적합 패스의 수는 0 으로 설정됩니다.

pglob 그리고 나타나는 구조체는 호출해 원이 작성합니다. gl_pathv 그리고 나타나는 메모리 등 다른 공간은, glob() 함수가 필요에 따라서 할당합니다.

인수 flags (은)는, glob() 의 거동을 변경하기 위해서 사용합니다. flags 의 값은, glob.h 그리고 정의되고 있는 다음에 나타내는 값의 각각 비트마다의 포괄적 OR 입니다.

GLOB_APPEND
    생성된 패스명을, glob() 에 대하기 전의 호출 (단수 또는 복수)로 생성된 패스명에 추가합니다. gl_pathc 의 값은, 이번 호출 및 전의 호출 (단수 또는 복수)에서의, 적합 패스명의 합계가 됩니다. 전의 호출 (단수 또는 복수)에 의해 돌려주어진 패스명에, 이번 생성된 패스명이 추가됩니다만, merge (병합)는 되지 않습니다. 전의 호출과 이번 호출동안에, 호출원래는 GLOB_DOOFFS 플래그를 바꾸어서는 안됩니다. 같이 GLOB_DOOFFS 설정시의 gl_offs 의 값도 바꾸어서는 안됩니다. (물론) pglob 에 영향을 준다 globfree() 의 호출도 가 되지 않습니다.

GLOB_DOOFFS
    gl_offs 필드를 유효하게 합니다. 이 플래그를 설정하면(자), gl_pathv 필드의 앞에 부가한다 NULL 포인터의 수가, gl_offs 에 의해 지정할 수 있습니다. 바꾸어 말하면 gl_pathv 하지만 gl_offs 의 NULL 포인터를 나타내, 그 후에 gl_pathc 패스명 포인터가 계속되어, 한층 더 그 후에 NULL 포인터가 계속됩니다.

GLOB_ERR
    오픈 또는 읽을 수 없는 디렉토리를 만났을 경우, glob() (을)를 리턴 시킵니다. 통상은, glob() 하지만 적합 패스명 검색을 속행합니다.

GLOB_MARK
    pattern 에 적합하는 디렉토리의 각 패스명에, slash를 부가합니다.

GLOB_NOCHECK
    pattern 에 적합하는 패스명이 전무였던 경우, glob() 하 pattern 만으로 구성되는 리스트를 돌려줍니다. 패스명의 합계수는 1 에, 적합 패스명의 수는 0 으로 설정됩니다. GLOB_QUOTE 하지만 설정되어 있으면, 돌려주어지는 패턴에 그 효과가 반영됩니다.

GLOB_NOSORT
    디폴트로 패스명은 ASCII 승순에 정렬 됩니다. 이 플래그는 그러한 소트, 즉 고속화 glob() 기능을 방해합니다.

다음에 나타내는 값도 flags 에 포함되는 것은 있습니다만, 이것들은 p1003.2 의 비표준 확장입니다.

GLOB_ALTDIRFUNC
    pglob 구조체의 다음에 나타내는 추가 필드를, 디렉토리의 오픈, 읽어들여, 클로우즈 및, 그것들 디렉토리에서 발견된 패스명의 스테이터스 정보 취득에 사용하는, 대체 glob 함수로 초기화합니다.

        void *(*gl_opendir)(const char * name);
        struct dirent *(*gl_readdir)(void *);
        void (*gl_closedir)(void *);
        int (*gl_lstat)(const char *name, struct stat *st);
        int (*gl_stat)(const char *name, struct stat *st);

    테이프에 보존된 디렉토리로부터, restore(8) (와)과 같은 프로그램에 의해 그롭빙 (파일명 전개) 할 수 있도록(듯이), 이 확장이 준비되어 있습니다.

GLOB_BRACE
    csh(1) (와)과 같은 ‘{pat, pat,...}’ string를 전개하기 위해서, 패턴 string를 사전 처리 합니다. 패턴 ‘{}’ (은)는 역사적 이유 ( 및 find(1) 패턴의 입력을 용이하게 하기 위해서, csh(1) 하지만 같은 것을 한다고 하는 이유) (으)로부터, 미전개인 채 남겨집니다.

GLOB_MAGCHAR
    패턴에 glob() 용캐릭터가 포함되어 있으면(자), glob() 함수에 의해 이 플래그가 설정됩니다. 자세한 것은 gl_matchc 구조체 멤버의, 용법에 대한 설명을 참조해 주세요.

GLOB_NOMAGIC
    GLOB_NOCHECK (와)과 같습니다만, 특수 캐릭터 ``*'', ``? '' 또는 ``[''가 아무것도 포함되지 않은 경우에, 이 플래그는 다만 pattern (을)를 후에 부가할 뿐입니다. GLOB_NOMAGIC (은)는, 역사적인 csh(1) 에 의한 그롭빙 (파일명 전개) 거동의 실장을 단순화 하기 위해서 준비되어 있습니다. 그 외의 목적에서는 아마, 어떤 경우도 사용해야 하지는 않습니다.

GLOB_QUOTE
    backslash (‘\’) 캐릭터를 인용부호로서 유효하게 합니다. 패턴에 backslash와 거기에 계속되는 캐릭터가 있는 경우, 그 캐릭터를 특별히 해석하는 일 없이 그대로의 캐릭터로서 치환합니다.

GLOB_TILDE
    ‘~’ 그리고 시작되는 패턴을, 유저명의 홈 디렉토리에 전개합니다.

GLOB_LIMIT
    돌려주어지는 패스명의 합계수를, gl_matchc 그리고 지정되는 수에 제한합니다 (디폴트는 ARG_MAX) 입니다. 매우 큰 수의 매치에 전개된다 ‘*/../*/..’ (와)과 같이 긴 string의 패턴에 의해, 서비스 거부 공격에 무리하게 되어 버릴 수 있는 프로그램에 대해, 본옵션을 설정해야 합니다.

검색에 대해 오픈 또는 읽을 수 없는 디렉토리를 만났을 경우, errfunc 하지만 NULL (이)가 아니면, glob() 하 (*errfunc)(path, errno) (을)를 호출합니다. 이것은 비직관적인 경우가 있습니다. ‘*/Makefile’ (와)과 같은 패턴에서는, ‘foo’ 하지만 디 렉토가 아니어도 ‘foo/Makefile’ 의 stat(2) 하지만 시도되어, errfunc (을)를 호출하는 결과가 되기 때문입니다. ENOENT 및 ENOTDIR 의 테스트에 의해, 에러 routine는 이 동작을 억제할 수가 있습니다만, 그런데도 더 이러한 경우에는 GLOB_ERR 플래그가 즉시 glob() (을)를 리턴 시킵니다.

errfunc (으)로부터 비 0 이 돌아가면(자) glob() (은)는 조작을 정지해, 벌써 적합한 모든 패스를 반영하기 위해서, gl_pathc 및 gl_pathv (을)를 설정한 다음에 GLOB_ABEND (을)를 돌려줍니다. 에러가 일어나 flags 에 GLOB_ERR 하지만 설정되어 있으면, errfunc (을)를 호출했을 경우 그 반환값에 관계없이, 같은 것이 일어납니다. GLOB_ERR (을)를 미설정으로, errfunc 하지만 NULL 가마타는 errfunc 하지만 0 을 돌려주었을 경우, 에러는 무시됩니다.

globfree() 함수는, 전의 glob() 호출에 의해 pglob (와)과 관련한, 모든 공간을 해방합니다.

반환값
무사하게 완료했을 경우 glob() (은)는 0 을 돌려줍니다. 게다가 pglob 의 각 필드 에는 다음에 나타내는 값이 포함됩니다.

gl_pathc
    지금까지의 적합 패스명의 합계수가 포함됩니다. GLOB_APPEND 하지만 지정되어 있는 경우는, 전의 glob() 기동으로 얻을 수 있던 것 외의 적합 패스명의 수도, 이 합계에는 함.

gl_matchc
    현재의 glob() 기동에 의해 얻을 수 있던 적합 패스명의 수가 포함됩니다.

gl_flags
    pattern 에 특수 캐릭터 ``*'', ``? '', 또는 ``[''의 어떤 것인가가 포함되어 있는 경우는, GLOB_MAGCHAR 하지만 설정한 비트를 가진다 flags 파라미터의 카피가 포함됩니다. 특수 캐릭터가 포함되지 않은 경우, 이 필드의 내용은 클리어 됩니다.

gl_pathv
    적합 패스명의 NULL 그리고 끝나는 리스트의 포인터가 포함됩니다. 다만, 만약 gl_pathc 하지만 0 이라면, gl_pathv 의 내용은 정의되지 않습니다.

에러이기 때문에 종료하면(자) glob() 하 errno (을)를 설정해, 다음에 나타내는 비 0 정수의 1 개(살)을 돌려줍니다. 이러한 정수는, 인클루드 파일 <glob.h> 그리고 정의됩니다.

GLOB_NOSPACE
    메모리 할당의 시도가 실패했습니다. 혹은 errno 하지만 0 의 경우, GLOB_LIMIT 하지만 flags 로 지정되어 pglob->gl_matchc 개 또는 그 이상의 패턴이 매치 했습니다.

GLOB_ABEND
    에러가 발생한 후에 GLOB_ERR 하지만 설정되어 있었는지, 또는 *errfunc 하지만 비 0 을 돌려주었으므로, glob() (은)는 패스명의 주사를 정지했습니다.

인수 pglob->gl_pathc 및 pglob->gl_pathv (은)는 여전히, 위에서 지정대로 설정된대로 입니다.

예
‘ls -l *. c *.h’ 의 대개의 등가는, 다음에 나타내는 코드로 취득할 수가 있습니다.

    glob_t g;
    g.gl_offs = 2;
    glob("*.c", GLOB_DOOFFS, NULL, &g);
    glob("*.h", GLOB_DOOFFS | GLOB_APPEND, NULL, &g);
    g.gl_pathv[0] = "ls";
    g.gl_pathv[1] = "-l";
    execvp("ls", g.gl_pathv);

관련 항목
sh(1), fnmatch(3), regexp(3)

표준
glob() 함수에는 다음에 나타내는 예외를 제외해, p1003.2 (와)과의 호환성이 기대되고 있습니다. 예외는 플래그 GLOB_ALTDIRFUNC, GLOB_BRACE, GLOB_LIMIT, GLOB_MAGCHAR, GLOB_NOMAGIC, GLOB_QUOTE, GLOB_TILDE 거기에 필드 gl_matchc 및 gl_flags 등을, 엄정한 POSIX 적합을 싸우는 어플리케이션에서는 사용해서는 안된다고 하는 것입니다.

역사
glob() 및 globfree() 함수는, 4.4BSD 그리고 처음 등장했습니다.

버그
MAXPATHLEN 보다 긴 패턴은, 무검사 에러의 원인이 될 가능성이 있습니다.

glob() 인수는 실패해, 프로그램 라이브러리 routine stat(2), closedir(3), opendir(3), readdir(3), malloc(3), 및 free(3) 용으로 지정한 에러의 어떤 것인가에, errno 를 설정하는 일이 있습니다.