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

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

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

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

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

Π”Π°Π²Π°ΠΉΡ‚Π΅ для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° создадим администратора ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ рСсурса /dev/atoz. Π­Ρ‚ΠΎΡ‚ администратор зарСгистрируСт Β«Ρ„Π°ΠΉΠ»Ρ‹Β» с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΎΡ‚ /dev/atoz/a Π΄ΠΎ /dev/atoz/z, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Π° cat, примСнСнная ΠΊ Π»ΡŽΠ±ΠΎΠΌΡƒ ΠΈΠ· Π½ΠΈΡ…, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π»Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΈΡ… ΠΈΠΌΠ΅Π½Π°ΠΌ Π·Π°Π³Π»Π°Π²Π½Ρ‹Π΅ Π±ΡƒΠΊΠ²Ρ‹. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ это Π΄ΠΎΠ»ΠΆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Π²ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎ-строковой сСссии:

# cd /dev


# ls

atoz  null  ptyp2 socket ttyp0 ttyp3

enet0 ptyp0 ptyp3 text   ttyp1 zero

mem   ptyp1 shmem tty    ttyp2


# ls -ld atoz

dr-xr-xr-x 1 root 0 26 Sep 05 07:59 atoz


# cd atoz

# ls

a  e  i  m  q  u  y

b  f  j  n  r  v  z

c  g  k  o  s  w

d  h  l  p  t  x


# ls -l e

-r--r--r-x 1 root 0 1 Sep 05 07:59 e


# cat m

M# cat q

Q#

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ /dev Π΅ΡΡ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ atoz, ΠΈ Ρ‡Ρ‚ΠΎ ΠΊ Π½Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ls ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π² Π½Π΅Π³ΠΎ cd. Π”Π°Π½Π½Ρ‹ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ /dev/atoz ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ Β«26Β» β€” ΠΌΡ‹ Ρ‚Π°ΠΊ Π·Π°Π΄Π°Π»ΠΈ Π² нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. Π‘ΠΌΠ΅Π½ΠΈΠ² Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π½Π° atoz ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ ls, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π΅Π³ΠΎ содСрТимоС β€” Ρ„Π°ΠΉΠ»Ρ‹ с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΎΡ‚ Π° Π΄ΠΎ z. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² ls для ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° β€” Π² Π΄Π°Π½Π½ΠΎΠΌ случаС для Ρ„Π°ΠΉΠ»Π° e β€” ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρ„Π°ΠΉΠ» доступСн ΠΏΠΎ Ρ‡Ρ‚Π΅Π½ΠΈΡŽ всСм (Ρ‡Π°ΡΡ‚ΡŒ Β«-r--r--r--Β») ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€, Ρ€Π°Π²Π½Ρ‹ΠΉ 1 Π±Π°ΠΉΡ‚Ρƒ. НаконСц, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… cat ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ„Π°ΠΉΠ»Ρ‹ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠΌΠ΅ΡŽΡ‚ заявлСнноС содСрТимоС. (ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ„Π°ΠΉΠ»Ρ‹ содСрТат Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Π±Π°ΠΉΡ‚ ΠΈ Π½Π΅ содСрТат символа Π½ΠΎΠ²ΠΎΠΉ строки, послС Π²Ρ‹Π²ΠΎΠ΄Π° символа строка Π½Π΅ пСрСводится, ΠΈ ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠ³ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° оказываСтся Π½Π° Ρ‚ΠΎΠΉ ΠΆΠ΅ самой строкС, Ρ‡Ρ‚ΠΎ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ cat.)

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ Π½ΡƒΠΆΠ½Ρ‹Π΅ характСристики, Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° ΠΊΠΎΠ΄. Он Ρ€Π°Π·Π±ΠΈΡ‚ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

main() ΠΈ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ

Основная функция; здСсь ΠΌΡ‹ всС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ ΠΈ запускаСм наш администратор рСсурса.

