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

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

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

glob()
ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Π° Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Π°: ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„Π»Π°Π³
GLOB_APPEND
Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½, ΠΏΡ€ΠΈ всСх ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π²Ρ‹Π·ΠΎΠ²Π°Ρ… ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½. Π’Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ
gl_offs
, Π° Ссли Π²Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠΈΠ΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ значСния Π²
gl_pathv
ΠΈΠ»ΠΈ
gl_pathc
, Π½ΡƒΠΆΠ½ΠΎ ΠΈΡ… Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ
glob()
.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°

glob()
позволяСт Π½Π°ΠΊΠ°ΠΏΠ»ΠΈΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π² ΠΎΠ΄Π½ΠΎΠΌ спискС. Π­Ρ‚ΠΎ довольно ΠΏΡ€Π°ΠΊΡ‚ΠΈΡ‡Π½ΠΎ, приблиТаСтся ΠΊ ΠΌΠΎΡ‰Π½Ρ‹ΠΌ возмоТностям раскрывания Π³Ρ€ΡƒΠΏΠΏΠΎΠ²Ρ‹Ρ… символов ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ, Π½ΠΎ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ языка программирования Π‘.

glob()
Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 0, Ссли Π½Π΅ Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, ΠΈΠ»ΠΈ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈΠ· Ρ‚Π°Π±Π». 12.4, Ссли Π±Ρ‹Π»ΠΈ.

Π’Π°Π±Π»ΠΈΡ†Π° 12.4. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅

glob()
значСния

Π€Π»Π°Π³ Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
GLOB_ABORTED
ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ остановлСн Ρ€Π°Π½ΡŒΡˆΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π±Ρ‹Π» установлСн
GLOB_ERR
ΠΈΠ»ΠΈ функция
(*errfunc)()
Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΠ»Π° Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚
GLOB_NOMATCH
Ни ΠΎΠ΄Π½ΠΎ имя Ρ„Π°ΠΉΠ»Π° Π½Π΅ соотвСтствовало
pattern
, Π° Ρ„Π»Π°Π³
GLOB_NOCHECK
Π½Π΅ Π±Ρ‹Π» установлСн
GLOB_NOSPACE
Π‘Ρ‹Π»Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ динамичСской памяти

globfree()
освобоТдаСт всю ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ динамичСски Π²Ρ‹Π΄Π΅Π»ΠΈΠ»Π°
glob()
Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°,
ch12-glob.с
, дСмонстрируСт
glob()
:

1Β  /* ch12-glob.c --- дСмонстрируСт glob(). */

2

3Β  #include <stdio.h>

4Β  #include <errno.h>

5Β  #include <glob.h>

6

7Β  char *myname;

8

9Β  /* globerr --- Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ сообщСниС ΠΎΠ± ошибкС для glob() */

10

11 int globerr(const char *path, int eerrno)

12 {

13Β  fprintf(stderr, "%s: %s: %s\n", myname, path, strerror(eerrno));

14Β  return 0; /* let glob() keep going */

15 }

16

17 /* main() --- раскрываСт символы подстановки Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ */

18

19 int main(int argc, char **argv)

20 {

21Β  int i;

22Β  int flags = 0;

23Β  glob_t results;

24Β  int ret;

25

26Β  if (argc == 1) {

27Β Β  fprintf(stderr, "usage: %s wildcard ...\n", argv[0]);

28Β Β  exit(1);

29Β  }

30

31  myname = argv[0]; /* для globerr() */

32

33 Β for (i = 1; i < argc; i++) {

34Β Β  flags |= (i > 1 ? GLOB_APPEND : 0);

35Β Β  ret = glob(argv[i], flags, globerr, &results);

36Β Β  if (ret != 0) {

37Β Β Β  fprintf(stderr, "%s: problem with %s (%s),

38Β Β Β Β  stopping early\n", myname, argv[i],

39     /* опасно: */ (ret == GLOB_ABORTED ? "filesystem problem" :

40Β Β Β Β  ret == GLOB_NOMATCH ? "no match of pattern" :

41Β Β Β Β  ret == GLOB_NOSPACE ? "no dynamic memory" :

42Β Β Β Β  "unknown problem"));

43Β Β Β  break;

44Β Β  }

45Β  }

46

47Β  for (i = 0; i < results.gl_pathc; i++)

48Β Β  printf("%s\n", results.gl_pathv[i]);

49

50Β  globfree(&results);

51Β  return 0;

52 }

Π‘Ρ‚Ρ€ΠΎΠΊΠ° 7 опрСдСляСт

myname
, которая ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° имя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹; эта пСрСмСнная для сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… ΠΎΡ‚
globerr()
, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Π² строках 11–15.

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ 33–45 ΡΠ²Π»ΡΡŽΡ‚ΡΡ основой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Они ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°ΡŽΡ‚ Π² Ρ†ΠΈΠΊΠ»Π΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС, вызывая для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ

glob()
для добавлСния ΠΊ списку Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ². Π‘ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Ρ†ΠΈΠΊΠ»Π° составляСт ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок (строки 36–44). Π‘Ρ‚Ρ€ΠΎΠΊΠΈ 47–48 выводят Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ список, Π° строки 50–51 проводят Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΡƒΡŽ очистку ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ.

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ 39–41 Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌΠΈ; Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‰ΡƒΡŽ Ρ†Π΅Π»Ρ‹Π΅ константы Π² строки; ΠΌΡ‹ сдСлали это Π³Π»Π°Π²Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Ρ€Π°Π΄ΠΈ экономии мСста. Код Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ этого ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сносным для Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, Π½ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΊΡ€ΡƒΠΏΠ½Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

Если Π²Ρ‹ ΠΏΠΎΠ΄ΡƒΠΌΠ°Π΅Ρ‚Π΅ ΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅, происходящСй ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ (ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ², сопоставлСниС шаблонов, динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти для увСличСния списка, сортировка списка), ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΊΠ°Ρ‡Π°Ρ‚ΡŒ Ρ†Π΅Π½ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ для вас Π΄Π΅Π»Π°Π΅Ρ‚

glob()
! Π’ΠΎΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹:

$ <b>ch12-glob '/usr/lib/x*.so' '../../*.texi'</b>

/usr/lib/xchat-autob5.so

/usr/lib/xchat-autogb.so

../../00-preface.texi

../../01-intro.texi

../../02-cmdline.texi