Вход/Регистрация
Разработка приложений в среде Linux. Второе издание
вернуться

Троан Эрик В.

Шрифт:

Прототип этой функции показан ниже.

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: }

  • Читать дальше
  • 1
  • ...
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: