1 /* ch12-devrandom.Ρ --- Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ Π±ΡΠΎΡΠ°Π½ΠΈΠ΅ ΠΊΠΎΡΡΠ΅ΠΉ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ /dev/urandom. */
2
3 #include <stdio.h>
4 #include <fcntl.h>
5 #include <stdlib.h>
6
7 char *die_faces[] = { /* Π£ΠΏΡΠ°Π²Π»ΡΠ΅Ρ ASCII Π³ΡΠ°ΡΠΈΠΊΠ°! */
/* ... ΠΊΠ°ΠΊ ΡΠ°Π½Π΅Π΅ ... */
31 };
32
33 /* myrandom --- Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· /dev/urandom Π² Π²ΠΈΠ΄Π΅ unsigned long */
34
35 unsigned long myrandom(void)
36 {
37 static int fd = -1;
38 unsigned long data;
39
40 if (fd == -1)
41 fd = open("/dev/urandom", O_RDONLY);
42
43 if (fd == -1 || read(fd, &data, sizeof data) <= 0)
44 return random(); /* ΠΎΡΡΡΡΠΏΠΈΡΡ */
45
46 return data;
47 }
48
49 /* main --- Π²ΡΠ²Π΅ΡΡΠΈ N ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ Π³ΡΠ°Π½Π΅ΠΉ ΠΊΡΠ±ΠΈΠΊΠΎΠ² */
50
51 int main(int argc, char **argv)
52 {
53 int nfaces;
54 int i, j, k;
55
/* ...ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° args, Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ nfaces, ΠΊΠ°ΠΊ ΡΠ°Π½Π΅Π΅... */
68
69 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 }
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 ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΏΡΠ΅Π²Π΄ΠΎΠΊΠΎΠ΄ΠΎΠΌ:
if (/* ΠΏΠΎΠΊΠ°Π·Π°ΡΡ Π²ΡΠ΅ ΡΠ°ΠΉΠ»Ρ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΠΈΡ ΠΈΠΌΠ΅Π½ΠΈ (-Π°) */
OR /* ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠΈΠΌΠ²ΠΎΠ» ΠΈΠΌΠ΅Π½ΠΈ Π½Π΅ ΡΠΎΡΠΊΠ° */
OR (/* ΠΏΠΎΠΊΠ°Π·Π°ΡΡ ΡΠ°ΠΉΠ»Ρ Ρ ΡΠΎΡΠΊΠΎΠΉ (-Π) */
AND /* Π² ΠΈΠΌΠ΅Π½ΠΈ ΡΠ°ΠΉΠ»Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² */
AND (/* Π²ΡΠΎΡΠΎΠΉ ΡΠΈΠΌΠ²ΠΎΠ» Π½Π΅ ΡΠΎΡΠΊΠ° */
OR /* ΡΡΠ΅ΡΠΈΠΉ ΡΠΈΠΌΠ²ΠΎΠ» Π½Π΅ Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ ΠΈΠΌΡ */)))
return TRUE;
ΠΠΠΠΠ§ΠΠΠΠ. fnmatch() ΠΌΠΎΠΆΠ΅Ρ ΠΎΠΊΠ°Π·Π°ΡΡΡΡ Π΄ΠΎΡΠΎΠ³ΠΎΡΡΠΎΡΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ, Π΅ΡΠ»ΠΈ ΠΎΠ½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² Π»ΠΎΠΊΠ°Π»ΠΈ Ρ ΠΌΠ½ΠΎΠ³ΠΎΠ±Π°ΠΉΡΠ½ΡΠΌ Π½Π°Π±ΠΎΡΠΎΠΌ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ². ΠΠ±ΡΡΠ΄ΠΈΠΌ ΠΌΠ½ΠΎΠ³ΠΎΠ±Π°ΠΉΡΠ½ΡΠ΅ Π½Π°Π±ΠΎΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 13.4 Β«ΠΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΠΈΠ·Π½Π΅ΡΡΠΈ ΡΡΠΎ Π΄Π»Ρ ΠΌΠ΅Π½Ρ ΠΏΠΎ Π±ΡΠΊΠ²Π°ΠΌ?Β»
12.7.2. Π Π°ΡΠΊΡΡΡΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ ΡΠ°ΠΉΠ»Π°: glob() ΠΈ globfree()
Π€ΡΠ½ΠΊΡΠΈΠΈ glob() ΠΈ globfree() Π±ΠΎΠ»Π΅Π΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π½Π½ΡΠ΅, ΡΠ΅ΠΌ fnmatch():
#include <glob.h> /* POSIX */
int glob(const char *pattern, int flags,
int (*errfunc)(const char *epath, int eerrno), glob_t *pglob);
void globfree(glob_t *pglob);
Π€ΡΠ½ΠΊΡΠΈΡ glob() ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅Ρ ΠΏΡΠΎΡΠΌΠΎΡΡ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° ΠΈ ΡΠΎΠΏΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Ρ ΡΠ°Π±Π»ΠΎΠ½Π°ΠΌΠΈ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Ρ ΡΠΏΠΈΡΠΎΠΊ Π²ΡΠ΅Ρ ΠΏΡΡΠ΅ΠΉ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΡ pattern. Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π²ΠΊΠ»ΡΡΠ΅Π½Ρ Π² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΌΠ΅ΡΡΠ°Ρ ΠΏΡΡΠΈ, Π° Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, '/usr/*/*.so'). ΠΡΠ³ΡΠΌΠ΅Π½ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅:
const char *pattern
Π¨Π°Π±Π»ΠΎΠ½ Π΄Π»Ρ ΡΠ°ΡΠΊΡΡΠ²Π°Π½ΠΈΡ.
int flags
Π€Π»Π°Π³ΠΈ, ΡΠΏΡΠ°Π²Π»ΡΡΡΠΈΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ glob(), Π²ΡΠΊΠΎΡΠ΅ Π±ΡΠ΄ΡΡ ΠΎΠΏΠΈΡΠ°Π½Ρ.
int (*errfunc)(const char *epath, int eerrno)
Π£ΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΡ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ°Ρ . ΠΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΡΠ°Π²Π½ΡΡΡΡΡ NULL. ΠΡΠ»ΠΈ Π½Π΅Ρ ΠΈ Π΅ΡΠ»ΠΈ (*errfunc)() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½Π΅Π½ΡΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Π² flags ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ GLOB_ERR, glob() ΠΏΡΠ΅ΠΊΡΠ°ΡΠ°Π΅Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ. ΠΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ (*errfunc)() ΡΠ²Π»ΡΡΡΡΡ ΠΏΡΡΡ, Π²ΡΠ·Π²Π°Π²ΡΠΈΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ errno, ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ΅ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ opendir(), readdir() ΠΈΠ»ΠΈ stat().
glob_t *pglob
Π£ΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΡΡΠΊΡΡΡΡ glob_t, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡΡΡ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ². Π‘ΡΡΡΠΊΡΡΡΠ° glob_t ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠΏΠΈΡΠΎΠΊ ΠΏΡΡΠ΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΠ΄Π°Π΅Ρ glob():
typedef struct { /* POSIX */