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

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

Жанры

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 может быть представлено следующим псевдокодом:

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

Идеальный мир для Лекаря 13

Сапфир Олег
13. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 13

Кай из рода красных драконов 4

Бэд Кристиан
4. Красная кость
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Кай из рода красных драконов 4

Эволюционер из трущоб. Том 3

Панарин Антон
3. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
6.00
рейтинг книги
Эволюционер из трущоб. Том 3

Корсар

Русич Антон
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
6.29
рейтинг книги
Корсар

Моров. Том 5

Кощеев Владимир
4. Моров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Моров. Том 5

Деревенщина в Пекине

Афанасьев Семён
1. Пекин
Фантастика:
попаданцы
дорама
фантастика: прочее
5.00
рейтинг книги
Деревенщина в Пекине

Алекс и Алекс

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

Студиозус

Шмаков Алексей Семенович
3. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Студиозус

На границе империй. Том 2

INDIGO
2. Фортуна дама переменчивая
Фантастика:
космическая фантастика
7.35
рейтинг книги
На границе империй. Том 2

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

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

По осколкам твоего сердца

Джейн Анна
2. Хулиган и новенькая
Любовные романы:
современные любовные романы
5.56
рейтинг книги
По осколкам твоего сердца

Афганский рубеж 2

Дорин Михаил
2. Рубеж
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Афганский рубеж 2

Звездная Кровь. Изгой VII

Елисеев Алексей Станиславович
7. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
технофэнтези
рпг
фантастика: прочее
попаданцы
5.00
рейтинг книги
Звездная Кровь. Изгой VII

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

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