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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«UNIX β€” ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Π°Ρ срСда программирования». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 58

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

{

 char *p, guess[DIRSIZ+1], best[DIRSIZ+1];

 char *new = newname, *old = oldname;


 for (;;) {

  while (*old == '/') /* skip slashes */

   *new++ = *old++;

  *new = '\0';

  if (*old == '\0') /* exact or corrected */

   return strcmp(oldname, newname) != 0;

  p = guess; /* copy next component into guess */

  for (; *old != '/' && *old != '\0'; old++)

   if (p < guess+DIRSIZ)

    *p++ = *old;

   *p = '\0';

   if (mindist(newname, guess, best) >= 3)

    return -1; /* hopeless */

   for (p = best; *new = *p++; ) /* add to end */

    new++; /* of newname */

 }

}


mindist(dir, guess, best) /* search dir for guess */

 char *dir, *guess, *best;

{

 /* set best, return distance 0..3 */

 int d, nd, fd;

 struct {

  ino_t ino;

  char name[DIRSIZ+1]; /* 1 more than in dir.h */

 } nbuf;


 nbuf.name[DIRSIZ] = '\0'; /* +1 for terminal '\0' */

 if (dir[0] == '\0') /* current directory */

  dir = ".";

 d = 3; /* minimum distance */

 if ((fd = open(dir, 0)) == -1)

  return d;

 while (read(fd,(char *)&nbuf, sizeof(struct direct)) > 0)

  if (nbuf.ino) {

   nd = spdist(nbuf.name, guess);

   if (nd <= d && nd != 3) {

    strcpy(best, nbuf.name);

    d = nd;

    if (d == 0) /* exact match */

     break;

   }

  }

 close(fd);

 return d;


Если имя ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, Π΄Π°Π½Π½ΠΎΠ΅ mindist, пустоС, отыскиваСтся '.'. Ѐункция mindist Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ ΠΎΠ΄Π½Ρƒ строку ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π·Π° ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·. ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π±ΡƒΡ„Π΅Ρ€ для read прСдставляСт собой структуру, Π° Π½Π΅ массив символов. ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ sizeof, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ число Π±Π°ΠΉΡ‚ΠΎΠ² ΠΈ привСсти адрСс ΠΊ ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½ΠΎΠΌΡƒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ.

Если строка ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ (ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ„Π°ΠΉΠ» ΡƒΠ΄Π°Π»Π΅Π½), Ρ‚ΠΎ ΠΏΠΎΠ»Π΅ индСкса Π² Π½Π΅ΠΉ Ρ€Π°Π²Π½ΠΎ Π½ΡƒΠ»ΡŽ ΠΈ ΠΎΠ½Π° пропускаСтся. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° расстояния осущСствляСтся ΠΊΠ°ΠΊ

if (nd <= d...)

Π° Π½Π΅ ΠΊΠ°ΠΊ

if (nd < d...)

поэтому любой ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΉ символ Π΄Π°Π΅Ρ‚ Π»ΡƒΡ‡ΡˆΠ΅Π΅ совпадСниС, Ρ‡Π΅ΠΌ имя '.', ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ всСгда являСтся ΠΏΠ΅Ρ€Π²ΠΎΠΉ строкой Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅.

/* spdist: return distance between two names */ /*

 * very rough spelling metric:

 * 0 if the strings are identical

 * 1 if two chars are transposed

 * 2 if one char wrong, added or deleted

 * 3 otherwise

 */

#define EQ(s,t) (strcmp(s,t) == 0)


spdist(s, t)

 char *s, *t;

{

 while (*s++ == *t)

  if (*t++ == '\0')

   return 0; /* exact match */

 if (*--s) {

  if (*t) {

   if (s[1] && t[1] && *s == t[1] && *t == s[1] && EQ(s+2, t+2))

    return 1; /* transposition */

   if (EQ(s+1, t+1))

    return 2; /* 1 char mismatch */

  }

  if (EQ(s+1, t))

   return 2; /* extra character */

 }

 if (*t && EQ(s, t+1))

  return 2; /* missing character */

 return 3;

}

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρƒ нас Π΅ΡΡ‚ΡŒ spname, нСслоТно Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ†ΠΈΠΈ написания Π² p:

/* p: print input in chunks (version 4) */


#include <stdio.h>

#define PAGESIZE 22


char *progname; /* program name for error message */


main(argc, argv)

 int argc;

 char *argv[];

{

 FILE *fp, *efopen();

 int i, pagesize = PAGESIZE;

 char *p, *getenv(), buf[BUFSIZ];


 progname = argv[0];

 if ((p=getenv("PAGESIZE")) != NULL)

  pagesize = atoi(p);

 if (argc > 1 && argv[1][0] == '-') {

  pagesize = atoi(&argv[1][1]);

  argc--;

  argv++;

 }

 if (argc == 1)

  print(stdin, pagesize);

 else

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

   switch (spname(argv[i], buf)) {

   case -1: /* no match possible */

    fp = efopen(argv[i], "r");

    break;

   case 1: /* corrected */

    fprintf(stderr, "\"%s\"? ", buf);

    if (ttyin() == 'n')

     break;

    argv[i] = buf; /* fall through... */

   case 0: /* exact match */

    fp = efopen(argv[i], "r");

    print(fp, pagesize);

    fclose(fp);

   }

 exit(0);

}

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ†ΠΈΠΈ написания Π½Π΅ слСдуСт слСпо ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΈΠΌΠ΅Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ². Они Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΡΠΎΡ‡Π΅Ρ‚Π°ΡŽΡ‚ΡΡ с p, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ p β€” диалоговая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, Π½ΠΎ подходят ΠΈ для Π½Π΅Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.5

Насколько Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ эвристику для выявлСния Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ совпадСния Π² spname? НапримСр, Π½Π΅Ρ€Π°Π·ΡƒΠΌΠ½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ рСгулярный Ρ„Π°ΠΉΠ» Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ ΠΎΠ½ Π±Ρ‹Π» ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠΌ; тСкущая вСрсия это допускаСт.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅: 7.6

Имя tx совпадаСт с ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ ΠΈΠΌΠ΅Π½Π΅ΠΌ tc, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ оказываСтся послСдним Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ для любого ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠ³ΠΎ символа с. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π»ΠΈ Π²Ρ‹ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ Π»ΡƒΡ‡ΡˆΡƒΡŽ ΠΌΠ΅Ρ€Ρƒ расстояния? Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ Π΅Π΅ ΠΈ посмотритС, насколько Ρ…ΠΎΡ€ΠΎΡˆΠΎ эта конструкция Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.7

Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π»ΠΈ p ΠΎΡ‰ΡƒΡ‚ΠΈΠΌΠΎ быстрСС, Ссли Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° выполняСтся большими порциями?

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.8

ΠœΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠΉΡ‚Π΅ spname, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ имя, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ являСтся прСфиксом ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ, Ссли нСльзя Π½Π°ΠΉΡ‚ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ совпадСния. Как слСдуСт Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, Ссли нСсколько ΠΈΠΌΠ΅Π½ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ с прСфиксом?

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.9

ΠšΠ°ΠΊΡƒΡŽ ΠΏΠΎΠ»ΡŒΠ·Ρƒ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΠ· spname? БконструируйтС ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π»Π° Π±Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΏΡ€Π΅ΠΆΠ΄Π΅, Ρ‡Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, ΠΊΠ°ΠΊ Π²

$ fix prog filenames...

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π²Π΅Ρ€ΡΠΈΡŽ cd, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ spname? Как Π±Ρ‹ Π²Ρ‹ Π΅Π΅ встроили?

7.3 Ѐайловая систСма: индСксныС дСскрипторы

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ обсудим систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС, Π² частности ΠΊ Ρ‚Π°ΠΊΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ„Π°ΠΉΠ»Π°Ρ…, ΠΊΠ°ΠΊ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹, Π΄Π°Ρ‚Ρ‹ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, ΠΏΡ€Π°Π²Π° доступа ΠΈ Ρ‚.Π΄. Π­Ρ‚ΠΈ систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ всю ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π³Π»Π°Π²Π΅.

Для Π½Π°Ρ‡Π°Π»Π° разбСрСмся Π² самом индСксном дСскрипторС. Π§Π°ΡΡ‚ΡŒ индСксного дСскриптора описываСтся структурой stat, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Π² <sys/stat.h>:

struct stat /* структура, возвращаСмая stat */

{

 dev_t st_dev;    /* устройство, содСрТащСС Ρ„Π°ΠΉΠ» */

 ino_t st_ino;    /* индСкс */

 short st_mod;    /* Π±ΠΈΡ‚Ρ‹ Ρ€Π΅ΠΆΠΈΠΌΠ° */

 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; /* врСмя послСднСго измСнСния

                     ΠΈΠ½Π΄Π΅ΠΊΡΠ½ΠΎΠ³ΠΎ дСскриптора ΠΈΠ»ΠΈ Ρ„Π°ΠΉΠ»Π° */

}

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΏΠΎΠ»Π΅ΠΉ ΠΏΠΎΡΡΠ½ΡΡŽΡ‚ΡΡ примСчаниями. Π’ΠΈΠΏΡ‹ Π²Ρ€ΠΎΠ΄Π΅ dev_t ΠΈ ino_t ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² <sys/types.h>, ΠΊΠ°ΠΊ ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½ΠΎ Π²Ρ‹ΡˆΠ΅. ПолС st_mode содСрТит мноТСство Ρ„Π»Π°Π³ΠΎΠ², ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΡ… Ρ„Π°ΠΉΠ»; для удобства опрСдСлСния Ρ„Π»Π°Π³ΠΎΠ² Ρ‚Π°ΠΊΠΆΠ΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‡Π°ΡΡ‚ΡŒΡŽ Ρ„Π°ΠΉΠ»Π° <sys/stat.h>:

#define S_IFMT   0170000  /* Ρ‚ΠΈΠΏ Ρ„Π°ΠΉΠ»Π° */

#define  S_IFDIR 0040000  /* ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ */

#define  S_IFCHR 0020000  /* Π±Π°ΠΉΡ‚-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ */

#define  S_IFBLK 0060000  /* Π±Π»ΠΎΠΊ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ */

#define  S_IFREG 0100000  /* рСгулярный */

#define S_SUID   0004000  /* установка ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΏΡ€ΠΈ

                             Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ */

#define S_ISGID  0002000  /* установка ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° Π³Ρ€ΡƒΠΏΠΏΡ‹

                             ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ */

#define S_ISVTX  0001000  /* ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π²Ρ‹Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹ΠΉ тСкст Π΄Π°ΠΆΠ΅ послС

                             ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΡ */

#define S_IREAD  0000400  /* Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Π²Π»Π°Π΄Π΅Π»Π΅Ρ† */

#define S_IWRITE 0000200  /* Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ, Π²Π»Π°Π΄Π΅Π»Π΅Ρ† */

#define S_IEXEC  0000100  /* Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅/поиск, Π²Π»Π°Π΄Π΅Π»Π΅Ρ† */

Π˜Π½Π΄Π΅ΠΊΡΠ½Ρ‹ΠΉ дСскриптор для Ρ„Π°ΠΉΠ»Π° доступСн Π΄Π²ΡƒΠΌ систСмным Π²Ρ‹Π·ΠΎΠ²Π°ΠΌ stat ΠΈ fstat. ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ stat ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ являСтся имя Ρ„Π°ΠΉΠ»Π°, Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ β€” информация ΠΈΠ· индСксного дСскриптора для этого Ρ„Π°ΠΉΠ»Π° (ΠΈΠ»ΠΈ β€” 1 ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ ошибки). Fstat выполняСт Ρ‚Π΅ ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ дСскриптора ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° (Π½Π΅ Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ указатСля Π½Π° FILE). Π˜Π½Ρ‹ΠΌΠΈ словами,

char *name;

int fd;

struct stat stbuf;


stat(name, &stbuf);

fstat(fd, &stbuf);

заполняСт структуру stbuf ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΈΠ· индСксного дСскриптора для ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π° ΠΈΠ»ΠΈ дСскриптора Ρ„Π°ΠΉΠ»Π° fd.

Зная всС это, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΊ написанию Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. НачнСм с вСрсии checkmail β€” ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° Π‘ΠΈ, которая слСдит Π·Π° содСрТимым вашСго ΠΏΠΎΡ‡Ρ‚ΠΎΠ²ΠΎΠ³ΠΎ ящика. Если Ρ„Π°ΠΉΠ» увСличиваСтся, checkmail Π²Ρ‹Π΄Π°Π΅Ρ‚ сообщСниС: "Π£ вас Π΅ΡΡ‚ΡŒ коррСспондСнция" ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π·Π²ΠΎΠ½ΠΎΠΊ. (ΠŸΡ€ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠΈ Ρ„Π°ΠΉΠ»Π°, Π²ΠΈΠ΄ΠΈΠΌΠΎ, ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ успСли ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈ ΡΠ±Ρ€ΠΎΡΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΏΠΎΡ‡Ρ‚ΠΎΠ²ΡƒΡŽ ΠΊΠΎΡ€Ρ€Π΅ΡΠΏΠΎΠ½Π΄Π΅Π½Ρ†ΠΈΡŽ, сообщСниС Π½Π΅ трСбуСтся.) Для ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ шага Π²Ρ‹ сдСлали Π²ΠΏΠΎΠ»Π½Π΅ достаточно, Π° ΠΊΠΎΠ³Π΄Π° ваша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π²Ρ‹ станСтС Π·Π½Π°Ρ‚ΠΎΠΊΠΎΠΌ.