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

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

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

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ дополняСм администратор рСсурсов нашими функциями. Π­Ρ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ- ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ сообщСний, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, io_read(), io_devctl(), ΠΈ Ρ‚.ΠΏ.). НапримСр, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ свой собствСнный ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ для сообщСния _IO_READ, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ my_io_read(), ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Π»ΠΈ Π±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Ρ‚Π°ΠΊΡƒΡŽ строчку:

io_func.io_read = my_io_read;

Π­Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ элСмСнт Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ iofunc_func_init() ΠΈ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Π²ΡˆΠΈΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ POSIX-уровня ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π·Π°ΠΌΠ΅Π½ΠΈΠ² Π΅Π³ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π° Π²Π°ΡˆΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ my_io_read().

Π­Ρ‚Π°ΠΏ 3

Π’Ρ‹, вСроятно, Π½Π΅ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ваш администратор рСсурсов назывался /dev/whatever (Π±ΡƒΠΊΠ². β€” Β«/dev/Π°Π±Ρ‹_Ρ‡Ρ‚ΠΎΒ» β€” ΠΏΡ€ΠΈΠΌ. Ρ€Π΅Π΄.), Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ придСтся Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ для Π½Π΅Π³ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ имя. ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ привязка Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½ΠΎΠΉ записи (ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ attr) ΠΊ рСгистрируСмому прСфиксу осущСствляСтся Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ resmgr_attach() β€” Ссли Π±Ρ‹ Π½Π°ΠΌ Π±Ρ‹Π»ΠΎ Π½Π°Π΄ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ наш администратор ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π» нСсколько устройств, Π½Π°ΠΌ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ resmgr_attach() нСсколько Ρ€Π°Π·, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· с Π½ΠΎΠ²ΠΎΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½ΠΎΠΉ записью, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π° этапС выполнСния ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΡ‚ΡŒ зарСгистрированныС прСфиксы Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°.

ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ io_read()

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ ваш администратор рСсурса ΠΌΠΎΠ³ Π±Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ Π΄Π°Π½Π½Ρ‹Π΅, рассмотрим ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ администратор рСсурса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ всСгда Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ ΡΡ‚Ρ€ΠΎΠΊΠΎΠ²ΡƒΡŽ константу «Здравствуй, ΠΌΠΈΡ€!\nΒ». Π”Π°ΠΆΠ΅ Π² Ρ‚Π°ΠΊΠΎΠΌ простом случаС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡ‡Π΅ΡΡ‚ΡŒ ряд ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ², ΠΊΠ°ΠΊ-Ρ‚ΠΎ:

β€’ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° клиСнтской области Π΄Π°Π½Π½Ρ‹Ρ… с количСством Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΡ… Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Ρƒ;

β€’ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° EOF;

β€’ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ контСкстной ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ (индСкс lseek());

β€’ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ POSIX-ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ stat().

Π£Ρ‡Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² областСй Π΄Π°Π½Π½Ρ‹Ρ…

Π’ нашСм случаС администратор рСсурсов Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ строку Π΄Π»ΠΈΠ½ΠΎΠΉ Π² 17 Π±Π°ΠΉΡ‚, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ доступных Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚ΠΎΡ‡Π½ΠΎ извСстСн ΠΈ постоянСн. Π­Ρ‚ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΡΠ»ΡƒΡ‡Π°ΡŽ с дисковым Ρ„Π°ΠΉΠ»ΠΎΠΌ, доступным Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния ΠΈ содСрТащим Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Π΅ΠΌΡƒΡŽ строку. ЕдинствСнноС Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ этот Β«Ρ„Π°ΠΉΠ»Β» обСспСчиваСтся Π² нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ строкой:

char *data_string = "Здравствуй, ΠΌΠΈΡ€!\n";

Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ любого объСма Π΄Π°Π½Π½Ρ‹Ρ… β€” ΠΎΠ΄ΠΈΠ½ Π±Π°ΠΉΡ‚, 17 Π±Π°ΠΉΡ‚ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅. Π­Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΡ‚Ρ€Π°Π·ΠΈΡ‚ΡŒΡΡ Π½Π° характСристиках вашСй Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ io_read() Π΅Π΅ ΡƒΠΌΠ΅Π½ΠΈΠ΅ΠΌ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ… с Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ…ΡΡ Π² Π½Π°Π»ΠΈΡ‡ΠΈΠΈ.

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° EOF

ΠžΡΠΎΠ±Ρ‹ΠΌ случаСм согласования Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² областСй Π΄Π°Π½Π½Ρ‹Ρ… являСтся ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° EOF для строки фиксированной Π΄Π»ΠΈΠ½Ρ‹. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ считал Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ символ Β«\nΒ», дальнСйшиС Π΅Π³ΠΎ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ EOF.

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ контСкстной ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ

И Β«ΡƒΡ‡Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² областСй Π΄Π°Π½Π½Ρ‹Ρ…Β», ΠΈ Β«ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° EOFΒ» Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² OCB, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠΌ вашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ io_read(), ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π»Π°ΡΡŒ контСкстная информация β€” Π² частности, ΠΏΠΎΠ»Π΅ offset.

ОбновлСниС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ POSIX

И Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ сообраТСниС: ΠΏΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· рСсурса Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒΡΡ POSIX-пСрСмСнная Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ доступа atime (Β«access timeΒ» β€” «врСмя доступа»). Π­Ρ‚ΠΎ дСлаСтся для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ клиСнтская функция stat() ΠΌΠΎΠ³Π»Π° ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊ устройству ΠΊΡ‚ΠΎ-Ρ‚ΠΎ обращался.

БобствСнно ΠΊΠΎΠ΄

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡƒΡ‡Ρ‚Π΅Π½Ρ‹ всС Π²Ρ‹ΡˆΠ΅ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½Π½Ρ‹Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹. НиТС ΠΌΡ‹ Π΅Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ.

/*

 * io.read1.c

*/


#include <stdio.h>

#include <errno.h>

#include <sys/neutrino.h>

#include <sys/iofunc.h>


// наша строка с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ

char* data_string = "Здравствуй, ΠΌΠΈΡ€!\n";


int io_read(resmgr_context_t* ctp, io_read_t* msg,

 iofunc_ocb_t* ocb) {

 int sts;

 int nbytes;

 int nleft;

 int off;

 int xtype;

 struct _xtype_offset* xoffset;


 // 1) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎ Π»ΠΈ устройство Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅

 if ((sts ==

  iofunc_read_verify(ctp, msg, ocb, NULL)) != EOK) {

  return sts;

 }


 // 2) ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ XTYPE

 xtype = msg->i.xtype & _IO_XTYPE_MASK;

 if (xtype == _IO_XTYPE_OFFSET) {

  xoffset = (struct _xtype_offset*)(msg->i + 1);

  off = xoffset->offset;

 } else if (xtype = _IO_XTYPE_NONE) {

  off = ocb->offset;

 } else { // НСизвСстный Ρ‚ΠΈΠΏ; ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ

  return ENOSYS;

 }


 // 3) Бколько Π±Π°ΠΉΡ‚ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ?

 nleft = ocb->attr->nbytes – off;


 // 4) Бколько Π±Π°ΠΉΡ‚ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡ‚Π΄Π°Ρ‚ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ?

 nbytes = min(nleft, msg->i.nbytes);


 // 5) Если Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅, ΠΎΡ‚Π΄Π°Ρ‚ΡŒ ΠΈΡ… ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ

 if (nbytes) {

  MsgReply(ctp->rcvid, nbytes, data_string+off, nbytes);

  // 6) Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ "atime" для POSIX stat()

  ocb->attr->flags |=

   IOFUNC_ATTR_ATIME | IOFUNC_ATTR_DIRTY_TIME;

  // 7) Если индСкс lseek() Π½Π΅ Ρ€Π°Π²Π΅Π½ _IO_XTYPE_OFFSET,

  // ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π½Π° число считанных Π±Π°ΠΉΡ‚

  if (xtype == _IO_XTYPE_NONE) {

   ocb->offset += nbytes;

  }

 } else {

  // 8) НС Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅, просто Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°

  MsgReply(ctp->rcvid, EOK, null, 0);

 }


 // 9) Π‘ΠΊΠ°Π·Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΡƒΠΆΠ΅ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΠ»ΠΈ сами

 return _RESMGR_NOREPLY;

}

Π­Ρ‚Π°ΠΏ 1

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΡƒΠ±Π΅Π΄ΠΈΠ»ΠΈΡΡŒ, Ρ‡Ρ‚ΠΎ клиСнтский Π²Ρ‹Π·ΠΎΠ² open() Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ запросил ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ устройства Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅. Если Π±Ρ‹ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Π» устройство Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° запись, Π° Π·Π°Ρ‚Π΅ΠΌ попытался Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅, это слСдовало Π±Ρ‹ Ρ€Π°ΡΡ†Π΅Π½ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΎΡˆΠΈΠ±ΠΊΡƒ. Π’ этом случаС Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ функция iofunc_read_verify() Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΠ»Π° Π±Ρ‹ Π½Π°ΠΌ (Π·Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ β€” Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅, Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° β€” ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ) EBADF, Π° Π½Π΅ EOK.

Π­Ρ‚Π°ΠΏ 2

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠ»ΠΈ, ΡƒΠΊΠ°Π·Π°Π» Π»ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ сообщСния ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° (xtype-override) (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ссли ΠΌΡ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Π»ΠΈ устройство Π² Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅, Ρ‚ΠΎ это ΡƒΠΊΠ°Π·Π°Π»ΠΎ Π±Ρ‹, Ρ‡Ρ‚ΠΎ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ запроса ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π·Π°Π΄Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅). ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ аспСкт пСрСопрСдСлСнияа Ρ‚ΠΈΠΏΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚Ρ€Π°ΠΆΡ‘Π½ Π² послСднСм ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ iofunc_read_verify(), ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠΌ здСсь ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ NULL, указывая этим, Ρ‡Ρ‚ΠΎ этот вопрос нас Π½Π΅ Π²ΠΎΠ»Π½ΡƒΠ΅Ρ‚.

