e-knigi.com
Электронные книги онлайн » Компьютеры и Интернет » Программирование » Linux программирование в примерах - Роббинс Арнольд

Linux программирование в примерах - Роббинс Арнольд

На этом ресурсе Вы можете бесплатно читать книгу онлайн Linux программирование в примерах - Роббинс Арнольд. Жанр: Программирование . На сайте e-Knigi.com Вы можете онлайн читать полную версию книги без регистрации и sms. Так же Вы можете ознакомится с содержанием, описанием, предисловием о произведении
Перейти на страницу:

glob()
может быть вызвана более одного раза: при первом вызове флаг
GLOB_APPEND
не должен быть указан, при всех последующих вызовах он должен быть указан. Вы не можете между вызовами изменять
gl_offs
, а если вы изменили какие-нибудь значения в
gl_pathv
или
gl_pathc
, нужно их восстановить перед последующим вызовом
glob()
.

Возможность многократного вызова

glob()
позволяет накапливать результаты в одном списке. Это довольно практично, приближается к мощным возможностям раскрывания групповых символов оболочки, но на уровне языка программирования С.

glob()
возвращает 0, если не было проблем, или одно из значений из табл. 12.4, если были.

Таблица 12.4. Возвращаемые

glob()
значения

Флаг Значение
GLOB_ABORTED
Просмотр остановлен раньше времени, поскольку был установлен
GLOB_ERR
или функция
(*errfunc)()
возвратила ненулевой результат
GLOB_NOMATCH
Ни одно имя файла не соответствовало
pattern
, а флаг
GLOB_NOCHECK
не был установлен
GLOB_NOSPACE
Была проблема с выделением динамической памяти

globfree()
освобождает всю память, которую динамически выделила
glob()
Следующая программа,
ch12-glob.с
, демонстрирует
glob()
:

1  /* ch12-glob.c --- демонстрирует glob(). */

2

3  #include <stdio.h>

4  #include <errno.h>

5  #include <glob.h>

6

7  char *myname;

8

9  /* globerr --- выводит сообщение об ошибке для glob() */

10

11 int globerr(const char *path, int eerrno)

12 {

13  fprintf(stderr, "%s: %s: %sn", myname, path, strerror(eerrno));

14  return 0; /* let glob() keep going */

15 }

16

17 /* main() --- раскрывает символы подстановки в командной строке и выводит результаты */

18

19 int main(int argc, char **argv)

20 {

21  int i;

22  int flags = 0;

23  glob_t results;

24  int ret;

25

26  if (argc == 1) {

27   fprintf(stderr, "usage: %s wildcard ...n", argv[0]);

28   exit(1);

29  }

30

31  myname = argv[0]; /* для globerr() */

32

33  for (i = 1; i < argc; i++) {

34   flags |= (i > 1 ? GLOB_APPEND : 0);

35   ret = glob(argv[i], flags, globerr, &results);

36   if (ret != 0) {

37    fprintf(stderr, "%s: problem with %s (%s),

38     stopping earlyn", myname, argv[i],

39     /* опасно: */ (ret == GLOB_ABORTED ? "filesystem problem" :

40     ret == GLOB_NOMATCH ? "no match of pattern" :

41     ret == GLOB_NOSPACE ? "no dynamic memory" :

42     "unknown problem"));

43    break;

44   }

45  }

46

47  for (i = 0; i < results.gl_pathc; i++)

48   printf("%sn", results.gl_pathv[i]);

49

50  globfree(&results);

51  return 0;

52 }

Строка 7 определяет

myname
, которая указывает на имя программы; эта переменная для сообщений об ошибках от
globerr()
, определенной в строках 11–15.

Строки 33–45 являются основой программы. Они перебирают в цикле шаблоны, приведенные в командной строке, вызывая для каждого

glob()
для добавления к списку результатов. Большую часть цикла составляет обработка ошибок (строки 36–44). Строки 47–48 выводят результирующий список, а строки 50–51 проводят завершающую очистку и возвращаются.

Строки 39–41 не являются хорошими; нужно было использовать отдельную функцию, преобразующую целые константы в строки; мы сделали это главным образом ради экономии места. Код наподобие этого может быть сносным для небольших программ, но более крупные должны использовать функцию.

Если вы подумаете о работе, происходящей под капотом (открытие и чтение каталогов, сопоставление шаблонов, динамическое выделение памяти для увеличения списка, сортировка списка), можете качать ценить, как много для вас делает

glob()
! Вот некоторые результаты:

$ <b>ch12-glob '/usr/lib/x*.so' '../../*.texi'</b>

/usr/lib/xchat-autob5.so

/usr/lib/xchat-autogb.so

../../00-preface.texi

../../01-intro.texi

../../02-cmdline.texi

Перейти на страницу:

Роббинс Арнольд читать все книги автора по порядку

Роббинс Арнольд - на сайте онлайн книг e-Knigi.com Вы можете читать полные версии книг автора в одном месте.


Linux программирование в примерах отзывы

Отзывы читателей о книге Linux программирование в примерах, автор: Роббинс Арнольд. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администрация сайта e-Knigi.com


Прокомментировать
Подтвердите что вы не робот:*