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

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

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

#include <sys/iofunc.h>

Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹ фактичСски опрСдСляСтС содСрТимоС Π²Π°ΡˆΠΈΡ… Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹Ρ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½Ρ‹Ρ… записСй. ΠžΡ‚ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Π°Ρ атрибутная запись Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π² сСбя ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½ΡƒΡŽ запись ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ элСмСнтом β€” Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΡΠ»ΡƒΡ‡Π°ΡŽ с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ OCB (ΠΈ ΠΏΠΎ Ρ‚Π΅ΠΌ ΠΆΠ΅ самым ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ).

Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… администратора рСсурсов

Π”ΠΎ настоящСго ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° ΠΌΡ‹ ΠΈΠ·Π±Π΅Π³Π°Π»ΠΈ Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€ΠΎΠ² ΠΎ возмоТности блокирования Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… администратора рСсурсов. ΠœΡ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ функция-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, io_read()), ΠΈ Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ доступны Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ. А Ρ‡Ρ‚ΠΎ Ссли Π½Π°ΠΌ придСтся Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ…? НапримСр, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ read() ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΏΠΎΡ€Ρ‚Ρƒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ блокирования Π΄ΠΎ ΠΏΡ€ΠΈΠ΅ΠΌΠ° символа. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€Π΅Π΄ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, сколько ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊΠΎΠ΅ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅.

Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… администратора рСсурсов базируСтся Π½Π° Ρ‚Π΅Ρ… ΠΆΠ΅ самых ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ обсуТдали Π² Π³Π»Π°Π²Π΅ «ОбмСн сообщСниями» β€” Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ², администратор рСсурса фактичСски являСтся сСрвСром, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Ρ€Π°Π΄ Ρ‡Π΅Ρ‚ΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… сообщСний. Когда ΠΏΡ€ΠΈΠ±Ρ‹Π²Π°Π΅Ρ‚ сообщСниС, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ клиСнтскому запросу read(), ΠΎΠ½ΠΎ ΠΏΡ€ΠΈΠ±Ρ‹Π²Π°Π΅Ρ‚ вмСстС с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ отправитСля (receive ID), ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ блокируСтся. Если Ρƒ администратора рСсурсов Π΅ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, ΠΎΠ½ просто Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΡ… ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ, ΠΊΠ°ΠΊ ΠΌΡ‹ ΡƒΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Ρ€Π°Π½Π΅Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…. Однако, Ссли Π΄Π°Π½Π½Ρ‹Π΅ нСдоступны, администратор рСсурсов Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ этого ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π² Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ состоянии (ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Ссли ΠΊΠ»ΠΈΠ΅Π½Ρ‚ для этой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ» Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅ΠΆΠΈΠΌ), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π΄Ρ€ΡƒΠ³ΠΈΡ… сообщСний. РСально это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ администратора рСсурсов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ принял сообщСниС ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ… β€” Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС это ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ΡŒΡΡ для администратора рСсурсов ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΌ числом Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠΆΠΈΠ΄Π°Π» Π±Ρ‹ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΡ‚ Π½Π΅ΠΊΠΎΠ΅Π³ΠΎ устройства.

ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ для этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ являСтся сохранСниС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° отправитСля ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ сообщСния Π² ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· вашСго ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° константы _RESMGR._NOREPLY. Π­Ρ‚ΠΎ ΡƒΠΊΠ°ΠΆΠ΅Ρ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ администратора рСсурсов, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сообщСния Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½Π°, Π½ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΏΠΎΠΊΠ° Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ Π½Π°Π΄ΠΎ.

НСсколько ΠΏΠΎΠ·ΠΆΠ΅, ΠΏΠΎ готовности Π΄Π°Π½Π½Ρ‹Ρ…, Π²Ρ‹ смоТСтС Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ отправитСля Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ ΡΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚Π½ΠΎΠ΅ сообщСниС с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. ПослС этого ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ.

Π’Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ эту ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚ΠΎΠ², ΠΊΠ°ΠΊ ΠΌΡ‹ это Π΄Π΅Π»Π°Π»ΠΈ Π² Π³Π»Π°Π²Π΅ «Часы, Ρ‚Π°ΠΉΠΌΠ΅Ρ€Ρ‹ ΠΈ пСриодичСскиС увСдомлСния» (ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„ Β«ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ сСрвСром Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Ρ‹Β»). Если Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ Π²ΠΊΡ€Π°Ρ‚Ρ†Π΅, Ρ‚Π°ΠΌ ΠΏΠΎ истСчСнии Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ клиСнтский запрос считался «просрочСнным», ΠΈ сСрвСр ΠΎΡ‚Π²Π΅Ρ‡Π°Π» ΠΏΠΎ сохранСнному ΠΏΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρƒ отправитСля Π½Π΅ΠΊΠΈΠΌ сообщСниСм ΠΎΠ± ошибкС.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ элСмСнтов ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Ρ€Π°Π½Π΅Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ io_read() ΠΌΡ‹ ΡƒΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ, ΠΊΠ°ΠΊ происходит Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ Π΄Π°Π½Π½Ρ‹Ρ…. Как Π±Ρ‹Π»ΠΎ упомянуто Π² описании Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ io_read() (Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ «Алфавитный список Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ установлСния соСдинСния ΠΈ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°Β»), io_read() ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΈ элСмСнты ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Ρ‚ΠΎΠΆΠ΅. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ всСм, я Ρ€Π΅ΡˆΠΈΠ» Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ этот вопрос здСсь ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ.

ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΈ ΠΊΠΎΠ³Π΄Π° вашСй io_read() ΠΌΠΎΠ³Π»ΠΎ Π±Ρ‹ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ элСмСнты ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, Π° Π½Π΅ «сырыС» Π΄Π°Π½Π½Ρ‹Π΅.

Если Π²Ρ‹ дискрСтно ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚Π΅ элСмСнты Π² пространствС ΠΈΠΌΠ΅Π½ΠΈ ΠΏΡƒΡ‚Π΅ΠΉ, ΠΈ эти элСмСнты Π½Π΅ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ Ρ„Π»Π°Π³ΠΎΠΌ _RESMGR_FLAG_DIR, Ρ‚ΠΎΠ³Π΄Π° Π²Π°ΠΌ Π½Π΅ придСтся Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ элСмСнты ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ io_read(). Если Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ это ΠΊΠ°ΠΊ Β«Ρ„Π°ΠΉΠ»ΠΎΠ²ΡƒΡŽ систСму», Ρ‚ΠΎ ваш ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ Β«Ρ„Π°ΠΉΠ»ΠΎΠΌΒ». Если ΠΆΠ΅, с Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Π²Ρ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ _RESMGR_FLAG_DIR, Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ создан ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° Β«ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Β». Никто, ΠΊΡ€ΠΎΠΌΠ΅ вас, Π½Π΅ Π·Π½Π°Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΎ содСрТимом этого ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, поэтому Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ эти Π΄Π°Π½Π½Ρ‹Π΅. Π­Ρ‚ΠΎ ΠΈ Π΅ΡΡ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° вопрос, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ io_read() ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ элСмСнты ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ².

Π’ΠΎΠΎΠ±Ρ‰Π΅ говоря…

Π’ΠΎΠΎΠ±Ρ‰Π΅ говоря, Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ элСмСнтов ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° β€” это ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ «сырых» Π΄Π°Π½Π½Ρ‹Ρ…, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ:

β€’ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Ρ†Π΅Π»ΠΎΠ΅ число структур Ρ‚ΠΈΠΏΠ° struct dirent;

β€’ ΡΡ‚ΠΈ структуры struct dirent Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Ρ‹.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡƒΠ½ΠΊΡ‚ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, сСмь с ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½ΠΎΠΉ структур struct dirent. Если восСмь структур Π½Π΅ Π²ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π² Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ пространство, Ρ‚ΠΎ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сСмь элСмСнтов.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΡƒΠ½ΠΊΡ‚ достаточно ΠΎΡ‡Π΅Π²ΠΈΠ΄Π΅Π½. Он упомянут здСсь Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ структуры struct dirent ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСсколько Β«Ρ…ΠΈΡ‚Ρ€Π΅Π΅Β», Ρ‡Π΅ΠΌ «сырой» ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ Π² случаС с Β«ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉΒ» io_read().

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° struct dirent ΠΈ Π΅Π΅ Π΄Ρ€ΡƒΠ·ΡŒΡ

Π”Π°Π²Π°ΠΉΡ‚Π΅ взглянСм Π½Π° структуру struct dirent, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ функция io_read() Π² случаС чтСния ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΊΡ€Π°Ρ‚Ρ†Π΅ рассмотрим клиСнтскиС Π²Ρ‹Π·ΠΎΠ²Ρ‹, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ Π΄Π΅Π»ΠΎ с элСмСнтами ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ², ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρƒ Π½ΠΈΡ… со структурой struct dirent сущСствуСт ряд интСрСсных Π²Π·Π°ΠΈΠΌΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ.

Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°ΠΌΠΈ, ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ closedir(), opendir(), readdir(), rewinddir(), seekdir() ΠΈ telldir().

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° сходство с Β«Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈΒ» Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для Ρ„Π°ΠΉΠ»ΠΎΠ² (ΠΈ совпадСниС примСняСмых Ρ‚ΠΈΠΏΠΎΠ² сообщСний):

Ѐункция для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°ΠΌΠΈ Ѐункция для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ closedir() close() IO_CLOSE_DUP opendir() open() _IO_CONNECT readdir() read() _IO_READ rewinddir() lseek() _IO_LSEEK seekdir() lseek() _IO_LSEEK telldir() tell() _IO_LSEEK

Если ΠΌΡ‹ Π½Π° ΠΌΠ³Π½ΠΎΠ²Π΅Π½ΠΈΠ΅ Π²ΠΎΠΎΠ±Ρ€Π°Π·ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ opendir() ΠΈ closedir() Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹ для нас автоматичСски, ΠΌΡ‹ смоТСм ΡΠΊΠΎΠ½Ρ†Π΅Π½Ρ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° сообщСниях Ρ‚ΠΈΠΏΠ° _IO_READ ΠΈ _IO_LSEEK ΠΈ Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΈΠΌ функциях.

БмСщСния

Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ _IO_LSEEK ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ Π΅ΠΌΡƒ функция ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ для «поиска» (ΠΈΠ»ΠΈ «пСрСмСщСния») Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… Ρ„Π°ΠΉΠ»Π°. Π‘ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠΌ происходит Ρ‚Π° ΠΆΠ΅ история. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒΡΡ ΠΊ Β«ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒΒ» элСмСнту ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° (ΠΊΠ°ΠΊ явно Π·Π°Π΄Π°Π² смСщСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ seekdir(), Ρ‚Π°ΠΊ ΠΈ Π²Ρ‹Π·Π²Π°Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ rewinddir()) ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒΡΡ ΠΊ Π»ΡŽΠ±ΠΎΠΌΡƒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΌΡƒ элСмСнту (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ seekdir()), ΠΈΠ»ΠΈ ΠΆΠ΅ ΡƒΠ·Π½Π°Ρ‚ΡŒ свою Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π² спискС элСмСнтов ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° (Π²Ρ‹Π·Π²Π°Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ telldir()).

Однако, Β«Ρ…ΠΈΡ‚Ρ€ΠΎΡΡ‚ΡŒΒ» ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°ΠΌΠΈ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ смСщСния Π·Π°Π΄Π°Π΅Ρ‚Π΅ Π²Ρ‹ сами, ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈΠΌΠΈ Ρ‚ΠΎΠΆΠ΅ всСцСло Π»Π΅ΠΆΠΈΡ‚ Π½Π° вас. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°Π·Π½Π°Ρ‡Π°Ρ‚ΡŒ смСщСния элСмСнтов Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ Ρ€Π°Π²Π½Ρ‹ΠΌΠΈ ΠΊΠ°ΠΊ Β«0Β», Β«2Β» ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅, Ρ‚Π°ΠΊ ΠΈ Β«0Β», Β«64Β», Β«128Β» ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. ЕдинствСнно, Ρ‡Ρ‚ΠΎ здСсь Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ β€” Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ io_lseek() ΠΈ io_read() ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ²Π°Π»ΠΈ эти смСщСния.

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ простой ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ с Π½ΠΎΠΌΠ΅Ρ€Π°ΠΌΠΈ Β«0Β», Β«1Β», Β«2Β», ΠΈ Ρ‚.Π΄. (Π’Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Β«0Β», Β«64Β», Β«128Β», ΠΈ Ρ‚.Π΄., Ссли Π±Ρ‹ эти числа соотвСтствовали, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π΅ΠΊΠΈΠΌ смСщСниям Π½Π° носитСлС. Π’Ρ‹Π±ΠΎΡ€ Π·Π° Π²Π°ΠΌΠΈ!)

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅

Ну Π²ΠΎΡ‚, остаСтся «просто» Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ struct dirent «содСрТимым» нашСго ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° struct dirent выглядит Ρ‚Π°ΠΊ (взято ΠΈΠ· <dirent.h>):

struct dirent {

 ino_t    d_ino;

 off_t    d_offset;

 uint16_t d_reclen;

 uint16_t d_namelen;

 char     d_name[1];

};

ΠšΠΎΡ€ΠΎΡ‚ΠΊΠΎ ΠΎ Π΅Π΅ полях:

d_ino Β«Π˜Π½Π΄Π΅ΠΊΡΠ½Ρ‹ΠΉ дСскриптор» (Β«inodeΒ») β€” ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ для Ρ‚ΠΎΡ‡ΠΊΠΈ монтирования порядковый Π½ΠΎΠΌΠ΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ (Π½ΡƒΠ»ΡŒ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π» Π±Ρ‹ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ элСмСнт, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π΄Π°Π½Π½ΠΎΠΌΡƒ индСксному дСскриптору, являСтся свободным/пустым). d_offset Π‘ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ. Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ это Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ числа Ρ‚ΠΈΠΏΠ° Β«0Β», Β«1Β», Β«2Β», ΠΈ Ρ‚.Π΄. d_reclen Π Π°Π·ΠΌΠ΅Ρ€ структуры struct dirent Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π»ΡŽΠ±Ρ‹Π΅ добавляСмыС Π² Π½Π΅Π΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ. Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΠΈ для выравнивания ΠΏΡ€ΠΈ вычислСнии Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ. d_namelen Число символов Π² ΠΏΠΎΠ»Π΅ d_name, Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ ΠΊΠΎΠ½Ρ†Π° строки NULL. d_name Имя элСмСнта ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠΌ ΠΊΠΎΠ½Ρ†Π° строки β€” NULL.

ΠŸΡ€ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π΅ структур Ρ‚ΠΈΠΏΠ° struct dirent ΠΊΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пСрСдаСтся ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ, прСдставляСт собой число Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½Ρ‹Ρ… Π±Π°ΠΉΡ‚.