glob サブルーチン

目的

パス名を生成します。

ライブラリー

標準 C ライブラリー (libc.a)

構文

#include <glob.h>
int glob (PatternFlags, (Errfunc)(), Pglob)
const char  *Pattern;
int  Flags;
int  *Errfunc (EpathEerrno)
const char  *Epath;
int  Eerrno;
glob_t  *Pglob;

説明

glob サブルーチンは、 Pattern パラメーターと一致するアクセス可能ファイルのリストを構成します。

glob サブルーチンは、このパターンに対してアクセス可能なすべてのパス名を突き合わせ、一致するすべてのパス名のリストを作成します。 パス名にアクセスするには、 glob サブルーチンは、最後のコンポーネントを除くパスのすべてのコンポーネントに対する検索許可と、特殊文字 * (アスタリスク)、? を含む Pattern パラメーターのファイル名コンポーネントの各ディレクトリーに対する読み取り許可を必要とします。 (疑問符)、または [(左大括弧)。 glob サブルーチンは、一致したパス名の数と、パス名を指すポインターのリストを指すポインターを Pglob パラメーターに保管します。 パス名は、現行ロケールの LC_COLLATE カテゴリーの設定に基づいて、ソート順になります。 最後のパス名の後の最初のポインターはヌル文字です。 パターンがどのパス名にも一致しない場合、返される一致パスの数はゼロです。

パラメーター

pattern
アクセス可能なパス名と比較するファイル名パターンが入っています。
flags
glob サブルーチンのカスタマイズ可能な動作を制御します。

Flags パラメーターは、 glob サブルーチンの動作を制御します。 Flags 値は、 glob.h ファイルに定義されている、以下の定数のビット単位の包含 OR です。

GLOB_APPEND
この呼び出しで検出されたパス名を、以前に検出されたパス名に付加します。 GLOB_APPEND 定数が設定されていない場合、新しいパス名は Pglob 配列内の以前の項目を上書きします。 GLOB_APPEND 定数は、 glob サブルーチンへの最初の呼び出しでは設定しないでください。 ただし、後続の呼び出しで設定することはできます。

GLOB_APPEND フラグは、 glob サブルーチンへの直前の呼び出しで検出されたパス名に、新しいパス名のセットを追加するために使用できます。 GLOB_APPEND フラグが Flags パラメーターに指定されている場合、以下の規則が適用されます。

  • アプリケーションが glob サブルーチンへの最初の呼び出しで GLOB_DOOFFS フラグを設定すると、2 番目の呼び出しでも設定されます。 Pglob パラメーターの値は、呼び出し間で変更されません。
  • アプリケーションが glob サブルーチンへの最初の呼び出しで GLOB_DOOFFS フラグを設定しなかった場合、2 番目のサブルーチンでは設定されません。
  • 2 回目の呼び出しの後、 Pglob パラメーターは、以下を含むリストを指します。
    • GLOB_DOOFFS フラグで指定されている、ゼロ個以上のヌル文字。
    • glob サブルーチンへの最初の呼び出しの後と同じ順序で、呼び出しの前に Pglob リスト内にあったパス名を指すポインター。
    • 2 番目の呼び出しによって生成された新しいパス名へのポインター (指定された順序で)。
  • Pglob パラメーターで返されるカウントは、2 つの呼び出しからのパス名の総数です。
  • アプリケーションは、2 つの呼び出しの間で Pglob パラメーターを変更してはなりません。

Pglob パラメーターが指す構造体を作成するのは、呼び出し側の責任です。 glob サブルーチンは、必要に応じて他のスペースを割り振ります。

GLOB_DOOFFS
gl_カーブ 構造を使用して、 Pglob パラメーターの gl_pathv コンポーネントの先頭に追加する NULL ポインターの数を指定します。
GLOB_ERR
glob サブルーチンが、オープンまたは読み取りができないディレクトリーを検出したときに戻るようにします。 GLOB_ERR フラグが設定されていない場合、 glob サブルーチンは、オープンまたは読み取りができないディレクトリーを検出すると、引き続き一致を検出します。
GLOB_MARK
ディレクトリーである各パス名には, 次のものがなければならないことを指定します。/(スラッシュ) が付加されます。
GLOB_NOCHECK
Pattern パラメーターがどのパス名にも一致しない場合、 glob サブルーチンは Pattern パラメーターのみで構成されるリストを返します。マッチング・パターンの数は 1 です。
GLOB_NOSORT
パス名のリストをソートする必要がないことを指定します。 GLOB_NOSORT フラグが設定されていない場合、パス名は現行ロケールに従って照合されます。
グローバル引用 (GLOB_QUOTE)
GLOB_QUOTE フラグが設定されている場合、\(円記号) は、メタキャラクターをエスケープするために使用できます。
 
Errfunc (関数)
glob サブルーチンがエラー条件を検出したときに呼び出されるオプション・サブルーチン (指定されている場合) を指定します。
Pglob (Pglob)
glob_t 構造体へのポインターを含みます。 構造体は呼び出し側によって割り振られます。 Pattern パラメーターと一致するファイル名を含む構造体の配列は、 glob サブルーチンによって定義されます。 最後の項目がヌル・ポインターです。
Epath (Epath)
ディレクトリーをオープンまたは読み取ることができなかったために失敗したパスを指定します。
Eerrno (Eerrno)
Epath パラメーターによって示される障害の errno 値を指定します。 この値は、 opendirreaddir、または stat サブルーチンによって設定されます。

戻り値

正常終了すると、 glob サブルーチンは値 0 を戻します。 Pglob パラメーターは、一致したパス名の数と、一致およびソートされたパス名のヌル終了リストへのポインターを返します。 Pglob パラメーター内の一致するパス名の数がゼロの場合、 Pglob パラメーター内のポインターは未定義です。

エラー・コード

glob サブルーチンがエラーのために終了した場合は、以下のゼロ以外の定数の 1 つを戻します。 これらは、 glob.h ファイルで定義されます。 この場合、 Pglob 値は、引き続き「戻り値 (Return Values)」セクションの定義に従って設定されます。

項目 説明
GLOB_ABORTED GLOB_ERROR フラグが設定されたか、または errfunc パラメーターによって指定されたサブルーチンがゼロ以外の値を戻したために、スキャンが停止したことを示します。
GLOB_NOSPACE メモリーを割り振ろうとして失敗したことを示します。

検索中に、開くことも読み取ることもできないディレクトリーが検出され、 Errfunc パラメーターが NULL 値でない場合、 glob サブルーチンは、以下の 2 つの引数を使用して errfunc パラメーターによって指定されたサブルーチンを呼び出します。

  • Epath パラメーターは、失敗したパスを指定します。
  • Eerrno パラメーターは、障害からの errno グローバル変数の値を指定します。これは、 opendirreaddirによって設定されます。 または stat サブルーチン。

Errfunc パラメーターによって指定されたサブルーチンが呼び出されてゼロ以外を戻した場合、または GLOB_ERR フラグが Flags パラメーターに設定されている場合は、 glob サブルーチンはスキャンを停止し、既にスキャンされたパスを反映するように Pglob パラメーターを設定した後、 GLOB_ABORTED を返します。 GLOB_ERR が設定されておらず、 Errfunc パラメーターが NULL または*errfuncゼロが戻されます。エラーは無視されます。

Pglob パラメーターは、 glob サブルーチンが失敗しても意味を持ちます。 したがって、 glob サブルーチンは、エラーが発生した場合に部分的な結果を報告することができます。 ただし、一致したパス名の数が 0 の場合は、 glob サブルーチンがエラーを戻さなかった場合でも、 Pglob パラメーター内のポインターは指定されていない。

GLOB_NOCHECK フラグをアプリケーションで使用すると、ワイルドカード文字を使用して任意のパス名を拡張することができます。 ただし、 GLOB_NOCHECK フラグは、デフォルトではパターンを単なるストリングとして扱います。 sh コマンドは、例えば、オプション・パラメーターにこの機能を使用できます。

GLOB_DOOFFS フラグは、 execvexecve、または execvp サブルーチンで使用する引数リストを作成するアプリケーションで使用できます。 例えば、アプリケーションは、以下と同等のことを行う必要があります。ls -l *.cしかし、何らかの理由でできません。 アプリケーションは、以下のシーケンスを使用して、ほぼ同じ結果を得ることができます。

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

同じ例を使用すると、ls -l *.c *.h次のように GLOB_APPEND フラグを使用して近似することができます。

globbuf.gl_offs = 2;
glob ("*.c", GLOB_DOOFFS, NULL, &globbuf);
glob ("*.h", GLOB_DOOFFS|GLOB_APPEND, NULL, &globbuf);

GLOB_APPEND フラグが設定された後続の呼び出しによって生成される新しいパス名は、前のパス名と一緒にソートされません。 これは、コマンド・ラインで複数の拡張を行う場合に、シェルがパス名の拡張を処理するのと同じ方法です。