GLOB - Linux手册页

时间:2019-08-20 18:00:34  来源:igfitidea点击:

Linux程序员手册 第3部分
更新日期: 2020-06-09

名称

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()函数根据外壳使用的规则搜索所有与模式匹配的路径名(请参阅glob(7))。没有波浪号扩展或参数替换;如果需要这些,请使用wordexp(3)。

globfree()函数将动态分配的存储从先前对glob()的调用中释放出来。

glob()调用的结果存储在pglob指向的结构中。此结构的类型为glob_t(在中声明),包括POSIX.2定义的以下元素(可能会作为扩展出现):

typedef struct {
    size_t   gl_pathc;    /* Count of paths matched so far  */
    char   **gl_pathv;    /* List of matched pathnames.  */
    size_t   gl_offs;     /* Slots to reserve in gl_pathv.  */
} glob_t;

结果存储在动态分配的存储中。

参数标志由零个或多个以下符号常量的按位"或"组成,这些符号常量修改了glob()的行为:

GLOB_ERR
返回读取错误(例如,因为目录没有读取权限)。默认情况下,尽管有错误,但glob()尝试会继续进行,并读取它可以读取的所有目录。
GLOB_MARK
在与目录相对应的每个路径后添加斜杠。
GLOB_NOSORT
不要对返回的路径名进行排序。这样做的唯一原因是节省处理时间。默认情况下,对返回的路径名进行排序。
GLOB_DOOFFS
在pglob->pathv中的字符串列表的开头保留pglob->gl_offs插槽。保留的插槽包含空指针。
GLOB_NOCHECK
如果没有任何模式匹配,则返回原始模式。默认情况下,如果没有匹配项,则glob()返回GLOB_NOMATCH。
GLOB_APPEND
将此调用的结果追加到先前对glob()调用返回的结果向量。不要在第一次调用glob()时设置此标志。
GLOB_NOESCAPE
不允许将反斜杠(aq \ aq)用作转义字符。通常,反斜杠可用于引用以下字符,从而提供一种关闭特殊含义元字符的机制。

标志也可能包含以下任何内容,它们是GNU扩展,未由POSIX.2定义:

GLOB_PERIOD
允许前置字符与元字符匹配。默认情况下,元字符不能匹配前置时间。
GLOB_ALTDIRFUNC
使用替代函数pglob->gl_closedir,pglob->gl_readdir,pglob->gl_opendir,pglob->gl_lstat和pglob->gl_stat来代替文件库访问。
GLOB_BRACE
展开格式为{a,b}的csh(1)样式括号表达式。括号表达式可以嵌套。因此,例如,指定模式" {foo / {,cat,dog},bar}"将返回与使用以下字符串的四个单独的glob()调用相同的结果:" foo /"," foo / cat"," foo / dog"和" bar"。
GLOB_NOMAGIC
如果模式不包含元字符,则即使没有使用该名称的文件,也应将其作为唯一的匹配词返回。
GLOB_TILDE
进行代字扩展。如果波浪号(aqtiaq)是模式中的唯一字符,或者初始波浪号后紧跟一个斜杠(aq / aq),则将调用方的主目录替换为波浪号。如果初始波浪号后跟用户名(例如," tiandrea / bin"),则波浪线和用户名将被该用户的主目录替换。如果用户名无效,或者无法确定主目录,则不执行替换。
GLOB_TILDE_CHECK
这提供了类似于GLOB_TILDE的行为。区别在于,如果用户名无效或无法确定主目录,则glob()而不是使用模式本身作为名称,而是返回GLOB_NOMATCH来指示错误。
GLOB_ONLYDIR
这暗示glob()调用方仅对与模式匹配的目录感兴趣。如果实现可以轻松确定文件类型信息,则不会将非目录文件返回给调用方。但是,调用方仍必须检查返回的文件是否为目录。 (当调用者仅对目录感兴趣时,此标志的目的仅仅是优化性能。)

如果errfunc不为NULL,则在参数epath(指向失败路径的指针)和eerrno(从对opendir(3),readdir( 3)或stat(2)。如果errfunc返回非零值,或者设置了GLOB_ERR,则在调用errfunc之后glob()将终止。

成功返回后,pglob-> gl_pathc包含匹配的路径名的数量,pglob-> gl_pathv包含指向匹配的路径名的指针列表的指针。指针列表以空指针终止。

可以多次调用glob()。在这种情况下,必须在第二次及以后的调用中的标志中设置GLOB_APPEND标志。

作为GNU扩展,将pglob-> gl_flags设置为指定的标志,如果找到任何元字符,则将其与GLOB_MAGCHAR一起使用。

返回值

成功完成后,glob()返回零。其他可能的回报是:

GLOB_NOSPACE
为了耗尽内存,
GLOB_ABORTED
对于读取错误,以及
GLOB_NOMATCH
未找到匹配项。

属性

有关本节中使用的术语的说明,请参见attribute(7)。

InterfaceAttributeValue
glob()Thread safetyMT-Unsafe race:utent env
sig:ALRM timer locale
globfree()Thread safetyMT-Safe

在上表中,race:utent中的utent表示如果在程序的不同线程中并行使用setutent(3),getutent(3)或endutent(3)中的任何功能,则可能发生数据争用。 glob()调用这些函数,因此我们使用race:utent来提醒用户。

遵循规范

POSIX.1-2001,POSIX.1-2008,POSIX.2

备注

结构元素gl_pathc和gl_offs在glibc 2.1中声明为size_t,因为它们应根据POSIX.2进行声明,但在glibc 2.0中声明为int。

BUGS

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)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/