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

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

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

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 Β«Π‘Π°Π·ΠΎΠ²ΠΎΠ΅ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ²Β»):