Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Linux ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 113

Автор ΠΡ€Π½ΠΎΠ»ΡŒΠ΄ Роббинс

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 */