ΠΡΠ΅Π²ΠΈΠ΄Π½ΡΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ Π·Π΄Π΅ΡΡ ΡΠ²Π»ΡΠ΅ΡΡΡ Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ lseek() ΠΈ read() Π² ΠΏΡΠ΅Π΄Π΅Π»Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΌΡΡΠ΅ΠΊΡΠ° β ΠΊΠΎΠ³Π΄Π° ΠΏΠ΅ΡΠ²ΡΠΉ ΠΏΠΎΡΠΎΠΊ Π·Π°Ρ Π²Π°ΡΠΈΡ ΠΌΡΡΠ΅ΠΊΡ, ΠΌΡ Π±ΡΠ΄Π΅ΠΌ Π·Π½Π°ΡΡ, ΡΡΠΎ ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ ΡΠΊΡΠΊΠ»ΡΠ·ΠΈΠ²Π½ΡΠΉ Π΄ΠΎΡΡΡΠΏ ΠΊ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ. ΠΡΠΎΡΠΎΠΉ ΠΏΠΎΡΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΠ΄Π΅Ρ ΠΆΠ΄Π°ΡΡ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΡ ΠΌΡΡΠ΅ΠΊΡΠ°, ΠΏΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ ΠΎΠ½ ΡΠΌΠΎΠΆΠ΅Ρ ΡΠ²ΠΎΡΠΈΡΡ ΡΠ²ΠΎΠ΅ Π±Π΅Π·ΠΎΠ±ΡΠ°Π·ΠΈΠ΅ Ρ ΠΏΠΎΠ·ΠΈΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ°.
Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, Π΅ΡΠ»ΠΈ ΠΊΡΠΎ-ΡΠΎ Π²Π΄ΡΡΠ³ Π·Π°Π±ΡΠ΄Π΅Ρ Π·Π°Ρ Π²Π°ΡΠΈΡΡ ΠΌΡΡΠ΅ΠΊΡ ΠΏΠ΅ΡΠ΅Π΄ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈ Π»ΡΠ±ΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ΅ΠΉ Ρ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠΌ ΡΠ°ΠΉΠ»Π°, Π²ΡΠ΅Π³Π΄Π° ΠΎΡΡΠ°Π΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΡΠ°ΠΊΠΎΠΉ Β«Π½Π΅Π·Π°ΡΠΈΡΠ΅Π½Π½ΡΠΉΒ» Π΄ΠΎΡΡΡΠΏ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΏΠΎΡΠΎΠΊ ΠΊ ΡΡΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡΠΈ Π΄Π°Π½Π½ΡΡ Π½Π΅ ΡΡΠ΄Π°, ΠΊΡΠ΄Π° Π½Π°Π΄ΠΎ.
ΠΠ°Π²Π°ΠΉΡΠ΅ Π²Π·Π³Π»ΡΠ½Π΅ΠΌ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² readblock() (ΠΈΠ· <unistd.h>):
int readblock(int fd, size_t blksize, unsigned block,
int numblks, void *buff);
(Π€ΡΠ½ΠΊΡΠΈΡ writeblock() ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ.)
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΠΎΠΎΠ±ΡΠ°Π·ΠΈΡΡ Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΈ readblock() Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ Β«ΠΏΡΠΎΡΡΠ΅Π½ΡΠΊΡΡΒ» ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ:
int readblock(int fd, size_t blksize, unsigned block,
int numblks, void *buff) {
lseek(fd, blksize * block, SEEK_SET); // ΠΠ΄Π΅ΠΌ ΠΊ Π±Π»ΠΎΠΊΡ
read(fd, buff, blksize * numblks);
}
ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ ΠΎΡ ΡΠ°ΠΊΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠΉ ΡΡΠ΅Π΄Π΅ ΡΠΎΠ»ΠΊΡ ΠΌΠ°Π»ΠΎ. ΠΠ°ΠΌ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΡΡΠ΅ΠΊΡΠ°:
int readblock(int fd, size_t blksize, unsigned block,
int numblks, void *buff) {
pthread_mutex_lock(&block_mutex);
lseek(fd, blksize * block, SEEK_SET); // ΠΠ΄Π΅ΠΌ ΠΊ Π±Π»ΠΎΠΊΡ
read(fd, buff, blksize * numblks);
pthread_mutex_unlock(&block_mutex);
}
(ΠΡ Π·Π΄Π΅ΡΡ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌ, ΡΡΠΎ ΠΌΡΡΠ΅ΠΊΡ ΡΠΆΠ΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½.)
ΠΡΠΎΡ ΠΊΠΎΠ΄ ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ ΡΡΠ·Π²ΠΈΠΌ Π΄Π»Ρ Β«Π½Π΅Π·Π°ΡΠΈΡΠ΅Π½Π½ΠΎΠ³ΠΎΒ» Π΄ΠΎΡΡΡΠΏΠ° β Π΅ΡΠ»ΠΈ Π½Π΅ΠΊΠΈΠΉ ΠΏΠΎΡΠΎΠΊ Π²ΡΠ·ΠΎΠ²Π΅Ρ lseek() Π½Π° ΡΡΠΎΠΌ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΌ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ΅ Π±Π΅Π· ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΏΠΎΠΏΡΡΠΊΠΈ Π·Π°Ρ Π²Π°ΡΠ° ΠΌΡΡΠ΅ΠΊΡΠ°, Π²ΠΎΡ Ρ Π½Π°Ρ ΡΠΆΠ΅ ΠΈ ΠΎΡΠΈΠ±ΠΊΠ°.
Π Π΅ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΠΎΡΡΠ°Π²Π½ΠΎΠ³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ, Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ Π²ΡΡΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½ΠΎΠΌΡ ΡΠ»ΡΡΠ°Ρ Ρ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ chown(). Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½Π°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ readblock() ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ ΠΎΠ±Π΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ β lseek() ΠΈ read() β Π² Π΅Π΄ΠΈΠ½ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΡΡΠ»Π°Π΅Ρ ΡΡΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΡ ΡΠ΅ΡΡΡΡΠΎΠ²:
Π‘ΠΎΡΡΠ°Π²Π½ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΈ readblock().
ΠΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΡΠ²Π»ΡΠ΅ΡΡΡ Π°ΡΠΎΠΌΠ°ΡΠ½ΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ΅ΠΉ. Π‘ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΡΡ ΠΎΠ΄ΠΈΡ Π»ΠΈΠ±ΠΎ ΡΠ΅Π»ΠΈΠΊΠΎΠΌ, Π»ΠΈΠ±ΠΎ Π½Π΅ ΡΡ ΠΎΠ΄ΠΈΡ Π²ΠΎΠΎΠ±ΡΠ΅. ΠΠΎΡΡΠΎΠΌΡ, Π²ΠΌΠ΅ΡΠ°ΡΠ΅Π»ΡΡΡΠ²ΠΎ Β«Π½Π΅Π·Π°ΡΠΈΡΠ΅Π½Π½ΠΎΠΉΒ» ΡΡΠ½ΠΊΡΠΈΠΈ lseek() ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π½Π΅ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΌ β ΠΊΠΎΠ³Π΄Π° Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡ ΡΠ΅ΡΡΡΡΠΎΠ² ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Ρ Π·Π°ΠΏΡΠΎΡΠΎΠΌ readblock(), ΠΎΠ½ Π΄Π΅Π»Π°Π΅Ρ ΡΡΠΎ Π·Π° ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΈΠ΅ΠΌ. (ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΠΎΡΡΡΠ°Π΄Π°Π΅Ρ ΡΠ°ΠΌΠ° Β«Π½Π΅Π·Π°ΡΠΈΡΠ΅Π½Π½Π°ΡΒ» lseek(), ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΠΎΡΠ»Π΅ ΠΎΡΡΠ°Π±ΠΎΡΠΊΠΈ readblock() ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΡΡΠΎΠΌ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ΅ ΡΠ°ΠΉΠ»Π° Π±ΡΠ΄Π΅Ρ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ ΠΎΡ ΡΠΎΠ³ΠΎ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΎΠ½Π° Ρ ΠΎΡΠ΅Π»Π° ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ.)
Π ΠΊΠ°ΠΊ Π½Π°ΡΡΠ΅Ρ ΡΠ°ΠΌΠΎΠ³ΠΎ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠ° ΡΠ΅ΡΡΡΡΠΎΠ²? ΠΠ°ΠΊ ΠΎΠ½ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ readblock() Π·Π° ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΈΠ΅ΠΌ? ΠΡ Π²ΡΠΊΠΎΡΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΡΠΎ, ΠΊΠΎΠ³Π΄Π° Π±ΡΠ΄Π΅ΠΌ ΠΎΠ±ΡΡΠΆΠ΄Π°ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠ΅ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° ΡΠΎΡΡΠ°Π²Π½ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ.
Π‘ΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ ΡΡΠΎΠ²Π½Ρ POSIX
Π ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°ΠΌ POSIX-ΡΡΠΎΠ²Π½Ρ ΠΎΡΠ½ΠΎΡΡΡΡΡ ΡΡΠΈ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ . ΠΡΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ ΠΏΠΎΠΊΠ° ΡΠ΅ΡΡ ΠΈΠ΄Π΅Ρ ΠΎ Π±Π°Π·ΠΎΠ²ΠΎΠΌ ΡΡΠΎΠ²Π½Π΅, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π»ΡΠ±ΡΠ΅ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ , ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠΆΠ΅Π»Π°Π΅ΡΠ΅; ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΡΡΡΡΠΊΡΡΡΠ΅ ΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠ°Π½ΠΈΡ ΡΡΠ΅Π±ΡΠ΅Ρ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΡΠΎΠ²Π΅Π½Ρ POSIX. ΠΠ΄Π½Π°ΠΊΠΎ, ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π°, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ POSIX-ΡΡΠΎΠ²Π΅Π½Ρ, Ρ Π»ΠΈΡ Π²ΠΎΠΉ ΠΎΠΊΡΠΏΠ°ΡΡ Π²Π½ΠΎΡΠΈΠΌΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ. ΠΠ°ΠΊ ΠΌΡ ΡΠ²ΠΈΠ΄ΠΈΠΌ Π΄Π°Π»Π΅Π΅, Π²Ρ ΡΠ°ΠΊΠΆΠ΅ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΡΡΡ ΡΡΠΈ ΡΡΡΡΠΊΡΡΡΡ Π²Π°ΡΠΈΠΌ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΌ ΡΠΎΠ΄Π΅ΡΠΆΠ°Π½ΠΈΠ΅ΠΌ.
ΠΠ° ΡΠΈΡΡΠ½ΠΊΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Ρ ΡΡΠΈ ΡΡΠΈ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ Π΄Π»Ρ ΡΠ»ΡΡΠ°Ρ, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠ° ΡΠ΅ΡΡΡΡΠΎΠ², ΠΎΠ±ΡΡΠ²ΠΈΠ²ΡΠΈΠΉ Π΄Π²Π° ΡΡΡΡΠΎΠΉΡΡΠ²Π°:
Π‘ΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ β ΠΎΠ±ΡΠ°Ρ ΡΡ Π΅ΠΌΠ°.
Π‘ΡΡΡΠΊΡΡΡΠ°ΠΌΠΈ Π΄Π°Π½Π½ΡΡ ΡΠ²Π»ΡΡΡΡΡ:
iofunc_ocb_t β OCB (Π±Π»ΠΎΠΊ ΠΎΡΠΊΡΡΡΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°)
Π‘ΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ ΡΠ°ΠΉΠ»Π°.
iofunc_attr_t β Π°ΡΡΠΈΠ±ΡΡΠ½Π°Ρ Π·Π°ΠΏΠΈΡΡ
Π‘ΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ ΡΡΡΡΠΎΠΉΡΡΠ²Ρ.
iofunc_mount_t β Π·Π°ΠΏΠΈΡΡ ΡΠΎΡΠΊΠΈ ΠΌΠΎΠ½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ
Π‘ΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΠΎΡΠΊΠ΅ ΠΌΠΎΠ½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
ΠΠΎΠ³Π΄Π° ΠΌΡ ΠΎΠ±ΡΡΠΆΠ΄Π°Π»ΠΈ ΡΠ°Π±Π»ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ΠΈ Π²Π²ΠΎΠ΄Π°/Π²ΡΠ²ΠΎΠ΄Π°, ΠΌΡ ΡΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ Π±Π»ΠΎΠΊΠΈ ΠΎΡΠΊΡΡΡΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° ΠΈ Π°ΡΡΠΈΠ±ΡΡΠ½ΡΠ΅ Π·Π°ΠΏΠΈΡΠΈ β Π² ΡΠ°Π±Π»ΠΈΡΠ°Ρ ΡΡΠ½ΠΊΡΠΈΠΉ Π²Π²ΠΎΠ΄Π°/Π²ΡΠ²ΠΎΠ΄Π° OCB Π±ΡΠ» ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΌ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΡΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ. ΠΡΡΠΈΠ±ΡΡΠ½Π°Ρ Π·Π°ΠΏΠΈΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π»Π°ΡΡ ΠΊΠ°ΠΊ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ handle (ΡΡΠ΅ΡΠΈΠΉ ΠΏΠΎ ΡΡΠ΅ΡΡ) Π² ΡΡΠ½ΠΊΡΠΈΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ. ΠΠ°ΠΏΠΈΡΡ ΡΠΎΡΠΊΠΈ ΠΌΠΎΠ½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΎΠ±ΡΡΠ½ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΡ ΡΡΡΡΠΊΡΡΡΡ ΠΈ ΠΏΡΠΈΠ²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΊ Π°ΡΡΠΈΠ±ΡΡΠ½ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ Β«Π²ΡΡΡΠ½ΡΡΒ» (Π² ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΎΠ½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅, Π½Π°ΠΏΠΈΡΠ°Π½Π½ΠΎΠΌ Π²Π°ΠΌΠΈ Π΄Π»Ρ Π²Π°ΡΠ΅Π³ΠΎ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠ° ΡΠ΅ΡΡΡΡΠ°).
Π‘ΡΡΡΠΊΡΡΡΠ° Π±Π»ΠΎΠΊΠ° ΠΎΡΠΊΡΡΡΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° (OCB) iofunc_ocb_tΠ‘ΡΡΡΠΊΡΡΡΠ° Π±Π»ΠΎΠΊΠ° ΠΎΡΠΊΡΡΡΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° (OCB) ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ ΡΠ°ΠΉΠ»Π°. ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΊΠΎΠ³Π΄Π° ΠΊΠ»ΠΈΠ΅Π½Ρ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π²ΡΠ·ΠΎΠ² open() ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π² ΠΎΡΠ²Π΅Ρ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠ°ΠΉΠ»Π° (Π² ΠΏΡΠΎΡΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΡΡΡ ΠΊΠΎΠ΄Ρ ΠΎΡΠΈΠ±ΠΊΠΈ), Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡ ΡΠ΅ΡΡΡΡΠΎΠ² ΡΠΎΠ·Π΄Π°Π΅Ρ OCB ΠΈ ΡΠ²ΡΠ·ΡΠ²Π°Π΅Ρ Π΅Π³ΠΎ Ρ Π΄Π°Π½Π½ΡΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ. ΠΡΠΎΡ OCB Π±ΡΠ΄Π΅Ρ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°ΡΡ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΠΊΠ»ΠΈΠ΅Π½Ρ Π΄Π΅ΡΠΆΠΈΡ Π΄Π°Π½Π½ΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠ°ΠΉΠ»Π° ΠΎΡΠΊΡΡΡΡΠΌ. Π Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, OCB ΠΈ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠ°ΠΉΠ»Π° β Π²ΡΠ΅Π³Π΄Π° ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½Π°Ρ ΠΏΠ°ΡΠ°. ΠΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π²Π²ΠΎΠ΄Π°/Π²ΡΠ²ΠΎΠ΄Π° ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠ° ΡΠ΅ΡΡΡΡΠΎΠ² Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΈΡΠ΅Ρ Π½ΡΠΆΠ½ΡΠΉ OCB ΠΈ Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅Ρ Π΅Π³ΠΎ Π½ΡΠΆΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈΠ· ΡΠ°Π±Π»ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ Π²Π²ΠΎΠ΄Π°/Π²ΡΠ²ΠΎΠ΄Π°. ΠΡΠΎ ΠΎΡΠ²Π΅Ρ Π½Π° Π²ΠΎΠΏΡΠΎΡ, Π·Π°ΡΠ΅ΠΌ Π²ΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡΠΌ Π²Π²ΠΎΠ΄Π°/Π²ΡΠ²ΠΎΠ΄Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ocb. Π ΠΊΠΎΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΠΎΠ² ΠΊΠ»ΠΈΠ΅Π½Ρ Π·Π°ΠΊΡΠΎΠ΅Ρ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠ°ΠΉΠ»Π° (ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠ² close()), ΡΡΠΎ Π·Π°ΡΡΠ°Π²ΠΈΡ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡ ΡΠ΅ΡΡΡΡΠ° ΠΎΡΠ²ΡΠ·Π°ΡΡ OCB ΠΎΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° ΡΠ°ΠΉΠ»Π° ΠΈ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ dup() ΠΏΡΠΎΡΡΠΎ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅Ρ ΡΡΠ΅ΡΡΠΈΠΊ ΡΠ²ΡΠ·Π΅ΠΉ. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ OCB ΠΎΡΠ΄Π΅Π»ΡΠ΅ΡΡΡ ΠΎΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° ΡΠ°ΠΉΠ»Π° ΠΈ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ΅ΡΡΠΈΠΊΠ° ΡΠ²ΡΠ·Π΅ΠΉ Π΄ΠΎΡΡΠΈΠ³Π½Π΅Ρ Π½ΡΠ»Ρ (ΡΠΎ Π΅ΡΡΡ ΠΊΠΎΠ³Π΄Π° ΡΠΈΡΠ»ΠΎ Π²ΡΠ·ΠΎΠ²ΠΎΠ² close() Π±ΡΠ΄Π΅Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΎΠ²Π°ΡΡ ΡΠΈΡΠ»Ρ open() ΠΈ dup()).
ΠΠ°ΠΊ Π²Ρ, Π½Π°Π²Π΅ΡΠ½ΠΎΠ΅, Π΄ΠΎΠ³Π°Π΄ΡΠ²Π°Π΅ΡΠ΅ΡΡ, Π² OCB ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡΡ Π²Π°ΠΆΠ½ΡΠ΅ Π²Π΅ΡΠΈ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ ΠΎΡΠΊΡΡΡΠΈΡ ΡΠ΅ΡΡΡΡΠ° ΠΈ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ ΡΠ°ΠΉΠ»Π°. ΠΠΎΡ Π΅Π³ΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠ°Π½ΠΈΠ΅ (Π²Π·ΡΡΠΎ ΠΈΠ· <sys/iofunc.h>):
typedef struct _iofunc_ocb {
IOFUNC_ATTR_T *attr;
int32_t ioflag;
CM ΠΠΠΠ!!! offset;
uint16_t sflag;
uint16_t flags;
} iofunc_ocb_t;
ΠΡΠΎΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅ΠΌ ΠΏΠΎΠΊΠ° ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠΎΠ»Ρ offset; ΠΌΡ Π²Π΅ΡΠ½Π΅ΠΌΡΡ ΠΊ ΡΡΠΎΠΌΡ Π²ΠΎΠΏΡΠΎΡΡ ΡΡΠ°Π·Ρ ΠΆΠ΅ ΠΏΠΎΡΠ»Π΅ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΡ.
ΠΠΎΠ»Ρ ΡΡΡΡΠΊΡΡΡΡ iofunc_ocb_t:
attr Π£ΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° Π°ΡΡΠΈΠ±ΡΡΠ½ΡΡ Π·Π°ΠΏΠΈΡΡ, ΡΠ²ΡΠ·Π°Π½Π½ΡΡ Ρ Π΄Π°Π½Π½ΡΠΌ Π±Π»ΠΎΠΊΠΎΠΌ OCB. Π ΡΡΠ½ΠΊΡΠΈΡΡ Π²Π²ΠΎΠ΄Π°/Π²ΡΠ²ΠΎΠ΄Π° Π²Ρ Π±ΡΠ΄Π΅ΡΠ΅ Π²ΡΡΡΠ΅ΡΠ°ΡΡ ΡΡΡΠΎΡΠ²ΡΡΡΡΡ ΠΈΠ΄ΠΈΠΎΠΌΡ Β«ocb->attrΒ»; ΠΎΠ½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌ Π°ΡΡΠΈΠ±ΡΡΠ½ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ. ioflag Π Π΅ΠΆΠΈΠΌ ΠΎΡΠΊΡΡΡΠΈΡ, ΡΠΎ Π΅ΡΡΡ ΠΊΠ°ΠΊ Π±ΡΠ» ΠΎΡΠΊΡΡΡ ΡΠ΅ΡΡΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Β«ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡΒ»). ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ ΠΏΠΎΠ»Π΅ ioflag ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠ΅ΠΆΠΈΠΌ ΠΎΡΠΊΡΡΡΠΈΡ (ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ» ΠΏΠ΅ΡΠ΅Π΄Π°Π½ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ open()) ΠΏΠ»ΡΡ Π΅Π΄ΠΈΠ½ΠΈΡΠ°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ΅ΠΆΠΈΠΌ ΠΎΡΠΊΡΡΡΠΈΡ O_RDONLY (Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ 0) ΠΏΠΎΡΠ²ΠΈΡΡΡ Π² ΠΏΠΎΠ»Π΅ ioflag, ΠΊΠ°ΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΡΠ°Π²Π½ΠΎΠ΅ Π΅Π΄ΠΈΠ½ΠΈΡΠ΅ (1) (ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ° _READ ΠΈΠ· <stdio.h>). ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΡΠ°ΠΊΡΠΎΠ²Π°ΡΡ Π΄Π²Π° ΠΌΠ»Π°Π΄ΡΠΈΡ Π±ΠΈΡΠ° ΠΏΠΎΠ»Ρ ioflag ΠΊΠ°ΠΊ ΡΠ»Π°Π³ΠΈ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΠΏΠΈΡΠΈ (ioflag & _READ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° ΠΏΡΠ°Π²ΠΎ Π΄ΠΎΡΡΡΠΏΠ° ΠΏΠΎ ΡΡΠ΅Π½ΠΈΡ; ioflag & _WRITE β ΠΏΠΎ Π·Π°ΠΏΠΈΡΠΈ). offset Π’Π΅ΠΊΡΡΠ΅Π΅ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ lseek() Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ΅ΡΡΡΡΠ΅. sflag Π€Π»Π°Π³ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ (ΡΠΌ. <share.h>), ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ Π²ΡΠ·ΠΎΠ²Π° sopen(). ΠΠΎΠ·ΠΌΠΎΠΆΠ½Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ SH_COMPAT, SH_DENYRW, SH_DENYWR, SH_DENYRD, ΠΈ SH_DENYN flags Π‘ΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ ΡΠ»Π°Π³ΠΈ. Π Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ Π΄Π²Π° ΡΠ»Π°Π³Π°: IOFUNC_OCB_PRIVILEGED, ΡΠΊΠ°Π·ΡΠ²Π°ΡΡΠΈΠΉ Π½Π° ΡΠΎ, ΡΡΠΎ ΡΡΠΎΡ OCB Π±ΡΠ» ΡΠΎΠ·Π΄Π°Π½ Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ΠΎΡ ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ°, ΠΈ IOFUNC_OCB_MMAP, ΡΠΊΠ°Π·ΡΠ²Π°ΡΡΠΈΠΉ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π»ΠΈ ΡΡΠΎΡ OCB ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ mmap() Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. ΠΠ° Π½Π°ΡΡΠΎΡΡΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π½ΠΈΠΊΠ°ΠΊΠΈΡ Π΄ΡΡΠ³ΠΈΡ ΡΠ»Π°Π³ΠΎΠ² Π½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π±ΠΈΡΡ, Π·Π°Π΄Π°Π½Π½ΡΠ΅ Π² IOFUNC_OCB_FLAGS_PRIVATE, ΠΏΠΎ ΡΠ²ΠΎΠ΅ΠΌΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠΌΡ ΡΡΠΌΠΎΡΡΠ΅Π½ΠΈΡ.ΠΡΠ»ΠΈ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ Π½Π°ΡΡΠ΄Ρ ΡΠΎ Β«ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΌΒ» OCB ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅, ΡΠΎ Π±ΡΠ΄ΡΡΠ΅ ΠΏΠΎΠΊΠΎΠΉΠ½Ρ β OCB ΠΌΠΎΠΆΠ½ΠΎ Β«ΡΠ°ΡΡΠΈΡΡΡΡΒ». ΠΡ ΠΎΠ±ΡΡΠ΄ΠΈΠΌ ΡΡΠΎ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ Β«ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΒ».
ΠΡΠΎ ΡΡΡΠ°Π½Π½ΠΎΠ΅ ΠΏΠΎΠ»Π΅ offsetΠΠΎΠ»Π΅ offset, ΡΠΊΠ°ΠΆΠ΅ΠΌ ΡΠ°ΠΊ, ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ Π»ΡΠ±ΠΎΠΏΡΡΠ½ΠΎ. ΠΠΎΡΠΌΠΎΡΡΠΈΡΠ΅ Π² <sys/iofunc.h>, ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ. Π Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΈΠ΅ Ρ Π²Π°Ρ Π·Π°Π΄Π°Π½Ρ ΡΠ»Π°Π³ΠΈ ΠΏΡΠ΅ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΎΠ΄Π½Ρ ΠΈΠ· ΡΠ΅ΡΡΠΈ (!) Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ ΡΠ°ΡΠΊΠ»Π°Π΄ΠΎΠΊ ΠΏΠΎΠ»Ρ offset. ΠΠΎ Π½Π΅ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΉΡΠ΅ΡΡ ΠΎΡΠΎΠ±ΠΎ ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ β ΡΠ΅Π°Π»ΡΠ½ΠΎ Π΅ΡΡΡ ΡΠΌΡΡΠ» ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π²Π° ΡΠ»ΡΡΠ°Ρ, Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠΎΠ³ΠΎ, Ρ ΠΎΡΠΈΡΠ΅ Π²Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ 64-ΡΠ°Π·ΡΡΠ΄Π½ΡΠ΅ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ Π½Π΅Ρ: