Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
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/urandomunsigned long12.7. Расширения метасимволов
Три набора функции возрастающей сложности предусматривают возможность сопоставления с шаблонами групповых символов оболочки. Многим программам нужны такие библиотечные функции. Одним примером является
findfind . -name '*.с' -print--exclude12.7.1. Простое сопоставление с шаблоном:
fnmatch()Мы начинаем с функции
fnmatch()#include <fnmatch.h> /* POSIX */int fnmatch(const char *pattern, const char *string, int flags);Эта функция сопоставляет
stringpatternstringpatternFNM_NOMATCHПеременная
flagsТаблица 12.1. Значения флагов для
fnmatch()| Флаг | Только GLIBC | Значение |
|---|---|---|
FNM_CASEFOLD | √ | Сопоставление с учетом регистра |
FNM_FILE_NAME | √ | Синоним GNU для FNM_PATHNAME |
FNM_LEADING_DIR | √ | Флаг для внутреннего использования GLIBC; не используйте его в своих программах. Подробности см. в fnmatch(3) |
FNM_NOESCAPE | Обратный слеш является обычным символом, а не знаком перехода | |
FNM_PATHNAME | Слеш в stringpattern*?[...] | |
FNM_PERIOD | Начальная точка в stringpatternstringFNM_PATHNAME |
fnmatch()fnmatch()readdir()