GLOB - Linux手册页
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)。
Interface | Attribute | Value |
glob() | Thread safety | MT-Unsafe race:utent env sig:ALRM timer locale |
globfree() | Thread safety | MT-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。
示例
一个使用示例是以下代码,该代码模拟了打字
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]);
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。