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

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

Жанры

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

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

Вернувшийся: Первые шаги. Том II

Vector
2. Вернувшийся
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Вернувшийся: Первые шаги. Том II

Князь Целитель 4

Ткачев Андрей Юрьевич
4. Князь Целитель
Фантастика:
боевая фантастика
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Князь Целитель 4

Дитя прибоя

Трофимов Ерофей
Дитя прибоя
Фантастика:
боевая фантастика
попаданцы
фэнтези
5.00
рейтинг книги
Дитя прибоя

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

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

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

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

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

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

Одержимая (авторский сборник)

Дяченко Марина и Сергей
Фантастика:
фэнтези
научная фантастика
7.80
рейтинг книги
Одержимая (авторский сборник)

Древесный маг Орловского княжества 9

Павлов Игорь Васильевич
9. Орловское княжество
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества 9

Собрание сочинений. Т. 20. Плодовитость

Золя Эмиль
Проза:
классическая проза
5.00
рейтинг книги
Собрание сочинений. Т. 20. Плодовитость

Элизиум. Аликс и монеты

Андерсон Александр
1. Элизиум
Фантастика:
фэнтези
сказочная фантастика
8.98
рейтинг книги
Элизиум. Аликс и монеты

Вернувшийся: Корпорация. Том III

Vector
3. Вернувшийся
Фантастика:
космическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Вернувшийся: Корпорация. Том III

Тринадцатый VI

NikL
6. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый VI

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

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

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

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