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

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

Жанры

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

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

Ваше Сиятельство 6

Моури Эрли
6. Ваше Сиятельство
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Ваше Сиятельство 6

Геном хищника. Книга четвертая

Гарцевич Евгений Александрович
4. Я - Легенда!
Фантастика:
боевая фантастика
рпг
попаданцы
5.00
рейтинг книги
Геном хищника. Книга четвертая

Горизонт Вечности

Вайс Александр
11. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Горизонт Вечности

Мастер 11

Чащин Валерий
11. Мастер
Фантастика:
боевая фантастика
попаданцы
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Мастер 11

Я спас СССР! том 2

Вязовский Алексей
2. Я спас СССР
Фантастика:
альтернативная история
5.62
рейтинг книги
Я спас СССР! том 2

Наномашины, внучок! Том 2

Новиков Николай Васильевич
2. Чего смотришь? Иди книгу читай
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наномашины, внучок! Том 2

Вперед в прошлое 2

Ратманов Денис
2. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 2

Мечник Вернувшийся 1000 лет спустя. Том 2

Ткачев Андрей Юрьевич
2. Вернувшийся мечник
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Мечник Вернувшийся 1000 лет спустя. Том 2

Неучтенный элемент. Том 10

NikL
10. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 10

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

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 4

Сержант. Назад в СССР. Книга 4

Гаусс Максим
4. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Сержант. Назад в СССР. Книга 4

Травник

Назимов Константин Геннадьевич
1. Травник
Фантастика:
фэнтези
5.00
рейтинг книги
Травник

Я не бог. Книга XXXIV

Дрейк Сириус
34. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я не бог. Книга XXXIV

Геном хищника. Книга седьмая

Гарцевич Евгений Александрович
7. Я - Легенда!
Фантастика:
боевая фантастика
рпг
фэнтези
попаданцы
5.00
рейтинг книги
Геном хищника. Книга седьмая