progname = argv[0];
if (argc != 3)
error("Usage: %s from to", progname);
if ((f1 = open(argv[1], 0)) == -1)
error("can't open %s", argv[1]);
if ((f2 = creat(argv[2], PERMS)) == -1)
error("can't create %s", argv[2]);
while ((n = read(f1, buf, BUFSIZ)) > 0)
if (write(f2, buf, n) != n)
error("write error", (char*)0);
exit(0);
}
error ΠΌΡ ΠΎΠ±ΡΡΠ΄ΠΈΠΌ Π½ΠΈΠΆΠ΅.
Π§ΠΈΡΠ»ΠΎ ΡΠ°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΎΡΠΊΡΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΎΠΉ, ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΎ (ΠΎΠ±ΡΡΠ½ΠΎ ΠΏΠΎΡΡΠ΄ΠΊΠ° 20; ΡΠΌ. NOFILE Π² <SYS/param.h>). ΠΠΎΡΡΠΎΠΌΡ Π»ΡΠ±Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΏΡΠ΅Π΄ΡΡΠΎΠΈΡ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»ΠΎΠ², Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ Π³ΠΎΡΠΎΠ²Π° Π½Π΅ΠΎΠ΄Π½ΠΎΠΊΡΠ°ΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ΄Π½ΠΈ ΠΈ ΡΠ΅ ΠΆΠ΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ ΡΠ°ΠΉΠ»ΠΎΠ². Π‘ΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² close ΡΠ°Π·ΡΡΠ²Π°Π΅Ρ ΡΠ²ΡΠ·Ρ ΠΌΠ΅ΠΆΠ΄Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΈ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠΌ ΡΠ°ΠΉΠ»Π°, ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Ρ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌ Π΄ΡΡΠ³ΠΈΠΌ ΡΠ°ΠΉΠ»ΠΎΠΌ. ΠΠ°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²ΠΎΠΌ exit ΠΈ Π²ΠΎΠ·Π²ΡΠ°Ρ ΠΈΠ· ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π·Π°ΠΊΡΡΠ²Π°ΡΡ Π²ΡΠ΅ ΠΎΡΠΊΡΡΡΡΠ΅ ΡΠ°ΠΉΠ»Ρ. ΠΡΠ·ΠΎΠ² ΡΠΈΡΡΠ΅ΠΌΡ unlink ΡΠ΄Π°Π»ΡΠ΅Ρ ΡΠ°ΠΉΠ» ΠΈΠ· ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ.
ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΎΡΠΈΠ±ΠΎΠΊ: errnoΠΠ±ΡΡΠΆΠ΄Π°Π΅ΠΌΡΠ΅ Π·Π΄Π΅ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ Π²ΡΠ·ΠΎΠ²Ρ, Π° ΠΏΠΎ ΡΡΡΠΈ Π²ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ Π²ΡΠ·ΠΎΠ²Ρ, ΠΌΠΎΠ³ΡΡ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ. ΠΠ±ΡΡΠ½ΠΎ ΠΎΠ½ΠΈ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡΡΡΡ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ -1. ΠΠ½ΠΎΠ³Π΄Π° ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π·Π½Π°ΡΡ, ΠΊΠ°ΠΊΠ°Ρ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΡΠΈΠ±ΠΊΠ° ΠΏΡΠΎΠΈΠ·ΠΎΡΠ»Π°, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ Π²ΡΠ·ΠΎΠ²Ρ, ΠΊΠΎΠ³Π΄Π° ΡΡΠΎ ΠΏΡΠΈΠ΅ΠΌΠ»Π΅ΠΌΠΎ, ΠΎΡΡΠ°Π²Π»ΡΡΡ Π½ΠΎΠΌΠ΅Ρ ΠΎΡΠΈΠ±ΠΊΠΈ Π²ΠΎ Π²Π½Π΅ΡΠ½Π΅ΠΉ ΡΠ΅Π»ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π½Π°Π·ΡΠ²Π°Π΅ΠΌΠΎΠΉ errno. (ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ Π½ΠΎΠΌΠ΅ΡΠΎΠ² ΠΎΡΠΈΠ±ΠΎΠΊ ΠΎΠ±ΡΡΡΠ½ΡΠ΅ΡΡΡ Π²ΠΎ Π²Π²Π΅Π΄Π΅Π½ΠΈΠΈ ΠΊ ΡΠ°Π·Π΄. 2 ΡΠΏΡΠ°Π²ΠΎΡΠ½ΠΎΠ³ΠΎ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²Π° ΠΏΠΎ UNIX.) Π‘ ΠΏΠΎΠΌΠΎΡΡΡ errno Π²Π°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ΅ΠΌ Π²ΡΠ·Π²Π°Π½Π° Π½Π΅ΡΠ΄Π°ΡΠ° ΠΏΡΠΈ ΠΎΡΠΊΡΡΡΠΈΠΈ ΡΠ°ΠΉΠ»Π° β ΡΠ΅ΠΌ, ΡΡΠΎ ΠΎΠ½ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ, ΠΈΠ»ΠΈ ΡΠ΅ΠΌ, ΡΡΠΎ Ρ Π²Π°Ρ Π½Π΅Ρ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ Π½Π° Π΅Π³ΠΎ ΡΡΠ΅Π½ΠΈΠ΅. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Π΅ΡΡΡ ΠΌΠ°ΡΡΠΈΠ² ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΡ ΡΡΡΠΎΠΊ sys_errlist, ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΡΠ΅ΠΌΡΠΉ errno, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΡ ΡΠΈΡΠ»ΠΎ Π² ΡΡΡΠΎΠΊΡ, ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΡΠΌΡΡΠ» ΠΎΡΠΈΠ±ΠΊΠΈ. ΠΠ°ΡΠ° Π²Π΅ΡΡΠΈΡ error ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΡΠΈ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ :
error(s1, s2) /* print error message and die */
char *s1, *s2;
{
extern int errno, sys_nerr;
extern char *sys_errlist[], *progname;
if (progname)
fprintf(stderr, "%s: ", progname);
fprintf(stderr, s1, s2);
if (errno > 0 && errno < sys_nerr)
fprintf (stderr, " (%s)", sys_errlist[errno]);
fprintf(stderr, "\n");
exit(1);
}
Errno ΠΏΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½ΠΎ ΡΠ°Π²Π½Π° Π½ΡΠ»Ρ ΠΈ Π²ΡΠ΅Π³Π΄Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΠΌΠ΅Π½ΡΡΠ΅, ΡΠ΅ΠΌ sys_herr. ΠΠ½Π° Π½Π΅ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π½ΡΠ»Π΅Π²ΠΎΠΉ Π²Π½ΠΎΠ²Ρ ΠΏΡΠΈ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΠ΅, ΠΏΠΎΡΡΠΎΠΌΡ Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΎΠ±Π½ΡΠ»ΡΡΡ Π΅Π΅ ΠΏΠΎΡΠ»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠΈ, Π΅ΡΠ»ΠΈ Π²Π°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ. Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ°Ρ Π² Π½Π°ΡΠ΅ΠΉ Π²Π΅ΡΡΠΈΠΈ cp ΠΏΠΎΡΠ²Π»ΡΡΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
$ cp foo bar
cp: can't open foo (ΠΠ΅Ρ ΡΠ°ΠΊΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° ΠΈΠ»ΠΈ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π°)
$ date >foo; chmod 0 foo Π‘ΠΎΠ·Π΄Π°ΡΡ Π½Π΅ΡΠΈΡΠ°Π΅ΠΌΡΠΉ ΡΠ°ΠΉΠ»
$ cp too bar
cp: can't open foo (Π ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠΈ ΠΎΡΠΊΠ°Π·Π°Π½ΠΎ)
$
ΠΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΉ Π΄ΠΎΡΡΡΠΏ: lseekΠ€Π°ΠΉΠ» Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π° ΠΎΠ±ΡΡΠ½ΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΠΉ: ΠΊΠ°ΠΆΠ΄ΡΠΉ read ΠΈΠ»ΠΈ write Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ ΠΌΠ΅ΡΡΠΎ Π² ΡΠ°ΠΉΠ»Π΅ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΠΏΠΎΡΠ»Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ Π²ΡΠ·ΠΎΠ²Π΅. ΠΠ΄Π½Π°ΠΊΠΎ ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΡΠ°ΠΉΠ» ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠΎΡΠΈΡΠ°Π½ ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡΠ°Π½ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅. Π‘ΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² lseek ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°ΡΡΡΡ ΠΏΠΎ ΡΠ°ΠΉΠ»Ρ, Π½Π΅ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡ Π½ΠΈ ΡΡΠ΅Π½ΠΈΡ, Π½ΠΈ Π·Π°ΠΏΠΈΡΠΈ:
int fd, origin;
long offset, pos, lseek();
pos = lseek(fd, offset, origin);
Π’Π΅ΠΊΡΡΠ°Ρ ΠΏΠΎΠ·ΠΈΡΠΈΡ Π² ΡΠ°ΠΉΠ»Π΅ Ρ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠΌ fd ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅ΡΡΡ ΠΊ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ offset, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΡΡΡΠΈΡΡΠ²Π°Π΅ΡΡΡ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΌΠ΅ΡΡΠ°, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠ³ΠΎ origin. ΠΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΡ ΡΡΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡΠΈ Π±ΡΠ΄ΡΡ Π½Π°ΡΠΈΠ½Π°ΡΡΡΡ Ρ ΡΡΠΎΠΉ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ. Origin ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ 0, 1, 2, Π·Π°Π΄Π°Π²Π°Ρ ΡΠ΅ΠΌ ΡΠ°ΠΌΡΠΌ Π½Π°ΡΠ°Π»ΠΎ ΠΎΡΡΡΠ΅ΡΠ° Π·Π½Π°ΡΠ΅Π½ΠΈΡ offset β ΠΎΡ Π½Π°ΡΠ°Π»Π°, ΠΎΡ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΠΈΠ»ΠΈ ΠΎΡ ΠΊΠΎΠ½ΡΠ° ΡΠ°ΠΉΠ»Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ.
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΅ΡΡΡ Π½ΠΎΠ²Π°Ρ Π°Π±ΡΠΎΠ»ΡΡΠ½Π°Ρ ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΈΠ»ΠΈ -1 ΠΏΡΠΈ ΠΎΡΠΈΠ±ΠΊΠ΅. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π² ΡΠ°ΠΉΠ» Π½ΡΠΆΠ½ΠΎ Π΄ΠΎΠΉΡΠΈ Π΄ΠΎ Π΅Π³ΠΎ ΠΊΠΎΠ½ΡΠ°, Π° Π·Π°ΡΠ΅ΠΌ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Π·Π°ΠΏΠΈΡΡ:
lseek(fd, 0L, 2);
Π§ΡΠΎΠ±Ρ Π²Π΅ΡΠ½ΡΡΡΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΠΊ Π½Π°ΡΠ°Π»Ρ ("ΠΏΠ΅ΡΠ΅ΠΌΠΎΡΠ°ΡΡ"), Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π²ΡΠ·Π²Π°ΡΡ
lseek(fd, 0L, 0);
ΠΠ»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ
pos = lseek(fd, 0L, 1);
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π°ΡΠ³ΡΠΌΠ΅Π½Ρ 0L: ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΅ΡΡΡ Π΄Π»ΠΈΠ½Π½ΠΎΠ΅ ΡΠ΅Π»ΠΎΠ΅. ('l' Π² lseek ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ 'long' β Π΄Π»ΠΈΠ½Π½ΡΠΉ, ΡΡΠΎΠ±Ρ ΠΎΡΠ»ΠΈΡΠΈΡΡ Π΅Π³ΠΎ ΠΎΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° seek Π² ΡΠ΅ΡΡΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ, Π³Π΄Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΠΊΠΎΡΠΎΡΠΊΠΈΠ΅ ΡΠ΅Π»ΡΠ΅.)
Π‘ ΠΏΠΎΠΌΠΎΡΡΡ 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;
{