ΠΡΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅ ΡΡΡΡΠΊΡΡΡ ΡΠΈΠΏΠ° 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(). ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΎΠ½ΠΈ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΉ Π½Π°Π±ΠΎΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ²!