error("cp: Π½Π΅ ΠΌΠΎΠ³Ρ ΠΎΡΠΊΡΡΡΡ ΡΠ°ΠΉΠ» %s", argv[1]);
if ((f2 = creat(argv[2], PERMS)) == -1)
error("cp: Π½Π΅ ΠΌΠΎΠ³Ρ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ°ΠΉΠ» %s, ΡΠ΅ΠΆΠΈΠΌ %03o", argv[2], PERMS);
while ((n = read(f1, buf, BUFSIZ)) βΊ 0)
if (write(f2, buf, n) != n)
error ("cp: ΠΎΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ Π·Π°ΠΏΠΈΡΠΈ Π² ΡΠ°ΠΉΠ» %s", argv[2]);
return 0;
}
ΠΠ°Π½Π½Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ°ΠΉΠ» Π²ΡΠ²ΠΎΠ΄Π° Ρ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ ΠΏΡΠ°Π²Π°ΠΌΠΈ Π΄ΠΎΡΡΡΠΏΠ°, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌΡΠΌΠΈ ΠΊΠΎΠ΄ΠΎΠΌ 0666. Π‘ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° stat, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΠΎΠΏΠΈΡΠ°Π½ Π² ΠΏΠ°ΡΠ°Π³ΡΠ°ΡΠ΅ 8.6, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΡΠ΅ΠΆΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΡΠ°ΠΉΠ»Π° ΠΈ Π·Π°Π΄Π°ΡΡ ΡΠΎΡ ΠΆΠ΅ ΡΠ΅ΠΆΠΈΠΌ Π΄Π»Ρ ΠΊΠΎΠΏΠΈΠΈ.
ΠΠ°ΠΌΠ΅ΡΠΈΠΌ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ error, Π²ΡΠ·ΡΠ²Π°Π΅ΠΌΠ°Ρ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌ ΡΠΈΡΠ»ΠΎΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ², Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ ΠΏΠΎΡ ΠΎΠΆΠ° Π½Π° printf. Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ error ΠΈΠ»Π»ΡΡΡΡΠΈΡΡΠ΅Ρ, ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°ΠΌΠΈ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²Π° printf. ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ vprintf Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½Π° printf, Ρ ΡΠΎΠΉ Π»ΠΈΡΡ ΠΎΠ³ΠΎΠ²ΠΎΡΠΊΠΎΠΉ, ΡΡΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΡΠ°ΡΡΡ ΡΠΏΠΈΡΠΊΠ° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² Π·Π°ΠΌΠ΅Π½Π΅Π½Π° Π² Π½Π΅ΠΉ ΠΎΠ΄Π½ΠΈΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ ΠΌΠ°ΠΊΡΠΎΡΠΎΠΌ va_start. ΠΠΎΠ΄ΠΎΠ±Π½ΡΠΌ ΠΆΠ΅ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΡΠΎΠΎΡΠ½ΠΎΡΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ vfprinf Ρ fprintf ΠΈ vsprintf Ρ sprintf.
#include βΉstdio.hβΊ
#include βΉstdarg.hβΊ
/* error: ΠΏΠ΅ΡΠ°ΡΠ°Π΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ ΠΈ ΡΠΌΠΈΡΠ°Π΅Ρ */
void error(char *fmt, β¦) {
va_list args;
va_start(args, fmt);
fprintf(stderr, "ΠΎΡΠΈΠ±ΠΊΠ°: ");
vfprintf(stderr, fmt, args);
fprintf(stderr, "\n");
va_end(args);
exit(1);
}
ΠΠ° ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΡΠΊΡΡΡΡΡ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈΠΌΠ΅Π΅ΡΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ (ΠΎΠ±ΡΡΠ½ΠΎ ΠΈΡ ΡΠΈΡΠ»ΠΎ ΠΊΠΎΠ»Π΅Π±Π»Π΅ΡΡΡ ΠΎΠΊΠΎΠ»ΠΎ 20). ΠΠΎΡΡΠΎΠΌΡ Π»ΡΠ±Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π°ΠΌΠ΅ΡΠ΅Π²Π°Π΅ΡΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π±ΠΎΠ»ΡΡΠΈΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ ΡΠ°ΠΉΠ»ΠΎΠ², Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ Π³ΠΎΡΠΎΠ²Π° ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ. Π€ΡΠ½ΠΊΡΠΈΡ close(int fd) ΡΠ°Π·ΡΡΠ²Π°Π΅Ρ ΡΠ²ΡΠ·Ρ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠΌ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠΌ ΠΈ ΠΎΡΠΊΡΡΡΡΠΌ ΡΠ°ΠΉΠ»ΠΎΠΌ ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅Ρ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π΄Π»Ρ Π΅Π³ΠΎ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ Ρ Π΄ΡΡΠ³ΠΈΠΌ ΡΠ°ΠΉΠ»ΠΎΠΌ. ΠΠ½Π° Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ fclose Ρ ΡΠ΅ΠΌ Π»ΠΈΡΡ ΡΠ°Π·Π»ΠΈΡΠΈΠ΅ΠΌ, ΡΡΠΎ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΎΡΠΈΡΡΠΊΠΈ Π±ΡΡΠ΅ΡΠ° Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ. ΠΠ°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ exit ΠΈΠ»ΠΈ return Π² Π³Π»Π°Π²Π½ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ Π·Π°ΠΊΡΡΠ²Π°Π΅Ρ Π²ΡΠ΅ ΠΎΡΠΊΡΡΡΡΠ΅ ΡΠ°ΠΉΠ»Ρ.
Π€ΡΠ½ΠΊΡΠΈΡ unlink(char *name) ΡΠ΄Π°Π»ΡΠ΅Ρ ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π° ΠΈΠ· ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ. ΠΠ½Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΠΈ remove ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ.
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 8.1. ΠΠ΅ΡΠ΅ΠΏΠΈΡΠΈΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ cat ΠΈΠ· Π³Π»Π°Π²Ρ 7, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ read, write, open ΠΈ close. ΠΠ°ΠΌΠ΅Π½ΠΈΡΠ΅ ΠΈΠΌΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ. ΠΠΎΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈΡΡΠΉΡΠ΅, ΡΡΠΎΠ±Ρ ΡΡΠ°Π²Π½ΠΈΡΡ Π±ΡΡΡΡΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π΄Π²ΡΡ Π²Π΅ΡΡΠΈΠΉ.
8.4 ΠΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΉ Π΄ΠΎΡΡΡΠΏ (lseek)
ΠΠ²ΠΎΠ΄-Π²ΡΠ²ΠΎΠ΄ ΠΎΠ±ΡΡΠ½ΠΎ Π±ΡΠ²Π°Π΅Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΠΌ, Ρ. Π΅. ΠΊΠ°ΠΆΠ΄Π°Ρ Π½ΠΎΠ²Π°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΡΡΠ΅Π½ΠΈΡ-Π·Π°ΠΏΠΈΡΠΈ ΠΈΠΌΠ΅Π΅Ρ Π΄Π΅Π»ΠΎ Ρ ΠΏΠΎΠ·ΠΈΡΠΈΠ΅ΠΉ ΡΠ°ΠΉΠ»Π°, ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ Π·Π° ΡΠΎΠΉ, ΡΡΠΎ Π±ΡΠ»Π° Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ (ΡΡΠ΅Π½ΠΈΡ-Π·Π°ΠΏΠΈΡΠΈ). ΠΡΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΡΠ°ΠΉΠ» ΠΌΠΎΠΆΠ½ΠΎ ΡΠΈΡΠ°ΡΡ ΠΈΠ»ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡ Π·Π°ΠΏΠΈΡΡ Π² Π½Π΅Π³ΠΎ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅. Π‘ΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² lseek ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΏΠΎΡΠΎΠ± ΠΏΠ΅ΡΠ΅Π΄Π²ΠΈΠ³Π°ΡΡΡΡ ΠΏΠΎ ΡΠ°ΠΉΠ»Ρ, Π½Π΅ ΡΠΈΡΠ°Ρ ΠΈ Π½Π΅ Π·Π°ΠΏΠΈΡΡΠ²Π°Ρ Π΄Π°Π½Π½ΡΠ΅. Π’Π°ΠΊ, ΡΡΠ½ΠΊΡΠΈΡ
long lseek(int fd, long offset, int origin);
Π² ΡΠ°ΠΉΠ»Π΅ Ρ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠΌ fd ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΡΠ΅ΠΊΡΡΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΡ, ΡΠΌΠ΅ΡΠ°Ρ Π΅Π΅ Π½Π° Π²Π΅Π»ΠΈΡΠΈΠ½Ρ offset ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΌΠ΅ΡΡΠ°, Π·Π°Π΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ origin. ΠΠ½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° origin 0, 1 ΠΈΠ»ΠΈ 2 ΠΎΠ·Π½Π°ΡΠ°ΡΡ, ΡΡΠΎ Π½Π° Π²Π΅Π»ΠΈΡΠΈΠ½Ρ offset ΠΎΡΡΡΡΠΏΠ°ΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ ΠΎΡ Π½Π°ΡΠ°Π»Π°, ΠΎΡ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΠΈΠ»ΠΈ ΠΎΡ ΠΊΠΎΠ½ΡΠ° ΡΠ°ΠΉΠ»Π°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΡΠΎ-Π»ΠΈΠ±ΠΎ Π² ΡΠ°ΠΉΠ» (ΠΊΠΎΠ³Π΄Π° Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΌ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠ΅ shell ΡΠΈΡΡΠ΅ΠΌΡ UNIX Π²Π²ΠΎΠ΄ ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠΌ βΊβΊ Π² ΡΠ°ΠΉΠ» ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π΄Π° Π² fopen Π·Π°Π΄Π°Π½ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ "a"), ΡΠΎ ΠΏΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ ΡΡΠΎ-Π»ΠΈΠ±ΠΎ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΠΉΡΠΈ ΠΊΠΎΠ½Π΅Ρ ΡΠ°ΠΉΠ»Π° Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ
lseek(fd, 0L, 2);
Π§ΡΠΎΠ±Ρ Π²Π΅ΡΠ½ΡΡΡΡΡ Π½Π°Π·Π°Π΄, Π² Π½Π°ΡΠ°Π»ΠΎ ΡΠ°ΠΉΠ»Π°, Π½Π°Π΄ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ
lseek(fd, 0L, 0);
Π‘Π»Π΅Π΄ΡΠ΅Ρ ΠΎΠ±ΡΠ°ΡΠΈΡΡ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π°ΡΠ³ΡΠΌΠ΅Π½Ρ 0L: Π²ΠΌΠ΅ΡΡΠΎ 0L ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ Π½Π°ΠΏΠΈΡΠ°ΡΡ (long)0 ΠΈΠ»ΠΈ, Π΅ΡΠ»ΠΈ ΡΡΠ½ΠΊΡΠΈΡ lseek Π΄ΠΎΠ»ΠΆΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΎΠ±ΡΡΠ²Π»Π΅Π½Π°, ΠΏΡΠΎΡΡΠΎ 0. ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ lseek Ρ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠ°ΠΊ, ΠΊΠ°ΠΊ Π±ΡΠ΄ΡΠΎ ΡΡΠΎ Π±ΠΎΠ»ΡΡΠΈΠ΅ ΠΌΠ°ΡΡΠΈΠ²Ρ, ΠΏΡΠ°Π²Π΄Π°, Ρ Π·Π°ΠΌΠ΅Π΄Π»Π΅Π½Π½ΡΠΌ Π΄ΠΎΡΡΡΠΏΠΎΠΌ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ»Π΅Π΄ΡΡΡΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ ΡΠΈΡΠ°Π΅Ρ Π»ΡΠ±ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ Π±Π°ΠΉΡΠΎΠ² ΠΈΠ· Π»ΡΠ±ΠΎΠ³ΠΎ ΠΌΠ΅ΡΡΠ° ΡΠ°ΠΉΠ»Π°. ΠΠ½Π° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΈΡΠ»ΠΎ ΠΏΡΠΎΡΠΈΡΠ°Π½Π½ΡΡ Π±Π°ΠΉΡΠΎΠ² ΠΈΠ»ΠΈ -1 Π² ΡΠ»ΡΡΠ°Π΅ ΠΎΡΠΈΠ±ΠΊΠΈ.
#include "syscalls.h"
/* get: ΡΠΈΡΠ°Π΅Ρ n Π±Π°ΠΉΡ ΠΈΠ· ΠΏΠΎΠ·ΠΈΡΠΈΠΈ pos */
int get(int fd, long pos, char *buf, int n)
{
if (lseek(fd, pos, 0) βΊ= 0) /* ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΏΠΎΠ·ΠΈΡΠΈΠΈ */
return read(fd, buf, n);
else
return -1;
}
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ΅ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ lseek Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠΏ long ΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ Π½ΠΎΠ²ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡΠΈΠ΅ΠΉ Π² ΡΠ°ΠΉΠ»Π΅ ΠΈΠ»ΠΈ, Π² ΡΠ»ΡΡΠ°Π΅ ΠΎΡΠΈΠ±ΠΊΠΈ, ΡΠ°Π²Π½ΠΎ -1. Π€ΡΠ½ΠΊΡΠΈΡ fseek ΠΈΠ· ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½Π° lseek: ΠΎΡ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ ΠΎΠ½Π° ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΡΠ΅ΠΌ, ΡΡΠΎ Π² ΡΠ»ΡΡΠ°Π΅ ΠΎΡΠΈΠ±ΠΊΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ Π½Π΅Π½ΡΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π° Π΅Π΅ ΠΏΠ΅ΡΠ²ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠΏ FILE*.
8.5 ΠΡΠΈΠΌΠ΅Ρ. Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ fopen ΠΈ getc
Π’Π΅ΠΏΠ΅ΡΡ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΉ fopen ΠΈ getc ΠΈΠ· ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ, ΠΊΠ°ΠΊ ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠ΅ Π²ΡΡΠ΅ ΡΠ°ΡΡΠΈ ΡΠΎΠ³Π»Π°ΡΡΡΡΡΡ Π΄ΡΡΠ³ Ρ Π΄ΡΡΠ³ΠΎΠΌ.
ΠΠ°ΠΏΠΎΠΌΠ½ΠΈΠΌ, ΡΡΠΎ ΡΠ°ΠΉΠ»Ρ Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΡΡ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠΌΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΡΠΌΠΈ, Π° Π½Π΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ°ΠΌΠΈ. Π£ΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΡΠ°ΠΉΠ»Π° - ΡΡΠΎ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΡΡΠΊΡΡΡΡ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠ°ΠΉΠ»Π΅: ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° Π±ΡΡΠ΅Ρ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΉ ΡΠΈΡΠ°ΡΡ ΡΠ°ΠΉΠ» Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ ΠΊΡΡΠΊΠ°ΠΌΠΈ: ΡΠΈΡΠ»ΠΎ Π½Π΅Π·Π°Π½ΡΡΡΡ Π±Π°ΠΉΡΠΎΠ² Π±ΡΡΠ΅ΡΠ°; ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΠ»Π΅Π΄ΡΡΡΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΡ Π² Π±ΡΡΠ΅ΡΠ΅; Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠ°ΠΉΠ»Π°; ΡΠ»Π°ΠΆΠΊΠΈ, ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΠΈΠ΅ ΡΠ΅ΠΆΠΈΠΌ (ΡΡΠ΅Π½ΠΈΠ΅/Π·Π°ΠΏΠΈΡΡ), ΠΎΡΠΈΠ±ΠΎΡΠ½ΡΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΈ Ρ. Π΄.
Π‘ΡΡΡΠΊΡΡΡΠ° Π΄Π°Π½Π½ΡΡ , ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΠ°Ρ ΡΠ°ΠΉΠ», ΡΠΎΠ΄Π΅ΡΠΆΠΈΡΡΡ Π² βΉstdio.hβΊ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π²ΠΊΠ»ΡΡΠ°ΡΡ (Ρ ΠΏΠΎΠΌΠΎΡΡΡ #include) Π² Π»ΡΠ±ΠΎΠΉ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΡΠ°ΠΉΠ», Π΅ΡΠ»ΠΈ Π² ΡΠΎΠΌ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ Π²Π²ΠΎΠ΄-Π²ΡΠ²ΠΎΠ΄. ΠΡΠΎΡ ΠΆΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠΉ ΡΠ°ΠΉΠ» Π²ΠΊΠ»ΡΡΠ΅Π½ ΠΈ Π² ΠΈΡΡ ΠΎΠ΄Π½ΡΠ΅ ΡΠ΅ΠΊΡΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π°.
Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ΅, ΡΠΈΠΏΠΈΡΠ½ΠΎΠΌ Π΄Π»Ρ ΡΠ°ΠΉΠ»Π° βΉstdio.hβΊ, ΠΈΠΌΠ΅Π½Π°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ ΡΠΎΠ»ΡΠΊΠΎ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡΡ , Π½Π°ΡΠΈΠ½Π°ΡΡΡΡ Ρ ΠΏΠΎΠ΄ΡΠ΅ΡΠΊΠΈΠ²Π°Π½ΠΈΡ. ΠΡΠΎ ΡΠ΄Π΅Π»Π°Π½ΠΎ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΎΠ½ΠΈ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π»ΠΈ Ρ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ, ΡΠΈΠ³ΡΡΠΈΡΡΡΡΠΈΠΌΠΈ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ. Π’Π°ΠΊΠΎΠ΅ ΡΠΎΠ³Π»Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠ±Π»ΡΠ΄Π°Π΅ΡΡΡ Π²ΠΎ Π²ΡΠ΅Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ.
#define NULL 0
#define EOF (-1)
#define BUFSIZ 1024
#define OPEN_MAX 20 /* max ΡΠΈΡΠ»ΠΎ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΡΠΊΡΡΡΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² */
typedef struct _iobuf {
int cnt; /* ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΡΡΠ°Π²ΡΠΈΡ ΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² */
char *ptr; /* ΠΏΠΎΠ·ΠΈΡΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Π° */
char *base; /* Π°Π΄ΡΠ΅Ρ Π±ΡΡΠ΅ΡΠ° */
int flag; /* ΡΠ΅ΠΆΠΈΠΌ Π΄ΠΎΡΡΡΠΏΠ° */
int fd; /* Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠ°ΠΉΠ»Π° */
} FILE;
extern FILE _iob[OPEN_MAX];
#define stdin (&iob[0])
#define stdout (&_iob[1])
#define stderr (&_iob[2])
enum _flags {
_READ = 01, /* ΡΠ°ΠΉΠ» ΠΎΡΠΊΡΡΡ Π½Π° ΡΡΠ΅Π½ΠΈΠ΅ */
_WRITE = 02, /* ΡΠ°ΠΉΠ» ΠΎΡΠΊΡΡΡ Π½Π° Π·Π°ΠΏΠΈΡΡ */
_UNBUF = 04, /* ΡΠ°ΠΉΠ» Π½Π΅ Π±ΡΡΠ΅ΡΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ */
_EOF = 010, /* Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ Π²ΡΡΡΠ΅ΡΠΈΠ»ΡΡ EOF */
_ERR = 020 /* Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ Π²ΡΡΡΠ΅ΡΠΈΠ»Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΠ° */
};
int _fillbuf(FILE *);
int _flushbuf(int, FILE *);
#define feof(p) (((p)-βΊflag & _EOF) != 0)
#define ferror(p) (((p)-βΊflag & _ERR) != 0)
#define fileno(p) ((p)-βΊfd)
#define getc(p) (--(p)-βΊcnt βΊ= 0 \
? (unsigned char) *(p)-βΊptr++ : _fillbuf(p))
#define putc(x,p) (--(p)-βΊcnt βΊ= 0 \
? *(p)-βΊptr++ = (x) : _flushbuf((x),p))
#define getchar() getc(stdin)
#define putchar(x) putc((x), stdout)
ΠΠ°ΠΊΡΠΎΡ getc ΠΎΠ±ΡΡΠ½ΠΎ ΡΠΌΠ΅Π½ΡΡΠ°Π΅Ρ ΡΡΠ΅ΡΡΠΈΠΊ ΡΠΈΡΠ»Π° ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ², Π½Π°Ρ ΠΎΠ΄ΡΡΠΈΡ ΡΡ Π² Π±ΡΡΠ΅ΡΠ΅, ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΈΠΌΠ²ΠΎΠ», ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ ΠΏΡΠΈΡΠ°ΡΠΈΠ²Π°Π΅Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡΡ. (ΠΠ°ΠΏΠΎΠΌΠ½ΠΈΠΌ, ΡΡΠΎ Π΄Π»ΠΈΠ½Π½ΡΠ΅ #define Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΉ Π½Π°ΠΊΠ»ΠΎΠ½Π½ΠΎΠΉ ΡΠ΅ΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΡ Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΡΡΡΠΎΠΊΠ°Ρ .) ΠΠΎΠ³Π΄Π° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ΅ΡΡΠΈΠΊΠ° ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΡΠΌ, getc Π²ΡΠ·ΡΠ²Π°Π΅Ρ _fillbuf, ΡΡΠΎΠ±Ρ ΡΠ½ΠΎΠ²Π° Π·Π°ΠΏΠΎΠ»Π½ΠΈΡΡ Π±ΡΡΠ΅Ρ, ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΡΡΡΠΊΡΡΡΡ ΠΈ Π²ΡΠ΄Π°ΡΡ ΡΠΈΠΌΠ²ΠΎΠ». Π’ΠΈΠΏΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² ΠΏΡΠΈΠ²ΠΎΠ΄ΡΡΡΡ ΠΊ unsigned; ΡΡΠΎ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ, ΡΡΠΎ Π²ΡΠ΅ ΠΎΠ½ΠΈ Π±ΡΠ΄ΡΡ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΡΠΌΠΈ.
Π₯ΠΎΡΡ Π² Π΄Π΅ΡΠ°Π»ΡΡ Π²Π²ΠΎΠ΄-Π²ΡΠ²ΠΎΠ΄ Π·Π΄Π΅ΡΡ Π½Π΅ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΡΡΡ, ΠΌΡ Π²ΡΠ΅ ΠΆΠ΅ ΠΏΡΠΈΠ²Π΅Π»ΠΈ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ putc. Π‘Π΄Π΅Π»Π°Π½ΠΎ ΡΡΠΎ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΠΎΠ½Π° Π΄Π΅ΠΉΡΡΠ²ΡΠ΅Ρ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ getc, Π²ΡΠ·ΡΠ²Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ _flushbuf, ΠΊΠΎΠ³Π΄Π° Π±ΡΡΠ΅Ρ ΠΏΠΎΠ»ΠΎΠ½. Π ΡΠ΅ΠΊΡΡΠ΅ ΠΈΠΌΠ΅ΡΡΡΡ ΠΌΠ°ΠΊΡΠΎΡΡ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠ΅ ΠΏΠΎΠ»ΡΡΠ°ΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠ»Π°ΠΆΠΊΠ°ΠΌ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΈ ΠΊΠΎΠ½ΡΠ° ΡΠ°ΠΉΠ»Π°, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΊ Π΅Π³ΠΎ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ.
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ fopen. ΠΠΎΠ»ΡΡΠ°Ρ ΡΠ°ΡΡΡ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ fopen ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΊ ΠΎΡΠΊΡΡΡΠΈΡ ΡΠ°ΠΉΠ»Π°, ΠΊ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΌΡ Π΅Π³ΠΎ ΠΏΠΎΠ·ΠΈΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΠΊ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ ΡΠ»Π°ΠΆΠΊΠΎΠ²ΡΡ Π±ΠΈΡΠΎΠ², ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΡΡ Π΄Π»Ρ ΠΈΠ½Π΄ΠΈΠΊΠ°ΡΠΈΠΈ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ. Π‘Π°ΠΌΠ° fopen Π½Π΅ ΠΎΡΠ²ΠΎΠ΄ΠΈΡ ΠΌΠ΅ΡΡΠ° Π΄Π»Ρ Π±ΡΡΠ΅ΡΠ°; ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ _fillbuf ΠΏΡΠΈ ΠΏΠ΅ΡΠ²ΠΎΠΌ ΡΡΠ΅Π½ΠΈΠΈ ΡΠ°ΠΉΠ»Π°.
#include <fcntl.h>
#include "syscalls.h"
#define PERMS 0666 /* RW Π΄Π»Ρ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΈΠΊΠ°, Π³ΡΡΠΏΠΏΡ ΠΈ ΠΏΡΠΎΡ. */
/* fopen: ΠΎΡΠΊΡΡΠ²Π°Π΅Ρ ΡΠ°ΠΉΠ», Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ */