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

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

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

(ВСст '

!strcmp(s1, s2)
' являСтся Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠΎΠΉ '
strcmp(s1, s2) == 0
', Ρ‚.Π΅. ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ совпадСния строк. Π‘Ρ‚ΠΎΠΈΡ‚ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ рассматриваСм '
!strcmp(s1, s2)
' ΠΊΠ°ΠΊ ΠΏΠ»ΠΎΡ…ΠΎΠΉ ΡΡ‚ΠΈΠ»ΡŒ. Как сказал ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ‹ Π“Π΅Π½Ρ€ΠΈ БпСнсСр (Henry Spencer), Β«
strcmp()
это Π½Π΅ boolean!Β».)

Когда 4.2 BSD прСдставило Π½ΠΎΠ²Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ допускал Π΄Π»ΠΈΠ½Π½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ обСспСчивал Π»ΡƒΡ‡ΡˆΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Π±Ρ‹Π»ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ прСдставлСны нСсколько Π½ΠΎΠ²Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для абстрагирования чтСния ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ². Π­Ρ‚ΠΎΡ‚ Π½Π°Π±ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠ²Π° лСТащая Π² основС файловая систСма ΠΈ ΠΊΠ°ΠΊ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ. Основная Π΅Π΅ Ρ‡Π°ΡΡ‚ΡŒ стандартизована POSIX, Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ Π΅Π΅, пСрСносимы ΠΌΠ΅ΠΆΠ΄Ρƒ систСмами GNU/Linux ΠΈ Unix.

5.3.1. Π‘Π°Π·ΠΎΠ²ΠΎΠ΅ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ²

Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² прСдставлСны

struct dirent
(Π½Π΅ Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ V7
struct direct
!):

struct dirent {

Β ...

Β ino_t d_ino;Β Β Β Β Β  /* Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ XSI --- см. тСкст */

Β char d_name[...]; /* О Ρ€Π°Π·ΠΌΠ΅Ρ€Π΅ этого массива см. Π² тСкстС */

Β ...

};

Для пСрСносимости POSIX ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ лишь ΠΏΠΎΠ»Π΅

d_name
, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ являСтся Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΌΡΡ Π½ΡƒΠ»Π΅ΠΌ массивом Π±Π°ΠΉΡ‚ΠΎΠ², ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΌ Ρ‡Π°ΡΡ‚ΡŒ элСмСнта ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° с ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ„Π°ΠΉΠ»Π°. Π Π°Π·ΠΌΠ΅Ρ€
d_name
стандартом Π½Π΅ указываСтся, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΌ ΠΏΠ΅Ρ€Π΅Π΄ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΌ Π½ΡƒΠ»Π΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ Π±ΠΎΠ»Π΅Π΅
NAME_MAX
Π±Π°ΠΉΡ‚ΠΎΠ². (
NAME_MAX
ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π²
<limits.h>
.) Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ XSI POSIX прСдусматриваСт ΠΏΠΎΠ»Π΅ Π½ΠΎΠΌΠ΅Ρ€Π° индСкса
d_ino
.

На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΠΌΠ΅Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹, a

NAME_MAX
ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ довольно Π²Π΅Π»ΠΈΠΊΠΎ (ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ 255),
struct dirent
содСрТит Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ‡Π»Π΅Π½Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ вСсти Π½Π° дискС ΡƒΡ‡Π΅Ρ‚ элСмСнтов ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ Π΄Π»ΠΈΠ½Π°ΠΌΠΈ. Π­Ρ‚ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ‡Π»Π΅Π½Ρ‹ Π½Π΅ сущСствСнны для ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ интСрфСйс чтСния ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ²:

#include <sys/types.h> /* POSIX */

#include <dirent.h>

DIR *opendir(const char *name);Β Β  /* ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ для чтСния */

struct dirent *readdir(DIR *dir); /* Π’Π΅Ρ€Π½ΡƒΡ‚ΡŒ struct dirent Π·Π° Ρ€Π°Π· */

int closedir(DIR *dir);Β Β Β Β Β  Β Β Β Β  /* Π—Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ */

void rewinddir(DIR *dirp);Β Β Β Β Β Β Β  /* Π’Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ Π² Π½Π°Ρ‡Π°Π»ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° */

Π’ΠΈΠΏ

DIR
являСтся Π°Π½Π°Π»ΠΎΠ³ΠΎΠΌ Ρ‚ΠΈΠΏΠ°
FILE
Π²
<stdio.h>
. Π­Ρ‚ΠΎ Π½Π΅ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ прилоТСния Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ находится Π²Π½ΡƒΡ‚Ρ€ΠΈ Π½Π΅Π³ΠΎ; Π΅Π³ΠΎ содСрТимоС ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΎ для использования Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°ΠΌΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ². Если
opendir()
Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚
NULL
, ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ для чтСния, Π° errno содСрТит ΠΊΠΎΠ΄ ошибки.

ΠžΡ‚ΠΊΡ€Ρ‹Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ

DIR*
, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ для получСния указатСля Π½Π°
struct dirent
, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°.
readdir()
Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚
NULL
, Ссли достигнут ΠΊΠΎΠ½Π΅Ρ† ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° [54] ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π° ошибка.

НаконСц,

closedir()
являСтся Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
fclose()
Π²
<stdio.h>
; ΠΎΠ½Π° Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ
DIR*
. Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π°Ρ‡Π°Ρ‚ΡŒ с Π½Π°Ρ‡Π°Π»Π° ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ
rewinddir()
.

ИмСя Π² распоряТСнии (ΠΈΠ»ΠΈ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Π‘) эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π΅Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ

catdir
, которая Β«ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚Β» содСрТимоС ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°. Вакая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° прСдставлСна Π²
ch05-catdir.с
:

1Β  /* ch05-catdir.с - ДСмонстрация opendir(), readdir(), closedir(). */

2

3Β  #include <stdio.h> /* для printf() ΠΈ Ρ‚.Π΄. */

4  #include <errno.h> /* для errno */

5Β  #include <sys/types.h> /* для систСмных Ρ‚ΠΈΠΏΠΎΠ² */

6Β  #include <dirent.h> /* для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° */

7

8Β  char *myname;

9Β  int process(char *dir);

10

11 /* main --- пСрСчислСниС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° */

12

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

14 {

15Β  int i;

16Β  int errs = 0;

17

18Β  myname = argv[0];

19

20Β  if (argc == 1)

21Β Β  errs = process("."); /* ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ */

22Β  else

23Β Β  for (i = 1; i < argc; i++)

24Β Β Β  errs += process(argv[i]);

25

26Β  return (errs != 0);

27 }

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²ΠΏΠΎΠ»Π½Π΅ ΠΏΠΎΠ΄ΠΎΠ±Π½Π°

ch04-cat.c
(см. Ρ€Π°Π·Π΄Π΅Π» 4.2 Β«ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ Π±Π°Π·ΠΎΠ²ΠΎΠΉ структуры ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹Β»); функция
main()
ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Π°. Π“Π»Π°Π²Π½ΠΎΠ΅ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Ссли Π½Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² (строки 20–21).

29 /*

30Β  * process --- ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ с ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠΌ, Π² Π΄Π°Π½Π½ΠΎΠΌ случаС,

31Β  * вывСсти ΠΏΠ°Ρ€Ρ‹ индСкс/имя Π² стандартный Π²Ρ‹Π²ΠΎΠ΄.

32Β  * Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 0, Ссли всС OK, ΠΈΠ½Π°Ρ‡Π΅ 1.

33Β  */

34

35 int

36 process(char *dir)

37 {