Π‘ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½ΠΎ, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ xtype. ΠžΡ‡Π΅Π½ΡŒ интСрСсСн, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ _IO_XTYPE_OFFSET, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, Ссли присутствуСт, ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ принятоС ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° сообщСниС содСрТит смСщСниС, ΠΈ Ρ‡Ρ‚ΠΎ опСрация чтСния Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Β«Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Ρ„Π°ΠΉΠ»Π°Β» для Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ дСскриптора (Ρ‚Π°ΠΊ Π΄Π΅Π»Π°Π΅Ρ‚, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, функция pread()). Если ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ _IO_XTYPE_OFFSET Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, Ρ‚ΠΎ опСрация чтСния ΠΌΠΎΠΆΠ΅Ρ‚ смСло ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Β«Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Ρ„Π°ΠΉΠ»Π°Β». ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ…type для сохранСния xtype, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Π²ΡˆΠ΅Π³ΠΎΡΡ Π² принятом сообщСнии, ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ off для прСдставлСния Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ смСщСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅. Π”Π°Π»Π΅Π΅, Π½Π° этапС 7, Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ Π΅Ρ‰Π΅ ΠΊΠΎΠ΅-ΠΊΠ°ΠΊΠΈΠ΅ дСйствия ΠΏΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° _IO_XTYPE_OFFSET.

Если присутствуСт ΠΈΠ½ΠΎΠ΅ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ xtype, Ρ‡Π΅ΠΌ _IO_XTYPE_OFFSET (ΠΈ это Π½Π΅ пустая ΠΊΠΎΠΌΠ°Π½Π΄Π° _IO_XTYPE_NONE), ΠΌΡ‹ отказываСмся ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ запрос ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ ENOSYS. Π­Ρ‚ΠΎ просто ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ Π·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, ΠΈ поэтому Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ ошибки.

Π­Ρ‚Π°ΠΏΡ‹ 3 ΠΈ 4

Π§Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ, сколько Π±Π°ΠΉΡ‚ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ, ΠΌΡ‹ выполняСм этапы 3 ΠΈ 4, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… выясняСтся, сколько Π±Π°ΠΉΡ‚ доступно Ρƒ устройства (Ρ€Π°Π·Π½ΠΎΡΡ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΠ»Π½Ρ‹ΠΌ объСмом устройства, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΌ ΠΈΠ· ocb->attr->nbytes, ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ смСщСниСм Π² устройствС). Π£Π·Π½Π°Π², сколько Π±Π°ΠΉΡ‚ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ, ΠΌΡ‹ Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ наимСньшСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ этого остатка ΠΈ количСством Π±Π°ΠΉΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ. НапримСр, Ρƒ нас ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡΡ‚Π°Ρ‚ΡŒΡΡ сСмь Π±Π°ΠΉΡ‚, Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π·Π°Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π°. Π’ этом случаС ΠΌΡ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π° Π±Π°ΠΉΡ‚Π°. И Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, Ссли ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π·Π°Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ 4096 Π±Π°ΠΉΡ‚, Π° Ρƒ нас ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сСмь, ΠΌΡ‹ смоТСм Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π΅ΠΌΡƒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сСмь Π±Π°ΠΉΡ‚.

Π­Ρ‚Π°ΠΏ 5

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, вычислив, сколько Π±Π°ΠΉΡ‚ ΠΌΡ‹ Π½Π°ΠΌΠ΅Ρ€Π΅Π½Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ряд Π²Π΅Ρ‰Π΅ΠΉ Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ ΠΌΡ‹ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ»ΠΈ Π½Π΅Ρ‚. Если Π΄Π°, Ρ‚ΠΎ ΠΌΡ‹ просто ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅ΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ сразу послС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π° этапС 5. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ для Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Π΄Π°Π½Π½Ρ‹Ρ… с ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ смСщСния ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ data_string + off (смСщСниС off вычисляСтся Π² зависимости ΠΎΡ‚ наличия пСрСопрСдСлСния Ρ‚ΠΈΠΏΠ°). ΠžΡ‚ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ MsgReply() β€” Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΎΠ½ упоминаСтся ΠΊΠ°ΠΊ Β«statusΒ» (Β«ΠΊΠΎΠ΄ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡΒ»), Π½ΠΎ Π² этом случаС ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π΅Π³ΠΎ для Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° числа Π±Π°ΠΉΡ‚. ΠœΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ Ρ‚Π°ΠΊ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ рСализация клиСнтской Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ read() Π·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π΅Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ MsgSendv() (Π° это, кстати, ΠΊΠ°ΠΊ Ρ€Π°Π· ΠΈ Π΅ΡΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ status Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ MsgReply()) прСдставляСт собой число Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Π½Ρ‹Ρ… Π±Π°ΠΉΡ‚ β€” это общСизвСстноС соглашСниС.