FILE *fopen(char *name, char *mode)
{
int fd;
FILE *fp;
if (*mode != 'r' && *mode != 'w' && *mode != 'a'
return NULL;
for (fp = _iob; fp < _iob + OPEN_MAX; fp++)
if ((fp->flag & (_READ | _WRITE)) == 0)
break; /* Π½Π°ΠΉΠ΄Π΅Π½Π° ΡΠ²ΠΎΠ±ΠΎΠ΄Π½Π°Ρ ΠΏΠΎΠ·ΠΈΡΠΈΡ */
if (fp >= _iob + OPEN_MAX) /* Π½Π΅Ρ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡΠΈΡ */
return NULL;
if (*mode == 'w')
fd = creat(name, PERMS);
else if (*mode == 'a') {
if ((fd = open(name, O_WRONLY, 0)) == -1)
fd = creat(name, PERMS);
lseek(fd, 0L, 2);
} else
fd = open(name, O_RDONLY, 0);
if (fd == -1) /* Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ Π΄ΠΎΡΡΡΠΏ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ name */
return NULL;
fp->fd = fd;
fp->cnt = 0;
fp->base = NULL;
fp->flag = (*mode == 'r') ? _READ : _WRITE;
return fp;
}
ΠΡΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ Π·Π΄Π΅ΡΡ Π²Π΅ΡΡΠΈΡ fopen ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ Π½Π΅ Π²ΡΠ΅ ΡΠ΅ΠΆΠΈΠΌΡ Π΄ΠΎΡΡΡΠΏΠ°, ΠΎΠ³ΠΎΠ²ΠΎΡΠ΅Π½Π½ΡΠ΅ ΡΡΠ°Π½Π΄Π°ΡΡΠΎΠΌ; Π½ΠΎ, ΠΌΡ Π΄ΡΠΌΠ°Π΅ΠΌ, ΠΈΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π² ΠΏΠΎΠ»Π½ΠΎΠΌ ΠΎΠ±ΡΠ΅ΠΌΠ΅ Π½Π΅ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ²Π΅Π»ΠΈΡΠΈΡ Π΄Π»ΠΈΠ½Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΠ°ΡΠ° fopen Π½Π΅ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π΅Ρ Π±ΡΠΊΠ²Ρ b, ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡΡΡΡΠ΅ΠΉ ΠΎ Π±ΠΈΠ½Π°ΡΠ½ΠΎΠΌ Π²Π²ΠΎΠ΄Π΅-Π²ΡΠ²ΠΎΠ΄Π΅ (ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π² ΡΠΈΡΡΠ΅ΠΌΠ°Ρ UNIX ΡΡΠΎ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΡΠΌΡΡΠ»Π°), ΠΈ Π·Π½Π°ΠΊΠ° +, ΡΠΊΠ°Π·ΡΠ²Π°ΡΡΠ΅Π³ΠΎ Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΡΠΈΡΠ°ΡΡ ΠΈ ΠΏΠΈΡΠ°ΡΡ.
ΠΠ»Ρ Π»ΡΠ±ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° Π² ΠΌΠΎΠΌΠ΅Π½Ρ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΊ Π½Π΅ΠΌΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠ°ΠΊΡΠΎΠ²ΡΠ·ΠΎΠ²Π° getc ΡΡΠ΅ΡΡΠΈΠΊ cnt ΡΠ°Π²Π΅Π½ Π½ΡΠ»Ρ. Π‘Π»Π΅Π΄ΡΡΠ²ΠΈΠ΅ΠΌ ΡΡΠΎΠ³ΠΎ Π±ΡΠ΄Π΅Ρ Π²ΡΠ·ΠΎΠ² _fillbuf. ΠΠΎΠ»ΠΈ Π²ΡΡΡΠ½ΠΈΡΡΡ, ΡΡΠΎ ΡΠ°ΠΉΠ» Π½Π° ΡΡΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΎΡΠΊΡΡΡ, ΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ _fillbuf Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠΈΡ EOF. Π ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΎΠ½Π° ΠΏΠΎΠΏΡΡΠ°Π΅ΡΡΡ Π·Π°ΠΏΡΠΎΡΠΈΡΡ ΠΏΠ°ΠΌΡΡΡ Π΄Π»Ρ Π±ΡΡΠ΅ΡΠ° (Π΅ΡΠ»ΠΈ ΡΡΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ Ρ Π±ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΠ΅ΠΉ).
ΠΠΎΡΠ»Π΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΎΠ±Π»Π°ΡΡΠΈ ΠΏΠ°ΠΌΡΡΠΈ Π΄Π»Ρ Π±ΡΡΠ΅ΡΠ° _fillbuf ΠΎΠ±ΡΠ°ΡΠ°Π΅ΡΡΡ ΠΊ read, ΡΡΠΎΠ±Ρ Π΅Π³ΠΎ Π½Π°ΠΏΠΎΠ»Π½ΠΈΡΡ, ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΡΡΠ΅ΡΡΠΈΠΊ ΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠΈΠΌΠ²ΠΎΠ» ΠΈΠ· Π±ΡΡΠ΅ΡΠ°. Π ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡΡ _fillbuf ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡ, ΡΡΠΎ ΠΏΠ°ΠΌΡΡΡ Π΄Π»Ρ Π±ΡΡΠ΅ΡΠ° ΡΠΆΠ΅ Π²ΡΠ΄Π΅Π»Π΅Π½Π°.
#include "syscalls.h"
/* _fillbuf: Π·Π°ΠΏΡΠΎΡ ΠΏΠ°ΠΌΡΡΠΈ ΠΈ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π±ΡΡΠ΅ΡΠ° */
int _fillbuf(FILE *fp)
{
int bufsize;
if ((fp->flag & ( _READ | _EOF | _ERR )) != _READ)
return EOF;
bufsize = (fp->flag & _UNBUF) ? 1 : BUFSIZ;
if (fp->base == NULL) /* Π±ΡΡΠ΅ΡΠ° Π΅ΡΠ΅ Π½Π΅Ρ */
if ((fp->base = (char *) malloc(bufsize)) == NULL)
return EOF; /* Π½Π΅Π»ΡΠ·Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π±ΡΡΠ΅Ρ */
fp->ptr = fp->base;
fp->cnt = read(fp->fd, fp->ptr, bufsize);
if (--fp->cnt < 0) {
if (fp->cnt == -1)
fp->flag |= _EOF;
else
fp->flag |= _ERR;
fp->cnt = 0;
return EOF;
}
return (unsigned char) *fp->ptr++;
}
ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅, ΡΡΠΎ ΠΎΡΡΠ°Π»ΠΎΡΡ Π½Π΅Π²ΡΡΡΠ½Π΅Π½Π½ΡΠΌ, - ΡΡΠΎ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΎΠ²Π°ΡΡ Π½Π°ΡΠ°Π»ΠΎ ΡΡΠ΅ΡΠ°. ΠΠ°ΡΡΠΈΠ² _iob ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΠΏΠ΅ΡΠ΅Π΄ ΡΠ΅ΠΌ ΠΊΠ°ΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π½Π°ΡΠ½Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ, Π² Π½Π΅ΠΌ ΡΠΆΠ΅ Π±ΡΠ»Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠ°ΠΉΠ»Π°Ρ stdin, stdout ΠΈ stderr.
FILE _iob[OPEN_MAX] = { /* stdin, stdout, stderr: */
{ 0, (char *) 0, (char *) 0, _READ, 0 },
{ 0, (char *) 0, (char *) 0, _WRITE, 1 },
{ 0, (char *) 0, (char *) 0, _WRITE | _UNBUF, 2 }
};
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ flag ΠΊΠ°ΠΊ ΡΠ°ΡΡΠΈ ΡΡΡΡΠΊΡΡΡΡ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ stdin ΠΎΡΠΊΡΡΡ Π½Π° ΡΡΠ΅Π½ΠΈΠ΅, stdout - Π½Π° Π·Π°ΠΏΠΈΡΡ, Π° stderr - Π½Π° Π·Π°ΠΏΠΈΡΡ Π±Π΅Π· Π±ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΠΈ.
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 8.2. ΠΠ΅ΡΠ΅ΠΏΠΈΡΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ fopen ΠΈ _fillbuf, ΡΠ°Π±ΠΎΡΠ°Ρ Ρ ΡΠ»Π°ΠΆΠΊΠ°ΠΌΠΈ ΠΊΠ°ΠΊ Ρ ΠΏΠΎΠ»ΡΠΌΠΈ, Π° Π½Π΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ²Π½ΡΡ ΠΏΠΎΠ±ΠΈΡΠΎΠ²ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ. Π‘ΡΠ°Π²Π½ΠΈΡΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΡ ΠΈ ΡΠΊΠΎΡΠΎΡΡΠΈ Π΄Π²ΡΡ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ.
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 8.3. Π Π°Π·ΡΠ°Π±ΠΎΡΠ°ΠΉΡΠ΅ ΠΈ Π½Π°ΠΏΠΈΡΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ _flushbuf, fflush ΠΈ fclose.
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 8.4. Π€ΡΠ½ΠΊΡΠΈΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ
int fseek(FILE *fp, long offset, int origin)
ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½Π° ΡΡΠ½ΠΊΡΠΈΠΈ lseek Ρ ΡΠ΅ΠΌΠΈ, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΎΡΠ»ΠΈΡΠΈΡΠΌΠΈ, ΡΡΠΎ fp - ΡΡΠΎ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ, Π° Π½Π΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ, ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΠ½Π° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ int, ΠΎΠ·Π½Π°ΡΠ°ΡΡΠ΅Π΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠ°ΠΉΠ»Π°, Π° Π½Π΅ ΠΏΠΎΠ·ΠΈΡΠΈΡ Π² Π½Π΅ΠΌ. ΠΠ°ΠΏΠΈΡΠΈΡΠ΅ ΡΠ²ΠΎΡ Π²Π΅ΡΡΠΈΡ fseek. ΠΠ±Π΅ΡΠΏΠ΅ΡΡΡΠ΅, ΡΡΠΎΠ±Ρ ΡΠ°Π±ΠΎΡΠ° Π²Π°ΡΠ΅ΠΉ fseek ΠΏΠΎ Π±ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΠΈ Π±ΡΠ»Π° ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π° Ρ Π±ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΠ΅ΠΉ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠΉ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ.
8.6 ΠΡΠΈΠΌΠ΅Ρ. ΠΠ΅ΡΠ°ΡΡ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ²
ΠΡΠΈ ΡΠ°Π·Π½ΠΎΠ³ΠΎ ΡΠΎΠ΄Π° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡΡ Ρ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ ΠΈΠ½ΠΎΠ³Π΄Π° ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠ°ΠΉΠ»Π΅, Π° Π½Π΅ Π΅Π³ΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅. Π’Π°ΠΊΠ°Ρ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎΡΡΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΏΠ΅ΡΠ°ΡΠΈ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° ΡΠ°ΠΉΠ»ΠΎΠ², ΡΠ°Π±ΠΎΡΠ°ΡΡΠ΅ΠΉ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ ls ΡΠΈΡΡΠ΅ΠΌΡ UNIX. ΠΠ½Π° ΠΏΠ΅ΡΠ°ΡΠ°Π΅Ρ ΠΈΠΌΠ΅Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ² ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° ΠΈ ΠΏΠΎ ΠΆΠ΅Π»Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π΄ΡΡΠ³ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ (ΡΠ°Π·ΠΌΠ΅ΡΡ, ΠΏΡΠ°Π²Π° Π΄ΠΎΡΡΡΠΏΠ° ΠΈ Ρ. Π΄.). ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ Π² MS-DOS ΡΠ²Π»ΡΠ΅ΡΡΡ dir.
Π’Π°ΠΊ ΠΊΠ°ΠΊ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅ UNIX ΠΊΠ°ΡΠ°Π»ΠΎΠ³ - ΡΡΠΎ ΡΠΎΠΆΠ΅ ΡΠ°ΠΉΠ», ΡΡΠ½ΠΊΡΠΈΠΈ ls, ΡΡΠΎΠ±Ρ Π΄ΠΎΠ±ΡΠ°ΡΡΡΡ Π΄ΠΎ ΠΈΠΌΠ΅Π½ ΡΠ°ΠΉΠ»ΠΎΠ², Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π΅Π³ΠΎ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ. ΠΠΎ ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΡΡΠ³ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠ°ΠΉΠ»Π΅ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ·Π½Π°ΡΡ Π΅Π³ΠΎ ΡΠ°Π·ΠΌΠ΅Ρ), Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ². Π Π΄ΡΡΠ³ΠΈΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ (Π² MS-DOS, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ) ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΌ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄Π°ΠΆΠ΅ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΠΈΠΌΠ΅Π½Π°ΠΌ ΡΠ°ΠΉΠ»ΠΎΠ². ΠΠ°ΡΠ° ΡΠ΅Π»Ρ - ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΏΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎ-Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ Π½Π΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΠΎ, ΡΡΠΎ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎ-Π·Π°Π²ΠΈΡΠΈΠΌΠ°. ΠΡΠΎΠΈΠ»Π»ΡΡΡΡΠΈΡΡΠ΅ΠΌ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ fsize. Π€ΡΠ½ΠΊΡΠΈΡ fsize - ΡΠ°ΡΡΠ½ΡΠΉ ΡΠ»ΡΡΠ°ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ls: ΠΎΠ½Π° ΠΏΠ΅ΡΠ°ΡΠ°Π΅Ρ ΡΠ°Π·ΠΌΠ΅ΡΡ Π²ΡΠ΅Ρ ΡΠ°ΠΉΠ»ΠΎΠ², ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Π½ΡΡ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅. ΠΡΠ»ΠΈ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΈΠ· ΡΠ°ΠΉΠ»ΠΎΠ² ΡΠ°ΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠΌ, ΡΠΎ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ Π½Π΅ΠΌ, fsize ΠΎΠ±ΡΠ°ΡΠ°Π΅ΡΡΡ ΡΠ°ΠΌΠ° ΠΊ ΡΠ΅Π±Π΅. ΠΡΠ»ΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅ Π½Π΅Ρ, ΡΠΎ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΡΡΡ ΡΠ΅ΠΊΡΡΠΈΠΉ ΠΊΠ°ΡΠ°Π»ΠΎΠ³.
ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° Π²ΡΠΏΠΎΠΌΠ½ΠΈΠΌ ΡΡΡΡΠΊΡΡΡΡ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ Π² UNIXe. ΠΠ°ΡΠ°Π»ΠΎΠ³ - ΡΡΠΎ ΡΠ°ΠΉΠ», ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ ΡΠΏΠΈΡΠΎΠΊ ΠΈΠΌΠ΅Π½ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠΎΠΌ, Π³Π΄Π΅ ΠΎΠ½ΠΈ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Ρ. "ΠΠ΅ΡΡΠΎ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ" - ΡΡΠΎ ΠΈΠ½Π΄Π΅ΠΊΡ, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡΠΈΠΉ Π΄ΠΎΡΡΡΠΏ Π² Π΄ΡΡΠ³ΡΡ ΡΠ°Π±Π»ΠΈΡΡ, Π½Π°Π·ΡΠ²Π°Π΅ΠΌΡΡ "ΡΠΏΠΈΡΠΊΠΎΠΌ ΡΠ·Π»ΠΎΠ² inode". ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° ΠΈΠΌΠ΅Π΅ΡΡΡ ΡΠ²ΠΎΠΉ inode, Π³Π΄Π΅ ΡΠΎΠ±ΡΠ°Π½Π° Π²ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠ°ΠΉΠ»Π΅, Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ Π΅Π³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ. ΠΠ°ΠΆΠ΄ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· Π΄Π²ΡΡ ΡΠ°ΡΡΠ΅ΠΉ: ΠΈΠ· ΠΈΠΌΠ΅Π½ΠΈ ΡΠ°ΠΉΠ»Π° ΠΈ Π½ΠΎΠΌΠ΅ΡΠ° ΡΠ·Π»Π° inode.
Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, ΡΠΎΡΠΌΠ°Ρ ΠΈ ΡΠΎΡΠ½ΠΎΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° Π½Π΅ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ Π² ΡΠ°Π·Π½ΡΡ Π²Π΅ΡΡΠΈΡΡ ΡΠΈΡΡΠ΅ΠΌΡ. ΠΠΎΡΡΠΎΠΌΡ, ΡΡΠΎΠ±Ρ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΠΎΡΠ΄Π΅Π»ΠΈΡΡ ΠΎΡ Π½Π΅ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌΠΎΠΉ, ΡΠ°Π·ΠΎΠ±ΡΠ΅ΠΌ Π½Π°ΡΡ Π·Π°Π΄Π°ΡΡ Π½Π° Π΄Π²Π΅. ΠΠ½Π΅ΡΠ½ΠΈΠΉ ΡΡΠΎΠ²Π΅Π½Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΡΡΡΡΠΊΡΡΡΡ, Π½Π°Π·Π²Π°Π½Π½ΡΡ Dirent, ΠΈ ΡΡΠΈ ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ opendir, readdir ΠΈ closedir: Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅ΡΡΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎ-Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΠΉ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΈΠΌΠ΅Π½ΠΈ ΠΈ Π½ΠΎΠΌΠ΅ΡΡ ΡΠ·Π»Π° inode ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π°. ΠΡ Π±ΡΠ΄Π΅ΠΌ ΠΏΠΈΡΠ°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ fsize, ΡΠ°ΡΡΡΠΈΡΡΠ²Π°Ρ Π½Π° ΡΠ°ΠΊΠΎΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, Π° Π·Π°ΡΠ΅ΠΌ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ, ΠΊΠ°ΠΊ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΠΊΠ°Π·Π°Π½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄Π»Ρ ΡΠΈΡΡΠ΅ΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΡ ΡΡ ΠΆΠ΅ ΡΡΡΡΠΊΡΡΡΡ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π°, ΡΡΠΎ ΠΈ Version 7 ΠΈ System V UNIX. ΠΡΡΠ³ΠΈΠ΅ Π²Π°ΡΠΈΠ°Π½ΡΡ ΠΎΡΡΠ°Π²ΠΈΠΌ Π΄Π»Ρ ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠΉ.
Π‘ΡΡΡΠΊΡΡΡΠ° Dirent ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π½ΠΎΠΌΠ΅Ρ ΡΠ·Π»Π° inode ΠΈ ΠΈΠΌΡ. ΠΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½Π°Ρ Π΄Π»ΠΈΠ½Π° ΠΈΠΌΠ΅Π½ΠΈ ΡΠ°ΠΉΠ»Π° ΡΠ°Π²Π½Π° NAME_MAX - ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎ-Π·Π°Π²ΠΈΡΠΈΠΌΠΎ. Π€ΡΠ½ΠΊΡΠΈΡ opendir Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΡΡΠΊΡΡΡΡ, Π½Π°Π·Π²Π°Π½Π½ΡΡ DIR (ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ Ρ FILE), ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ readdir ΠΈ closedir. ΠΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΡΠΎΡΡΠ΅Π΄ΠΎΡΠΎΡΠ΅Π½Π° Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ dirent.h.
#define NAME_MAX 14 /* ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½Π°Ρ Π΄Π»ΠΈΠ½Π° ΠΈΠΌΠ΅Π½ΠΈ ΡΠ°ΠΉΠ»Π° */
/* ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎ-Π·Π°Π²ΠΈΡΠΈΠΌΠ°Ρ Π²Π΅Π»ΠΈΡΠΈΠ½Π° */
typedef struct { /* ΡΠ½ΠΈΠ²Π΅ΡΡ. ΡΡΡΡΠΊΡΡΡΠ° ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π°: */
long ino; /* Π½ΠΎΠΌΠ΅Ρ inode */
char name[NAME_MAX+1]; /* ΠΈΠΌΡ + Π·Π°Π²Π΅ΡΡΠ°ΡΡΠΈΠΉ '\0' */
} Dirent;
typedef struct { /* ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ DIR: Π±Π΅Π· Π±ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΠΈ ΠΈ Ρ.Π΄. */
int fd; /* ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° */
Dirent d; /* ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° */
} DIR;
DIR *opendir(char *dirname);
Dirent *readdir(DIR *dfd);
void closedir(DIR *dfd);
Π‘ΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² stat ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π° ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΏΠΎΠ»Π½ΡΡ ΠΎ Π½Π΅ΠΌ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡΡΡΡ Π² ΡΠ·Π»Π΅ inode, ΠΈΠ»ΠΈ -1 Π² ΡΠ»ΡΡΠ°Π΅ ΠΎΡΠΈΠ±ΠΊΠΈ. Π’Π°ΠΊ,
char *name;
struct stat stbuf;
int stat(char *, struct stat *);
stat(name, &stbuf);
Π·Π°ΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΡΡΡΠΊΡΡΡΡ stbuf ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ ΠΈΠ· ΡΠ·Π»Π° inode ΠΎ ΡΠ°ΠΉΠ»Π΅ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ name. Π‘ΡΡΡΠΊΡΡΡΠ°, ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΠ°Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ΅ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ stat Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² βΉsys/stat.hβΊ ΠΈ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΠΊ:
struct stat /* ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΈΠ· inode, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠ°Ρ stat */
{
dev_t st_dev; /* ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ */
ino_t st_ino; /* Π½ΠΎΠΌΠ΅Ρ inode */
short st_mode; /* ΡΠ΅ΠΆΠΈΠΌΠ½ΡΠ΅ Π±ΠΈΡΡ */
short st_nlink; /* ΡΠΈΡΠ»ΠΎ ΡΠ²ΡΠ·Π΅ΠΉ Ρ ΡΠ°ΠΉΠ»ΠΎΠΌ */
short st_uid; /* ΠΈΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ-ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΈΠΊΠ° */
short st_gid; /* ΠΈΠΌΡ Π³ΡΡΠΏΠΏΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΈΠΊΠ° */
dev_t st_rdev; /* Π΄Π»Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² */
off_t st_size; /* ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ°ΠΉΠ»Π° Π² ΡΠΈΠΌΠ²ΠΎΠ»Π°Ρ */
time_t st_atime; /* Π²ΡΠ΅ΠΌΡ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ */
time_t st_mtime; /* Π²ΡΠ΅ΠΌΡ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ */
time_t st_ctime; /* Π²ΡΠ΅ΠΌΡ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ inode */