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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² QNX/Neutrino 2. Руководство ΠΏΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² QNX Realtime PlatformΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 60

Автор Π ΠΎΠ± ΠšΡ‘Ρ€Ρ‚Π΅Π½

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ здСсь являСтся Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ 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-разрядныС смСщСния ΠΈΠ»ΠΈ Π½Π΅Ρ‚: