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

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

Автор ΠšΠ΅Ρ€Π½ΠΈΠ³Π°Π½ Π‘Ρ€Π°ΠΉΠ°Π½ Уилсон

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ

lseek
ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΊΠ°ΠΊ с большими массивами, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΏΡ€ΠΈ этом врСмя доступа ΠΊ Π½ΠΈΠΌ возрастаСт. НапримСр, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ функция Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ любоС число Π±Π°ΠΉΡ‚ΠΎΠ² ΠΈΠ· любого мСста Π² Ρ„Π°ΠΉΠ»Π΅:

get(fd, pos, buf, n) /* read n bytes from position pos */

Β int fd, n;

Β long pos;

Β char *buf;

{

Β if (lseek(fd, pos, 0) == -1) /* get to pos */

Β  return -1;

Β return read(fd, buf, n);

}

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

ΠœΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠΉΡ‚Π΅

readslow
Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ имя Ρ„Π°ΠΉΠ»Π° Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, Ссли ΠΎΠ½ΠΎ присутствуСт. Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅
-Π΅
:

$ readslow -Π΅

заставляСт

readslow
ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΊΠΎΠ½Π΅Ρ† Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅. ΠšΠ°ΠΊΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
lseek
ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌ ΠΊΠ°Π½Π°Π»ΠΎΠΌ?

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

ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡˆΠΈΡ‚Π΅

efopen
ΠΈΠ· Π³Π». 6, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ error.

7.2 Ѐайловая систСма: ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ

Наша ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ Ρ‚Π΅ΠΌΠ° β€” ΠΊΠ°ΠΊ ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ². ΠŸΡ€ΠΈ этом ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ Π½ΠΎΠ²Ρ‹Π΅ систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹, Π° лишь нСсколько старых Π² Π½ΠΎΠ²ΠΎΠΌ контСкстС. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ

spname
, которая пытаСтся ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ с Π½Π΅Π²Π΅Ρ€Π½ΠΎ написанными ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ². Ѐункция

n = spname(name, newname);

ΠΈΡ‰Π΅Ρ‚ Ρ„Π°ΠΉΠ» с ΠΈΠΌΠ΅Π½Π΅ΠΌ, "достаточно Π±Π»ΠΈΠ·ΠΊΠΈΠΌ" ΠΊ name. Если Ρ‚Π°ΠΊΠΎΠ΅ имя Π½Π°ΠΉΠ΄Π΅Π½ΠΎ, ΠΎΠ½ΠΎ копируСтся Π²

newname
. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ n, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅
spname
, Ρ€Π°Π²Π½ΠΎ -1, Ссли Π½ΠΈΡ‡Π΅Π³ΠΎ достаточно Π±Π»ΠΈΠ·ΠΊΠΎΠ³ΠΎ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ, 0 β€” ΠΏΡ€ΠΈ Ρ‚ΠΎΡ‡Π½ΠΎΠΌ совпадСнии ΠΈ 1, Ссли Π±Ρ‹Π»Π° сдСлана коррСкция.

Spname
являСтся ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΊ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ p: Ссли Π²Ρ‹ ΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ», Π½ΠΎ Π½Π΅Π²Π΅Ρ€Π½ΠΎ написали имя,
p
спросит вас, Π½Π΅ ΠΈΠΌΠ΅Π»ΠΈ Π»ΠΈ Π²Ρ‹ Π² Π²ΠΈΠ΄Ρƒ Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ΅:

$ p /urs/srx/ccmd/p/spnam.с 
ΠžΡ‡Π΅Π½ΡŒ ΠΏΠ»ΠΎΡ…ΠΎΠ΅ имя

"/usr/src/cmd/p/spname.с"? y
ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Π°Ρ коррСкция принята

/* spname: Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π²Π΅Ρ€Π½ΠΎ написанноС имя Ρ„Π°ΠΉΠ»Π° */

...

Пока ΠΌΡ‹ пишСм имя Ρ„Π°ΠΉΠ»Π°,

