Чтение онлайн

на главную - закладки

Жанры

Linux программирование в примерах
Шрифт:

70 j = myrandom % 6; /* обеспечить диапазон 0 <= j <= 5 */

71 printf("+-------+\n");

72 for (k = 0; k < 3; k++)

73 printf("|%s|\n", die_faces[(j * 3) + k]);

74 printf("+-------+\n");

75 putchar('\n');

76 }

77

78 return 0;

79 }

Строки 35–47 предоставляют интерфейс вызова функции для

/dev/urandom
, читая каждый раз данные
unsigned long
.
Издержками является один дескриптор файла, который остается открытым в течение жизни программы.

12.7. Расширения метасимволов

Три набора функции возрастающей сложности предусматривают возможность сопоставления с шаблонами групповых символов оболочки. Многим программам нужны такие библиотечные функции. Одним примером является

find
: '
find .
– name '*.с' -print
'. Другим примером является опция
– -exclude
во многих программах, которая принимает шаблон файлов с групповыми символами для исключения из того или иного действия. В данном разделе по очереди рассматривается каждый набор функций.

12.7.1. Простое сопоставление с шаблоном:

fnmatch

Мы начинаем с функции

fnmatch
(«filename match» сопоставление имени файла»).

#include <fnmatch.h> /* POSIX */

int fnmatch(const char *pattern, const char *string, int flags);

Эта функция сопоставляет

string
с
pattern
, который является обычным шаблоном групповых символов оболочки. Значение флагов (которое вскоре будет описано) изменяет поведение функции. Возвращаемое значение равно 0, если
string
соответствует
pattern
,
FNM_NOMATCH
, если не соответствует, и ненулевое значение, если возникла ошибка. К сожалению, POSIX не определяет каких-либо специфических ошибок; соответственно, вы можете лишь сказать, что что-то пошло не так, но не можете сказать, что.

Переменная

flags
является побитовым ИЛИ одного или более флагов, перечисленных в табл. 12.1.

Таблица 12.1. Значения флагов для

fnmatch

Флаг Только GLIBC Значение
FNM_CASEFOLD
Сопоставление с учетом регистра
FNM_FILE_NAME
Синоним GNU для
FNM_PATHNAME
FNM_LEADING_DIR
Флаг для внутреннего использования GLIBC; не используйте его в своих программах. Подробности см. в fnmatch(3)
FNM_NOESCAPE
Обратный слеш является обычным символом, а не знаком перехода
FNM_PATHNAME
Слеш в
string
должен соответствовать слешу в
pattern
, он не может быть подставлен через
*
,
?
или '
[...]
'
FNM_PERIOD
Начальная
точка в
string
подходит, лишь если в
pattern
также есть начальная точка. Точка должна быть первым символом в
string
. Однако, если также установлен
FNM_PATHNAME
, точка, которая идет за слешем, также рассматривается как начальная

fnmatch
работает со строками из любого источника; сопоставляемые строки не обязательно должны быть действительными именами файлов. Хотя на практике
fnmatch
используется в коде, читающем каталог с помощью
readdir
(см раздел 5.3.1 «Базовое чтение каталогов»):

struct dirent dp;

DIR *dir;

char pattern[100];

/* ...заполнить шаблон, открыть каталог, проверить ошибки... */

while ((dp = readdir(dir)) != NULL) {

 if (fnmatch(pattern, dir->d_name, FNM_PERIOD) == 0)

/* имя файла соответствует шаблону */

 else

continue; /* не соответствует */

}

GNU

ls
использует
fnmatch
для реализации своей опции
– -ignore
. Вы можете предоставить несколько игнорируемых шаблонов (с помощью нескольких опций).
ls
сопоставляет каждое имя файла со всеми шаблонами. Она делает это с помощью функции
file_interesting
в
ls.с
:

2269 /* Возвращает не ноль, если файл в 'next' должен быть перечислен. */

2270

2271 static int

2272 file_interesting(const struct dirent *next)

2273 {

2274 register struct ignore_pattern* ignore;

2275

2276 for (ignore = ignore_patterns; ignore; ignore = ignore->next)

2277 if (fnmatch(ignore->pattern, next->d_name, FNM_PERIOD) == 0)

2278 return 0;

2279

2280 if (really_all_files

2281 || next->d_name[0] !=

2282 || (all_files

2283 && next->d_name[1] != '\0 '

2284 && (next->d_name[1] || next->d_name[2] != '\0')))

2285 return 1;

2286

2287 return 0;

2288 }

Цикл в строках 2276–2278 сопоставляет имя файла со списком шаблонов для игнорируемых файлов. Если один из шаблонов подходит, файл не интересен и

file_interesting
возвращает false (то есть 0).

Переменная

all_files
соответствует опции
– А
, которая показывает файлы, имена которых начинаются с точки, но не являются '
.
' и '
..
'. Переменная
really_all_files
соответствует опции
– а
, которая предполагает
– А
, а также показывает '
.
' и '
..
'. При наличии таких сведений, условие в строках 228–2284 может быть представлено следующим псевдокодом:

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

Камень

Минин Станислав
1. Камень
Фантастика:
боевая фантастика
6.80
рейтинг книги
Камень

Двойник Короля

Скабер Артемий
1. Двойник Короля
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Двойник Короля

Я — Легион

Злобин Михаил
3. О чем молчат могилы
Фантастика:
боевая фантастика
7.88
рейтинг книги
Я — Легион

Камень. Книга пятая

Минин Станислав
5. Камень
Фантастика:
боевая фантастика
6.43
рейтинг книги
Камень. Книга пятая

Долг

Кораблев Родион
7. Другая сторона
Фантастика:
боевая фантастика
5.56
рейтинг книги
Долг

Изменяющий-Механик. Компиляция. Книги 1-18

Усманов Хайдарали
Собрание сочинений
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Изменяющий-Механик. Компиляция. Книги 1-18

Точка Бифуркации VII

Смит Дейлор
7. ТБ
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Точка Бифуркации VII

Двойник Короля 5

Скабер Артемий
5. Двойник Короля
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Двойник Короля 5

Брат мужа

Зайцева Мария
Любовные романы:
5.00
рейтинг книги
Брат мужа

Черный Маг Императора 17

Герда Александр
17. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Черный Маг Императора 17

На границе империй. Том 9. Часть 5

INDIGO
18. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 5

Газлайтер. Том 19

Володин Григорий Григорьевич
19. История Телепата
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Газлайтер. Том 19

Как я строил магическую империю 9

Зубов Константин
9. Как я строил магическую империю
Фантастика:
постапокалипсис
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Как я строил магическую империю 9

Третий Генерал: Том V

Зот Бакалавр
4. Третий Генерал
Фантастика:
городское фэнтези
аниме
сказочная фантастика
попаданцы
5.00
рейтинг книги
Третий Генерал: Том V