GLOB(3) FreeBSD ライブラリ関数マニュアル GLOB(3)
名称
glob, globfree |
ライブラリ
標準 C ライブラリ (libc, −lc) − パターンに適合するパス名を生成 |
書式
#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 の値 は、今回の呼び出しおよび前の呼び出し (単数または複数) で の、適合パス名の合計になります。前の呼び出し (単数または 複数) によって返されたパス名に、今回生成されたパス名が追 加されますが、マージ (併合) はされません。前の呼び出しと 今回の呼び出しのあいだに、呼び出し元は GLOB_DOOFFS フラ グを変えてはいけません。同様に、 GLOB_DOOFFS 設定時の gl_offs の値も変えてはいけません。 (もちろん) pglob に影 響する globfree() の呼び出しも行ってはなりません。 GLOB_DOOFFS GLOB_ERR GLOB_MARK GLOB_NOCHECK GLOB_NOSORT 次に示す値も flags に含まれることはありますが、これらは IEEE Std 1003.2 (‘‘POSIX.2’’) の非標準拡張です。 GLOB_ALTDIRFUNC void *(*gl_opendir)(const char * name); テープに保存されたディレクトリから、 restore(8) のような プログラムによってグロッビング (ファイル名展開) できるよ うに、この拡張が用意されています。 |
GLOB_BRACE
csh(1) のような ‘{pat,pat,...}’ ストリングを展開するため に、パターンストリングを前処理します。パターン ‘{}’ は歴 史的理由 (および find(1) パターンの入力を容易にするため に、 csh(1) が同じことをするという理由) から、未展開のま ま残されます。 GLOB_MAGCHAR GLOB_NOMAGIC GLOB_QUOTE GLOB_TILDE GLOB_LIMIT 検索においてオープンまたは読み込みできないディレクトリに出会った場合、 errfunc が NULL でなければ、 glob() は (*errfunc)(path, errno) を呼び出し ます。これは非直観的な場合があります。 ‘*/Makefile’ のようなパターンで は、 ‘foo’ がディレクトリでなくても ‘foo/Makefile’ の stat(2) が試みられ て、 errfunc を呼び出す結果になるからです。 ENOENT および ENOTDIR のテス トによって、エラールーチンはこの動作を抑制することができますが、それでも なおこうした場合には 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 gl_flags gl_pathv エラーのため終了すると glob() は errno を設定して、次に示す非 0 定数の 1 つを返します。これらの定数は、インクルードファイル 〈glob.h〉 で定義されま す。 GLOB_NOSPACE GLOB_ABEND 引数 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); |
関連項目
規格
glob() 関数には次に示す例外を除いて、 IEEE Std 1003.2 (‘‘POSIX.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() 引数は失敗して、ライブラリルーチン stat(2), closedir(3), opendir(3), readdir(3), malloc(3), および free(3) 用に指定したエラーのど れかに、errno を設定することがあります。 FreeBSD 10.0 April 16, 1994 FreeBSD 10.0 |