spname
пытаСтся ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π΅Π³ΠΎ ΡΠΎΡΡ‚Π°Π²Π½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ нСсовпавшая Π±ΡƒΠΊΠ²Π° Π±Ρ‹Π»Π° ΠΎΠΏΡƒΡ‰Π΅Π½Π°, оказалась лишнСй, просто Π½Π΅Π²Π΅Ρ€Π½Π° ΠΈΠ»ΠΈ помСнялась мСстами с Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π±ΡƒΠΊΠ²ΠΎΠΉ. Π­Ρ‚ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠ΅ срСдство рассчитано Π½Π° Ρ‚ΠΎΠ³ΠΎ, ΠΊΡ‚ΠΎ ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ.

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, умСстно ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ ΠΎΠ±Π·ΠΎΡ€ структуры Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы. ΠšΠ°Ρ‚Π°Π»ΠΎΠ³ прСдставляСт собой Ρ„Π°ΠΉΠ», содСрТащий список ΠΈΠΌΠ΅Π½ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅, Π³Π΄Π΅ ΠΎΠ½ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Ρ‹. ΠœΠ΅ΡΡ‚ΠΎ размСщСния опрСдСляСтся индСксом Π² Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ индСксной Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ². Π’ записи индСксной Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ содСрТится вся информация ΠΎ Ρ„Π°ΠΉΠ»Π΅, ΠΊΡ€ΠΎΠΌΠ΅ Π΅Π³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ. Π‘Ρ‚Ρ€ΠΎΠΊΠ° ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, состоит ΠΈΠ· Π΄Π²ΡƒΡ… элСмСнтов β€” индСкса Ρ„Π°ΠΉΠ»Π° ΠΈ Π΅Π³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ. Π’ΠΎΡ‡Π½ΠΎΠ΅ описаниС ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² Ρ„Π°ΠΉΠ»Π΅

<sys/dir.h>
:

$ cat /usr/include/sys/dir.h

#define DIRSIZ 14 /* максимальная Π΄Π»ΠΈΠ½Π° ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π° */

struct direct /* структура строки ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° */

{

Β ino_t d_ino; /* Π½ΠΎΠΌΠ΅Ρ€ индСксного дСскриптора */

Β char d_name[DIRSIZ]; /* имя Ρ„Π°ΠΉΠ»Π° */

};

$

"Π’ΠΈΠΏ"

ino_t
это
typedef
, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΉ индСкс Π² индСксной Ρ‚Π°Π±Π»ΠΈΡ†Π΅. Он являСтся ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΌ Ρ†Π΅Π»Ρ‹ΠΌ Π±Π΅Π· Π·Π½Π°ΠΊΠ° (
unsigned short
) Π² вСрсиях систСмы для PDP-11 ΠΈ VAX ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½Ρ‹ΠΌ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ машинС. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΈΠΏΠ°
typedef
. ΠŸΠΎΠ»Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ "систСмных" Ρ‚ΠΈΠΏΠΎΠ² находится Π²
<sys/types.h>
, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ Π΄ΠΎ
<sys/dir.h>
.

ДСйствия

spname
достаточно прямолинСйны, хотя ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ выполнСния Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π³Ρ€Π°Π½ΠΈΡ‡Π½Ρ‹Ρ… условий. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ имя Ρ„Π°ΠΉΠ»Π°
/d1/d2/f
. Основная идСя состоит Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ: ΠΎΡ‚Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ (
/
), Π½Π°ΠΉΡ‚ΠΈ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ имя, Π±Π»ΠΈΠ·ΠΊΠΎΠ΅ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π΅ (
d1
), Π·Π°Ρ‚Π΅ΠΌ Π½Π°ΠΉΡ‚ΠΈ имя, Π±Π»ΠΈΠ·ΠΊΠΎΠ΅ ΠΊ
d2
, ΠΈ Ρ‚.Π΄. Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ достигнуто ΠΏΠΎΠ»Π½ΠΎΠ΅ совпадСниС для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ составной части. Если Π½Π° ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ стадии Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ Π½Π΅ окаТСтся подходящСго ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚Π°, поиск прСкратится.

ΠœΡ‹ Ρ€Π°Π·Π±ΠΈΠ»ΠΈ процСсс Π½Π° Ρ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π‘Π°ΠΌΠ°

spname
выдСляСт ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΏΡƒΡ‚ΠΈ ΠΈ составляСт ΠΈΠ· Π½ΠΈΡ… имя Ρ„Π°ΠΉΠ»Π°, Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰Π΅Π΅ с исходным. Ѐункция
mindist
ΠΈΡ‰Π΅Ρ‚ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ Ρ„Π°ΠΉΠ» с ΠΈΠΌΠ΅Π½Π΅ΠΌ, блиТайшим ΠΊ составлСнному Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ
spname
. Ѐункция
spdist
вычисляСт "расстояниС" ΠΌΠ΅ΠΆΠ΄Ρƒ двумя ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ.

/* spname: return correctly spelled filename */

/*

Β * spname(oldname, newname) char *oldname, *newname;

Β * returns -1 if no reasonable match to oldname,

Β * 0 if exact match,

Β *1 if corrected.

Β * stores corrected name in newname.

Β */

#include <sys/types.h>

#include <sys/dir.h>

spname(oldname, newname)

Β char *oldname, *newname;

{

Β 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;