my_open()

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сообщСния _IO_CONNECT.

my_read()

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сообщСния _IO_READ.

my_read_dir() ΠΈ my_read_file()

Π’Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ Ρ„Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ my_read().

dirent_size() ΠΈ dirent_fill()

БСрвисныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ со структурой struct dirent.

Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·Π±ΠΈΡ‚ Π½Π° ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅ сСкции, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΠΆΠ°Π΅ΠΌΡ‹Π΅ тСкстовыми пояснСниями, Π°Ρ€Ρ…ΠΈΠ² с ΠΏΠΎΠ»Π½Ρ‹ΠΌ исходным тСкстом Π² Π²ΠΈΠ΄Π΅ Π΅Π΄ΠΈΠ½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΌΠΎΠΆΠ½ΠΎ Π²Π·ΡΡ‚ΡŒ Π½Π° Π²Π΅Π±-сайтС ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ PARSE Software Devices (http://www.parse.com/), ΠΎΠ½ называСтся atoz.c.

main() ΠΈ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Ρ€Π°Π·Π΄Π΅Π» ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ прСдставляСт собой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ main() ΠΈ ряд Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΉ. Для удобства объявлСн макрос ALIGN(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функциями dirent_size() ΠΈ dirent_fill() для выравнивания.

Массив atoz_attrs содСрТит Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½Ρ‹Π΅ записи, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ для Β«Ρ„Π°ΠΉΠ»ΠΎΠ²Β». ΠœΡ‹ объявляСм массив ΠΈΠ· NUM_ENTS элСмСнтов, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ NUM_ENTS (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ 26) Ρ„Π°ΠΉΠ»ΠΎΠ² β€” ΠΎΡ‚ Β«Π°Β» Π΄ΠΎ Β«zΒ». Атрибутная запись, примСняСмая нСпосрСдствСнно для ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ для /dev/atoz, объявлСна Π² Ρ‚Π΅Π»Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main() ΠΈ называСтся просто attr. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠ΅ содСрТимоС Ρƒ этих Π΄Π²ΡƒΡ… Ρ‚ΠΈΠΏΠΎΠ² Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½Ρ‹Ρ… записСй:

Ѐайловая атрибутная запись:

 ΠœΠ°Ρ€ΠΊΠΈΡ€ΡƒΠ΅Ρ‚ся ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» (константа S_IFREG) с Ρ€Π΅ΠΆΠΈΠΌΠΎΠΌ доступа 0444 (это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ доступ ΠΏΠΎ Ρ‡Ρ‚Π΅Π½ΠΈΡŽ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ, Π½ΠΎ доступа ΠΏΠΎ записи Π½Π΅Ρ‚ Π½ΠΈ Ρƒ ΠΊΠΎΠ³ΠΎ). Π Π°Π·ΠΌΠ΅Ρ€ Ρ€Π°Π²Π΅Π½ Β«1Β» β€” Ρ„Π°ΠΉΠ» содСрТит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Π±Π°ΠΉΡ‚, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΡ€ΠΎΠΏΠΈΡΠ½ΡƒΡŽ Π±ΡƒΠΊΠ²Ρƒ, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ своСму ΠΈΠΌΠ΅Π½ΠΈ. Π˜Π½Π΄Π΅ΠΊΡΠ½Ρ‹Π΅ дСскрипторы (inodes) этих Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΡ€ΠΎΠ½ΡƒΠΌΠ΅Ρ€ΠΎΠ²Π°Π½Ρ‹ ΠΎΡ‚ Β«1Β» Π΄ΠΎ Β«26Β» Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ (Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ Π²Π·ΡΡ‚ΡŒ числа ΠΎΡ‚ Β«0Β» Π΄ΠΎ Β«25Β», Π½ΠΎ Ρ†ΠΈΡ„Ρ€Π° Β«0Β» Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π°).

ΠšΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ²Π°Ρ атрибутная запись:

ΠœΠ°Ρ€ΠΊΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ Ρ„Π°ΠΉΠ» Ρ‚ΠΈΠΏΠ° Β«ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Β» (константа S_IFDIR) с Ρ€Π΅ΠΆΠΈΠΌΠΎΠΌ доступа 0555 (это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ доступ ΠΏΠΎ Ρ‡Ρ‚Π΅Π½ΠΈΡŽ ΠΈ поиску ΠΈΠΌΠ΅Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ, Π½ΠΎ доступа ΠΏΠΎ записи Π½Π΅Ρ‚ Π½ΠΈ Ρƒ ΠΊΠΎΠ³ΠΎ). Π Π°Π·ΠΌΠ΅Ρ€ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΊΠ°ΠΊ Β«26Β» β€” это просто число, взятоС ΠΏΠΎ количСству элСмСнтов Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅. Π˜Π½Π΄Π΅ΠΊΡΠ½Ρ‹ΠΉ дСскриптор Π²Ρ‹Π±Ρ€Π°Π½ Ρ€Π°Π²Π½Ρ‹ΠΌ Β«27Β» β€” это число Π·Π°Π²Π΅Π΄ΠΎΠΌΠΎ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ большС Π½ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½ΠΎΠΉ записи.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ»Π΅ open структуры connect_func ΠΈ ΠΏΠΎΠ»Π΅ read структуры io_func. Для всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ сохранСны POSIX-значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

НаконСц, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΊΠ°ΠΊ ΠΌΡ‹ создали имя /dev/atoz, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ resmgr_attach(). НаиболСС Π²Π°ΠΆΠ½Ρ‹ΠΌ здСсь являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠ»ΠΈ Ρ„Π»Π°Π³ _RESMGR_FLAG_DIR, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сообщаСт администратору процСссов, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ запросы Π½Π° эту Ρ‚ΠΎΡ‡ΠΊΡƒ монтирования ΠΈ Π½ΠΈΠΆΠ΅.

/*

 * atoz.с

 *

 * /dev/atoz с использованиСм Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ администратора рСсурсов

*/

#include <stdio.h>

#include <stddef.h>

#include <stdlib.h>

#include <errno.h>

#include <dirent.h>

#include <limits.h>

#include <sys/iofunc.h>

#include <sys/dispatch.h>


#define ALIGN(x) (((x) +3) & ~3)

#define NUM_ENTS 26


static iofunc_attr_t atoz_attrs[NUM_ENTS];


int main (int argc, char **argv) {

 dispatch_t *dpp;

 resmgr_attr_t resmgr_attr;

 resmgr_context_t *ctp;

 resmgr_connect_funcs_t connect_func;

 resmgr_io_funcs_t io_func;

 iofunc_attr_t attr;

 int i;


 // Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ структуру диспСтчСризации

 if ((dpp = dispatch_create()) == NULL) {

  perror("Ошибка dispatch_create\n");

  exit(EXIT_FAILURE);

 }


 // Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ структуры Π΄Π°Π½Π½Ρ‹Ρ…

 memset(&resmgr_attr, 0, sizeof(resmgr_attr));

 resmgr_attr.nparts_max = 1;

 resmgr_attr.msg_max_size = 2048;


 // ΠΠ°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

 iofunc_func_init(_RESMGR_CONNECT_NFUNCS, &connect_func,

  _RESMGR_IO_NFUNCS, &io_func);


 // Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½ΡƒΡŽ запись для

 // ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°...

 iofunc_attr_init(&attr, S_IFDIR | 0555, 0, 0);

 attr.inode = NUM_ENTS + 1; // 1-26 Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ для

                            // Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΎΡ‚ Β«aΒ» Π΄ΠΎ Β«zΒ»

 attr.nbytes = NUM_ENTS; // 26 элСмСнтов Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅


 // ...ΠΈ для ΠΈΠΌΠ΅Π½ ΠΎΡ‚ Β«aΒ» Π΄ΠΎ Β«zΒ»

 for (i = 0; i < NUM_ENTS; i++) {

  iofunc_attr_init(&atoz_attrs[i], S_IFREG | 0444, 0, 0);

  atoz_attrs[i].inode = i + 1;

  atoz_attrs[i].nbytes = 1;

 }

 // Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ наши Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ; Π½Π°ΠΌ интСрСсны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ io_open

 // ΠΈ io_read

 connect_func.open = my_open;

 io_func.read = my_read;


 // Π—Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ прСфикс

 if (resmgr_attach(dpp, &resmgr_attr, "/dev/atoz",

  _FTYPE_ANY, _RESMGR_FLAG_DIR, &connect_func,

  &io_func, &attr) == -1) {

  perror("Ошибка resmgr_attach\n");

  exit(EXIT_FAILURE);

 }


 // Π’Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ контСкст

 ctp = resmgr_context_alloc(dpp);


 // Π–Π΄Π°Ρ‚ΡŒ сообщСний Π² Π²Π΅Ρ‡Π½ΠΎΠΌ Ρ†ΠΈΠΊΠ»Π΅

 while (1) {

  if ((ctp = resmgr_block(ctp)) == NULL) {

   perror("Ошибка resmgr_block\n");

   exit(EXIT_FAILURE);

  }

  resmgr_handler(ctp);

 }

}

my_open()

ΠŸΡ€ΠΈ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ функция my_open() ΠΎΡ‡Π΅Π½ΡŒ Π½Π΅Π²Π΅Π»ΠΈΠΊΠ°, Π² Π½Π΅ΠΉ Π΅ΡΡ‚ΡŒ ряд критичСских мСст. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΎ Ρ‚ΠΎΠΌ, Π±Ρ‹Π» Π»ΠΈ рСсурс ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ ΠΊΠ°ΠΊ Β«Ρ„Π°ΠΉΠ»Β» ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ Β«ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Β», Π½Π° основС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π»ΠΈΠ½Ρ‹ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΡƒΡ‚ΠΈ. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ сСбС это ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ², ΠΊΡ€ΠΎΠΌΠ΅ основного, Π² этом администраторС рСсурсов Π½Π΅Ρ‚. Если Π²Ρ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Ρ€Π°ΡΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π½ΠΈΠΆΠ΅ вашСй Ρ‚ΠΎΡ‡ΠΊΠΈ монтирования Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ, Π²Π°ΠΌ придСтся ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ слоТный ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π°Π½Π°Π»ΠΈΠ·Π° поля path структуры msg. Π’ нашСм простом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Ссли Π² ΠΈΠΌΠ΅Π½ΠΈ ΠΏΡƒΡ‚ΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅Ρ‚, Ρ‚ΠΎ ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ это ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³. Π’Π°ΠΊΠΆΠ΅ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ коррСктности ΠΈΠΌΠ΅Π½ΠΈ ΠΏΡƒΡ‚ΠΈ: ΠΌΡ‹ просто провСряСм, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ символ, ΠΈ Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π»Π΅ΠΆΠΈΡ‚ Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΎΡ‚ Β«aΒ» Π΄ΠΎ Β«zΒ» Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ. ΠžΠΏΡΡ‚ΡŒ ΠΆΠ΅, Π² случаС Π±ΠΎΠ»Π΅Π΅ слоТного администратора рСсурсов Π²Π°ΠΌ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π° ΠΈΠΌΠ΅Π½ΠΈ, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π·Π° зарСгистрированной Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ монтирования.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½ΠΎΠΉ особСнности. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΊΠ°ΠΊ ΠΌΡ‹ использовали для выполнСния всСй нашСй Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ POSIX-уровня ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ! Ѐункция iofunc_open_default() ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ размСщаСтся Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ установлСния соСдинСния Π² Ρ‚ΠΎΠΉ ΠΆΠ΅ самой ячСйкС, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ сСйчас Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ наша функция my_open(). Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²!