(Π’Π΅ΡΡ '
!strcmp(s1, s2)strcmp(s1, s2) == 0!strcmp(s1, s2)strcmp()ΠΠΎΠ³Π΄Π° 4.2 BSD ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠ»ΠΎ Π½ΠΎΠ²ΡΠΉ ΡΠΎΡΠΌΠ°Ρ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π΄ΠΎΠΏΡΡΠΊΠ°Π» Π΄Π»ΠΈΠ½Π½ΡΠ΅ ΠΈΠΌΠ΅Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π» Π»ΡΡΡΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ, Π±ΡΠ»ΠΈ ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π½ΠΎΠ²ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ Π΄Π»Ρ Π°Π±ΡΡΡΠ°Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΡΠ΅Π½ΠΈΡ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ². ΠΡΠΎΡ Π½Π°Π±ΠΎΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠ²Π° Π»Π΅ΠΆΠ°ΡΠ°Ρ Π² ΠΎΡΠ½ΠΎΠ²Π΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ° ΠΈ ΠΊΠ°ΠΊ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Ρ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΈ. ΠΡΠ½ΠΎΠ²Π½Π°Ρ Π΅Π΅ ΡΠ°ΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠΈΠ·ΠΎΠ²Π°Π½Π° POSIX, Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠ΅ Π΅Π΅, ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΈΡΡΠ΅ΠΌΠ°ΠΌΠΈ GNU/Linux ΠΈ Unix.
5.3.1. ΠΠ°Π·ΠΎΠ²ΠΎΠ΅ ΡΡΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ²
ΠΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ² ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Ρ
struct direntstruct directstruct dirent {Β ...Β ino_t d_ino;Β Β Β Β Β /* ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ XSI --- ΡΠΌ. ΡΠ΅ΠΊΡΡ */Β char d_name[...]; /* Π ΡΠ°Π·ΠΌΠ΅ΡΠ΅ ΡΡΠΎΠ³ΠΎ ΠΌΠ°ΡΡΠΈΠ²Π° ΡΠΌ. Π² ΡΠ΅ΠΊΡΡΠ΅ */Β ...};ΠΠ»Ρ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌΠΎΡΡΠΈ POSIX ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π»ΠΈΡΡ ΠΏΠΎΠ»Π΅
d_named_nameNAME_MAXNAME_MAX<limits.h>d_inoΠΠ° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΈΠΌΠ΅Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ² ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ, a
NAME_MAXstruct 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);Β Β Β Β Β Β Β /* ΠΠ΅ΡΠ½ΡΡΡΡΡ Π² Π½Π°ΡΠ°Π»ΠΎ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° */Π’ΠΈΠΏ
DIRFILE<stdio.h>opendir()NULLΠΡΠΊΡΡΠ² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
DIR*struct direntreaddir()NULLΠΠ°ΠΊΠΎΠ½Π΅Ρ,
closedir()fclose()<stdio.h>DIR*rewinddir()ΠΠΌΠ΅Ρ Π² ΡΠ°ΡΠΏΠΎΡΡΠΆΠ΅Π½ΠΈΠΈ (ΠΈΠ»ΠΈ ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ Π‘) ΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°ΡΡ Π½Π΅Π±ΠΎΠ»ΡΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ
catdirch05-catdir.Ρ1Β /* ch05-catdir.Ρ - ΠΠ΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΡ opendir(), readdir(), closedir(). */23Β #include <stdio.h> /* Π΄Π»Ρ printf() ΠΈ Ρ.Π΄. */4Β #include <errno.h> /* Π΄Π»Ρ errno */5Β #include <sys/types.h> /* Π΄Π»Ρ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ
ΡΠΈΠΏΠΎΠ² */6Β #include <dirent.h> /* Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° */78Β char *myname;9Β int process(char *dir);1011 /* main --- ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° */1213 int main(int argc, char **argv)14 {15Β int i;16Β int errs = 0;1718Β myname = argv[0];1920Β if (argc == 1)21Β Β errs = process("."); /* ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΠ΅ΠΊΡΡΠΈΠΉ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ */22Β else23Β Β for (i = 1; i < argc; i++)24Β Β Β errs += process(argv[i]);2526Β return (errs != 0);27 }ΠΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π²ΠΏΠΎΠ»Π½Π΅ ΠΏΠΎΠ΄ΠΎΠ±Π½Π°
ch04-cat.cmain()29 /*30Β * process --- ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ-ΡΠΎ Ρ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠΌ, Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅,31Β * Π²ΡΠ²Π΅ΡΡΠΈ ΠΏΠ°ΡΡ ΠΈΠ½Π΄Π΅ΠΊΡ/ΠΈΠΌΡ Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ Π²ΡΠ²ΠΎΠ΄.32Β * ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ 0, Π΅ΡΠ»ΠΈ Π²ΡΠ΅ OK, ΠΈΠ½Π°ΡΠ΅ 1.33Β */3435 int36 process(char *dir)37 {