Троан Эрик В.
Шрифт:
Прототип этой функции показан ниже.
int globerr(const char * pathname, int globerrno);
Функции передается путевое имя, вызвавшее ошибку, и значение
errno
, возвращенное одним из системных вызовов opendir
, readdir
или stat
. Если функция ошибки возвращает величину больше нуля, glob
возвращается с ошибкой. В противном случае операция универсализации продолжается. Результаты универсализации хранятся в структуре
glob_t
, на которую ссылается pglob
. Она включает описанные ниже элементы, позволяющие абоненту найти согласованные имена файлов. gl_pathc | Количество путевых имен, соответствующих шаблону. |
gl_pathv | Массив путевых имен, соответствующих шаблону. |
После использования возвращенного результата
glob_t
занимаемую им память следует освободить, передав его в globfree
. void globfree(glob_t * pglob);
Системный вызов
glob
возвращает GLOB_NOSPACE
в случае нехватки памяти, GLOB_ABEND
, если ошибка чтения привела к неудачному выполнению функции, GLOB_NOMATCH
, если соответствия не были найдены, или 0
, если функция выполнилась удачно и нашла соответствия. Для иллюстрации работы
glob
ниже приведена программа globit
, которая принимает множество шаблонов в качестве аргументов, универсализирует их и отображает результат. В случае ошибки отображается сообщение, описывающее ошибку, а операция универсализации продолжается. 1: /* globit.с */
2:
3: #include <errno.h>
4: #include <glob.h>
5: #include <stdio.h>
6: #include <string.h>
7: #include <unistd.h>
8:
9: /* Это функция ошибки, которая передается в glob. Она просто отображает
10: сообщение об ошибке и возвращает состояние успеха, что позволяет glob
11: продолжить работу. */
12: int errfn(const char * pathname, int theerr) {
13: fprintf(stderr, "ошибка при доступе к %s: %s\n", pathname,
14: strerror(theerr));
15:
16: /* Операция универсализации должна продолжаться, поэтому вернуть 0 */
17: return 0;
18: }
19:
20: int main(int argc, const char ** argv) {
21: glob_t result;
22: int i, rc, flags;
23:
24: if (argc < 2) {
25: printf("необходимо передать хотя бы один аргумент\n") ;
26: return 1;
27: }
28:
29: /* установить flags в 0; позже он будет изменен на GLOB_APPEND */
30: flags = 0;
31:
32: /* совершить проход по всем аргументам командной строки */
33: for (i = 1; i < argc; i++) {
34: rc = glob(argv[i], flags, errfn, &result);
35:
36: /* благодаря errfn, GLOB_ABEND не происходит */
37: if (rc == GLOB_NOSPACE) {
38: fprintf(stderr, "не хватает памяти для выполнения универсализации\n");
39: return 1;
40: }
41:
42: flags |= GLOB_APPEND;
43: }
44:
45: if (!result.gl_pathc) {
46: fprintf(stderr, "соответствий нет\n");
47: rc = 1;
48: } else {
49: for (i = 0; i < result.gl_pathc; i++)
50: puts(result.gl_pathv[i]);
51: rc = 0;
52: }
53:
54: /* структура glob_t занимает память из пула malloc,
55: которая должна быть освобождена */
56: globfree(&result);
57:
58: return rc;
59: }