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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования Π‘ΠΈ. ИзданиС 3-Π΅, исправлСнноС». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 49

Автор Π‘Ρ€Π°ΠΉΠ°Π½ ΠšΠ΅Ρ€Π½ΠΈΠ³Π°Π½

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 */