Linux программирование в примерах
Часть 178 из 253 Информация о книге
5 #include <stdlib.h>67 char *die_faces[] = { /* Управляет ASCII графика! *//* ... как ранее ... */31 };3233 /* myrandom --- возвращает данные из /dev/urandom в виде unsigned long */3435 unsigned long myrandom(void)36 {37 static int fd = -1;38 unsigned long data;3940 if (fd == -1)41 fd = open("/dev/urandom", O_RDONLY);4243 if (fd == -1 || read(fd, &data, sizeof data) <= 0)44 return random(); /* отступить */4546 return data;47 }4849 /* main --- вывести N различных граней кубиков */5051 int main(int argc, char **argv)52 {53 int nfaces;54 int i, j, k;55/* ...проверка args, вычисление nfaces, как ранее... */6869 for (i = 1; i <= nfaces; i++) {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 }7778 return 0;79 }Строки 35–47 предоставляют интерфейс вызова функции для
, читая каждый раз данные/dev/urandom. Издержками является один дескриптор файла, который остается открытым в течение жизни программы.unsigned long12.7. Расширения метасимволов
Три набора функции возрастающей сложности предусматривают возможность сопоставления с шаблонами групповых символов оболочки. Многим программам нужны такие библиотечные функции. Одним примером является
: 'find'. Другим примером является опцияfind . -name '*.с' -printво многих программах, которая принимает шаблон файлов с групповыми символами для исключения из того или иного действия. В данном разделе по очереди рассматривается каждый набор функций.--exclude12.7.1. Простое сопоставление с шаблоном:
fnmatch()Мы начинаем с функции
(«filename match» — сопоставление имени файла»).fnmatch()#include <fnmatch.h> /* POSIX */int fnmatch(const char *pattern, const char *string, int flags);Эта функция сопоставляет
сstring, который является обычным шаблоном групповых символов оболочки. Значение флагов (которое вскоре будет описано) изменяет поведение функции. Возвращаемое значение равно 0, еслиpatternсоответствуетstring,pattern, если не соответствует, и ненулевое значение, если возникла ошибка. К сожалению, POSIX не определяет каких-либо специфических ошибок; соответственно, вы можете лишь сказать, что что-то пошло не так, но не можете сказать, что.FNM_NOMATCHПеременная
является побитовым ИЛИ одного или более флагов, перечисленных в табл. 12.1.flagsТаблица 12.1. Значения флагов для
fnmatch()
Флаг Только GLIBC Значение FNM_CASEFOLD√ Сопоставление с учетом регистра FNM_FILE_NAME√ Синоним GNU для FNM_PATHNAMEFNM_LEADING_DIR√ Флаг для внутреннего использования GLIBC; не используйте его в своих программах. Подробности см. в fnmatch(3) FNM_NOESCAPEОбратный слеш является обычным символом, а не знаком перехода FNM_PATHNAMEСлеш в должен соответствовать слешу вstring, он не может быть подставлен черезpattern,*или '?'[...]FNM_PERIODНачальная точка в подходит, лишь если вstringтакже есть начальная точка. Точка должна быть первым символом вpattern. Однако, если также установленstring, точка, которая идет за слешем, также рассматривается как начальнаяFNM_PATHNAMEработает со строками из любого источника; сопоставляемые строки не обязательно должны быть действительными именами файлов. Хотя на практикеfnmatch()используется в коде, читающем каталог с помощьюfnmatch()(см раздел 5.3.1 «Базовое чтение каталогов»):readdir()