chinayutsya s kosoj cherty (/). Naprimer:
qnx/fsys | lokal'noe imya |
company/xyz | lokal'noe imya |
/company/xyz | global'noe imya |
My rekomenduem vam ispol'zovat' nazvanie vashej kompanii v kachestve prefiksa dlya vseh registriruemyh imen, chtoby izbezhat' konfliktov imen mezhdu programmami raznyh proizvoditelej. |
CHtoby sdelat' vozmozhnym ispol'zovanie global'nyh imen, hotya by na odnom uzle seti dolzhen byt' zapushchen process, izvestnyj kak opredelitel' imen (utilita nameloc). |tot process vedet uchet vseh zaregistrirovannyh global'nyh imen.
V kazhdyj moment vremeni v seti mogut byt' zapushcheny do desyati opredelitelej imen. Kazhdyj hranit identichnye kopii vseh aktivnyh global'nyh imen. Takaya izbytochnost' garantiruet normal'noe funkcionirovanie seti, dazhe esli odin ili neskol'ko uzlov, obespechivayushchih opredelenie imen, vyjdut iz stroya odnovremenno.
CHtoby zaregistrirovat' imya, process server ispol'zuet funkciyu Si qnx_name_attach(). CHtoby opredelit' process po imeni, process klient ispol'zuet funkciyu Si qnx_name_locate().
V QNX ischislenie vremeni osnovyvaetsya na sistemnom tajmere, podderzhivaemom operacionnoj sistemoj. Tajmer soderzhit tekushchee znachenie Koordinirovannogo Vsemirnogo Vremeni (UTC) otnositel'no 0 chasov, 0 minut, 0 sekund, 1 yanvarya 1970 goda. CHtoby opredelit' mestnoe vremya, funkcii ischisleniya vremeni ispol'zuyut peremennuyu okruzheniya TZ (kotoraya opisyvaetsya v knige Rukovodstvo pol'zovatelya).
Prostye sredstva otscheta vremeni
Komandnye fajly i processy mogut delat' pauzu na opredelennoe kolichestvo sekund, ispol'zuya prostye sredstva otscheta vremeni. V komandnyh fajlah dlya etoj celi ispol'zuetsya utilita sleep; v processah ispol'zuetsya funkciya Si sleep(). Takzhe mozhet ispol'zovat'sya funkciya delay(), kotoroj v kachestve argumenta peredaetsya dlina intervala vremeni v millisekundah.
Bolee slozhnoe sredstvo otscheta vremeni
Krome togo, process mozhet sozdavat' tajmery, ustanavlivat' ih na opredelennyj interval vremeni i udalyat' tajmer. |ti sredstva otscheta vremeni osnovyvayutsya na specifikacii POSIX Std 1003.4/Draft 9.
Process mozhet sozdat' odin ili bol'she tajmerov. |ti tajmery mogut byt' lyubyh tipov i v lyubom sochetanii. S uchetom konfiguriruemogo ogranicheniya obshchego chisla tajmerov, podderzhivaemyh operacionnoj sistemoj (smotri Proc v Opisanie utilit). Dlya sozdaniya tajmera ispol'zujte funkciyu timer_create().
Pri ustanovke tajmerov vy mozhete ispol'zovat' odin iz dvuh tipov intervalov vremeni:
Vy takzhe mozhete sozdat' tajmer, periodicheski srabatyvayushchij s zadannym intervalom vremeni. Naprimer, vy ustanovili tajmer takim obrazom, chtoby on srabotal zavtra v 9 chasov utra. Vy mozhete zadat', chtoby posle etogo on srabatyval kazhdye 5 minut.
Vy takzhe mozhete ustanovit' vremennoj interval dlya sushchestvuyushchego tajmera. Rezul'tat budet zaviset' ot tipa intervala vremeni:
CHtoby ustanovit' tajmer: | Ispol'zujte funkciyu: |
---|---|
Absolyutnyj ili otnositel'nyj interval | timer_settime() |
CHtoby udalit' tajmer, ispol'zujte funkciyu Si timer_delete().
Vy mozhete ustanovit' razreshenie dlya tajmera s pomoshch'yu utility ticksize ili funkcii qnx_timerperiod(). Vy mozhete nastraivat' razreshenie ot 500 mikrosekund do 50 millisekund.
CHtoby uznat' ostavshijsya ot tajmera interval ili proverit', ne byl li tajmer udalen, ispol'zujte funkciyu Si timer_gettime().
Obrabotchiki preryvanij obsluzhivayut sistemu apparatnyh preryvanij komp'yutera - oni reagiruyut na apparatnye preryvaniya i osushchestvlyayut peredachu dannyh mezhdu komp'yuterom i vneshnimi ustrojstvami na nizkom urovne.
Obrabotchiki preryvanij fizicheski yavlyayutsya chast'yu standartnogo processa QNX (naprimer, drajver), no oni vsegda vypolnyayutsya asinhronno po otnosheniyu k processu, v kotoryj oni vklyucheny.
Obrabotchik preryvanij:
Neskol'ko processov mogut obrabatyvat' odno i to zhe preryvanie (esli eto podderzhivaetsya apparatno). Kogda proishodit fizicheskoe preryvanie, vse obrabotchiki preryvanij budut po ocheredi poluchat' upravlenie. Ne dolzhno delat'sya nikakih predpolozhenij otnositel'no poryadka, v kotorom budut vyzyvat'sya obrabotchiki preryvanij, razdelyayushchie odno i to zhe preryvanie.
Esli vy hotite: | Ispol'zujte funkciyu: |
---|---|
Ustanovit' obrabotchik preryvaniya | qnx_hint_attach() |
Udalit' obrabotchik preryvaniya | qnx_hint_detach() |
Obrabotchiki preryvaniya tajmera
Vy mozhete ustanovit' obrabotchik preryvaniya neposredstvenno dlya sistemnogo tajmera takim obrazom, chto obrabotchik budet vyzyvat'sya po kazhdomu preryvaniyu tajmera. CHtoby ustanovit' period, vy mozhete ispol'zovat' utilitu ticksize.
Vy mozhete takzhe ustanovit' obrabotchik preryvaniya dlya otmasshtabirovannogo preryvaniya tajmera, kotoroe budet proishodit' kazhdye 50 millisekund, nezavisimo ot tick size. |ti tajmery predlagayut nizkourovnevuyu al'ternativu POSIX 1003.4 tajmeram.
|ta glava ohvatyvaet sleduyushchie temy:
Prostranstvo imen vvoda/vyvoda
Resursy vvoda/vyvoda (I/O, ot anglijskogo Input/Output) v QNX ne vstroeny vnutr' Mikroyadra. Processy obsluzhivayushchie vvod/vyvod zapuskayutsya dinamicheski vo vremya raboty sistemy. Tak kak fajlovaya sistema QNX yavlyaetsya neobyazatel'nym elementom, to prostranstvo putej (polnyh imen fajlov i katalogov) ne vstroeno vnutr' fajlovoj sistemy, v otlichie ot bol'shinstva monolitnyh sistem.
Prefiksy i oblasti polnomochij
V QNX prostranstvo imen putej razdeleno na oblasti polnomochij. Lyuboj process, vypolnyayushchij fajl-orientirovannoe obsluzhivanie vvoda/vyvoda, dolzhen zaregistrirovat' u Menedzhera processov svoj prefiks, opredelyaya chast' prostranstva imen, kotoroe on hochet kontrolirovat' (t.e. oblast' svoih polnomochij). |ti prefiksy sostavlyayut derevo prefiksov, kotoroe hranitsya v pamyati na kazhdom komp'yutere pod upravleniem QNX.
Prefiksy menedzhera vvoda/vyvoda
Kogda process otkryvaet fajl, to polnoe imya fajla sopostavlyaetsya s derevom prefiksov s tem, chtoby otpravit' zapros open() k sootvetstvuyushchemu menedzheru resursov vvoda/vyvoda. Naprimer, Menedzher ustrojstv (Dev) obychno registriruet prefiks /dev. Esli process vyzyvaet open() s argumentom /dev/xxx, to sovpadet prefiks /dev i open() budet napravlen k Dev (ego vladel'cu).
Derevo prefiksov mozhet soderzhat' chastichno perekryvayushchiesya oblasti polnomochij. V etom sluchae ishchetsya naibolee dlinnoe sovpadenie. Naprimer, predpolozhim, chto est' tri zaregistrirovannyh prefiksa:
/ | diskovaya fajlovaya sistema (Fsys) |
/dev | sistema simvol'nyh ustrojstv (Dev) |
/dev/hd0 | diskovyj tom bez razdelov (Fsys) |
Menedzher fajlovoj sistemy zaregistriroval dva prefiksa, odin dlya smontirovannoj fajlovoj sistemy QNX (t.e. /) i odin dlya blok-orientirovannogo fajla, kotoryj predstavlyaet ves' fizicheskij zhestkij disk (t.e. /dev/hd0). Menedzher ustrojstv zaregistriroval edinstvennyj prefiks. Sleduyushchaya tablica illyustriruet pravilo naibolee dlinnogo sovpadeniya pri razbore imen putej.
Imya puti: | Sovpadaet: | Otnositsya k: |
---|---|---|
/dev/con1 | /dev | Dev |
/dev/hd0 | /dev/hd0 | Fsys |
/usr/dtdodge/test | / | Fsys |
Derevo prefiksov hranitsya kak spisok prefiksov, razdelennyh dvoetochiyami, sleduyushchim obrazom:
prefix=pid,unit:prefix=pid,unit:prefix=pid,unit
gde pid - eto ID processa menedzhera resursov I/O, a unit - eto odin simvol, ispol'zuemyj menedzherom dlya numeracii prefiksov, kotorymi on vladeet. V privedennom vyshe primere, esli Fsys byl by processom 3 i Dev byl by processom 5, to derevo prefiksov vyglyadelo by kak:
/dev/hd0=3,a:/dev=5,a:/=3,e
Esli vy hotite: | Ispol'zujte: |
---|---|
Pokazat' derevo prefiksov | Utilitu prefix |
Poluchit' derevo prefiksov vnutri programmy na yazyke Si | Funkciyu qnx_prefix_query() |
QNX podderzhivayut koncepciyu setevogo kornya, kotoraya pozvolyaet sopostavlyat' imya puti s derevom prefiksov na konkretnom uzle. Dlya oboznacheniya uzla imya puti nachinaetsya s dvuh kosyh chert, za kotorymi sleduet nomer uzla. |to takzhe pozvolyaet vam legko poluchat' dostup k fajlu i ustrojstvu, kotorye lezhat za predelami prostranstva putej vashego uzla. Naprimer, v tipichnoj seti QNX vozmozhny sleduyushchie imena putej:
/dev/ser1 | lokal'nyj posledovatel'nyj port |
//10/dev/ser1 | posledovatel'nyj port v uzle 10 |
//0/dev/ser1 | lokal'nyj posledovatel'nyj port |
//20/usr/dtdodge/test | fajl na uzle 20 |
Zamet'te, chto //0 vsegda ukazyvaet na lokal'nyj uzel
Kogda programma vypolnyaetsya na udalennom uzle, vy obychno hotite, chtoby ona rassmatrivala imena putej v kontekste prostranstva imen svoego uzla. Naprimer, eta komanda:
//5 ls /
kotoraya zapuskaet utilitu ls na uzle 5, vozvratit to zhe samoe, chto i:
ls /
zapuskaemaya na svoem uzle. V oboih sluchayah "/" budet sootnosit'sya s derevom prefiksov na vashem uzle, a ne na uzle 5. V protivnom sluchae, mozhno predstavit' sebe besporyadok, kotoryj mog by vozniknut', esli by prefiks "/" rassmatrivalsya svoim kak dlya uzla 5, tak i dlya svoego uzla: vybiralis' by odnovremenno fajly iz raznyh fajlovyh sistem!
CHtoby pravil'no interpretirovat' imena putej, kazhdyj process imeet setevoj koren' po umolchaniyu, kotoryj opredelyaet, derevo prefiksov kakogo uzla budet ispol'zovat'sya dlya razbora lyubyh imen putej, nachinayushchihsya s odinochnoj kosoj cherty ("/"). Kogda razbiraetsya imya puti, nachinayushcheesya s odinochnoj kosoj cherty, to ono predvaryaetsya setevym kornem po umolchaniyu. Naprimer, esli process imeet setevoj koren' po umolchaniyu //9, togda:
/usr/home/luc
budet razbirat'sya, kak:
//9/usr/home/luc
chto mozhet byt' interpretirovano, kak "razobrat' put' /usr/home/luc, ispol'zuya derevo prefiksov 9-go uzla".
Setevoj koren' po umolchaniyu nasleduetsya processami pri ih sozdanii i sootvetstvuet lokal'nomu uzlu, na kotorom zapuskaetsya sistema. Naprimer, dopustim, chto vy rabotaete na uzle 9, nahodyas' v komandnom interpretatore, dlya kotorogo setevoj koren' po umolchaniyu ustanovlen kak uzel 9 (ves'ma tipichnyj sluchaj). Esli vy vypolnite komandu:
ls /
komanda unasleduet setevoj koren' po umolchaniyu //9, i v rezul'tate vy poluchite:
ls //9/
Podobno tomu, esli by vy vveli komandu:
//5 ls /
Vy zapustili komandu ls na uzle 5, no ona po-prezhnemu unasleduet setevoj koren' po umolchaniyu //9, poetomu v rezul'tate vy opyat' poluchite ls //9/. V oboih sluchayah imya puti razbiraetsya otnositel'no odnogo i togo zhe prostranstva imen.
Esli vy hotite: | Ispol'zujte: |
---|---|
Poluchit' tekushchij setevoj koren' po umolchaniyu | Funkciyu qnx_prefix_getroot() |
Ustanovit' setevoj koren' po umolchaniyu | Funkciyu qnx_prefix_setroot() |
Zapustit' programmu s novym setevym kornem po umolchaniyu | Utilitu on |
Esli zapushcheno odnovremenno neskol'ko processov, oni ne obyazatel'no imeyut odin i tot zhe setevoj koren' po umolchaniyu, dazhe esli oni vypolnyayutsya na odnom i tom zhe uzle. K primeru, odin iz processov mog unasledovat' setevoj koren' po umolchaniyu ot roditel'skogo processa na kakom-libo drugom uzle seti, libo ego setevoj koren' po umolchaniyu mog byt' v yavnom vide zadan roditel'skim processom.
Pri peredache imeni puti mezhdu processami, ch'i setevye korni mogut otlichat'sya (naprimer, peredavaya fajl spuleru dlya pechati), vy dolzhny dobavit' setevoj koren' v nachalo imeni puti, prezhde chem peredat' put' drugomu processu. Esli vy uvereny, chto posylayushchij process i poluchatel' imeyut odin i tot zhe setevoj koren' po umolchaniyu (ili imya puti uzhe nachinaetsya s //uzel/), to vy mozhete opustit' etot shag.
My rassmotreli prefiksy, kotorye registriruyutsya menedzherami resursov I/O. Vtoraya forma prefiksa izvestna kak psevdonim prefiksa, eto prostaya podstanovka stroki vmesto iskomogo prefiksa. Psevdonim prefiksa imeet formu:
prefix=stroka-zamenitel'
Naprimer, vy rabotaete na mashine, u kotoroj net lokal'noj fajlovoj sistemy (poetomu net i processa, kotoryj by otvechal za "/"). Odnako, fajlovaya sistema imeetsya na drugom uzle (dopustim, 10), i vy hotite ee ispol'zovat' kak "/". Vy mozhete sdelat' eto s pomoshch'yu sleduyushchego psevdonima prefiksa:
/=//10/
|to privedet k tomu, chto vedushchaya kosaya cherta (/) budet zamenyat'sya na prefiks //10/. Naprimer, put' /usr/dtdodge/test budet zamenen sleduyushchim:
//10/usr/dtdodge/test
|to novoe imya puti budet snova sravnivat'sya s derevom prefiksov; na etot raz budet ispol'zovat'sya uzhe derevo prefiksov 10 uzla, t.k. imya puti nachinaetsya s //10. |to privedet k Menedzheru fajlovoj sistemy na uzle 10, kotoromu i budet napravlen zapros, naprimer, open(). S pomoshch'yu vsego lish' neskol'kih simvolov etot psevdonim pozvolil nam obrashchat'sya k udalennoj fajlovoj sisteme kak k lokal'noj.
Dlya togo chtoby vypolnit' perenapravlenie, ne obyazatel'no zapuskat' lokal'nuyu fajlovuyu sistemu. Derevo prefiksov dlya bezdiskovoj rabochej stancii mozhet vyglyadet' primerno tak:
/dev=5,a:/=//10/
Pri takom dereve prefiksov nomera putej, nachinayushchihsya s /dev, budut napravlyat'sya k lokal'nomu menedzheru simvol'nyh ustrojstv, v to vremya kak zaprosy s lyubymi drugimi imenami putej, budut napravlyat'sya k udalennoj fajlovoj sisteme.
Vy takzhe mozhete ispol'zovat' psevdonimy sozdaniya special'nyh imen ustrojstv. Naprimer, esli spuler pechati zapushchen na uzle 20, to vy mozhete sozdat' dlya nego lokal'nyj psevdonim sleduyushchim obrazom:
/dev/printer=//20/dev/spool
Lyuboj zapros na otkrytie lokal'nogo printera /dev/printer budet napravlyat'sya po seti k real'nomu spuleru. Analogichnym obrazom, esli ne sushchestvuet lokal'nogo diskovoda dlya gibkih diskov, psevdonim dlya udalennogo diskovoda na uzle 20 mozhet imet' vid:
/dev/fd0=//20/dev/fd0
V oboih rassmotrennyh vyshe sluchayah mozhno ne ispol'zovat' perenapravlenie s pomoshch'yu psevdonima, a obrashchat'sya neposredstvenno k udalennomu resursu sleduyushchim obrazom:
//20/dev/spool ILI //20/dev/fd0
Put' ne obyazatel'no dolzhen nachinat'sya s odnoj ili dvuh kosyh chert. V takih sluchayah put' schitaetsya otnositel'nym po otnosheniyu k tekushchemu rabochemu katalogu. QNX hranit tekushchij rabochij katalog v vide stroki simvolov. Otnositel'nye puti preobrazuyutsya v polnye setevye imena puti dobavleniem tekushchego rabochego kataloga v nachalo otnositel'nogo puti.
Uchtite, chto rezul'tat zavisit ot togo, nachinaetsya li tekushchij rabochij katalog s odinarnoj kosoj cherty, libo s setevogo kornya.
Esli tekushchij rabochij katalog nachinaetsya s dvojnoj kosoj cherty (setevogo kornya), on nazyvaetsya opredelennym i privyazan k prostranstvu imen ukazannogo uzla. V protivnom sluchae, esli on nachinaetsya s odinarnoj kosoj cherty, to v nachalo dobavlyaetsya setevoj koren' po umolchaniyu.
Naprimer, eta komanda:
cd //18/
yavlyaetsya primerom pervoj (opredelennoj) formy i privyazyvaet posleduyushchie razbory otnositel'nyh putej k uzlu 18, nezavisimo ot togo, kakoe znachenie setevogo kornya po umolchaniyu. Vypolniv zatem komandu cd dev, vy popadete v //18/dev.
S drugoj storony, takaya komanda:
cd /
yavlyaetsya primerom vtoroj formy, kogda setevoj koren' po umolchaniyu vliyaet na razbor otnositel'nogo puti. Naprimer, esli setevoj koren' po umolchaniyu //9, togda, vypolniv komandu cd dev, vy popadete v //9/dev. Tak kak tekushchij rabochij katalog ne nachinaetsya s ukazaniya uzla, to setevoj koren' po umolchaniyu dobavlyaetsya dlya polucheniya polnogo setevogo puti.
|to na samom dele ne tak slozhno, kak mozhet pokazat'sya. Obychno setevye korni (//uzel/) ne ukazyvayutsya, i vse, chto vy delaete, prosto rabotaet vnutri prostranstva imen vashego uzla (opredelyaemogo vashim setevym kornem po umolchaniyu). Bol'shinstvo pol'zovatelej, vojdya v sistemu, prinimayut normal'nyj setevoj koren' po umolchaniyu (t.e. prostranstvo imen ih sobstvennogo uzla) i rabotayut vnutri etoj sredy.
V nekotoryh tradicionnyh UNIX sistemah komanda cd (smenit' direktoriyu) modificiruet zadannyj put', esli on soderzhit simvol'nye ssylki. Kak rezul'tat, put' k novomu tekushchemu rabochemu katalogu - kotoryj mozhno posmotret' komandoj pwd, mozhet otlichat'sya ot togo, kotoryj byl zadan v komande cd.
V QNX, odnako, cd ne izmenyaet put' - za isklyucheniem sokrashchennyh ssylok "..". Naprimer:
cd /usr/home/luc/test/../doc
ustanovit tekushchij rabochij katalog /usr/home/luc/doc, dazhe esli nekotorye elementy etogo puti yavlyayutsya simvolicheskimi svyazyami.
Bolee podrobnuyu informaciyu o simvolicheskih svyazyah mozhno poluchit' v glave "Menedzher fajlovoj sistemy".
CHtoby poluchit' polnoe setevoe imya puti, ispol'zujte utilitu fullpath. |
Pri otkrytii resursa I/O, open() vozvrashchaet celoe chislo, nazyvaemoe deskriptor fajla (FD), kotoroe ispol'zuetsya zatem, chtoby napravlyat' vse posleduyushchie zaprosy I/O k dannomu menedzheru. (Vnutri bibliotechnyh procedur dlya napravleniya oprosa ispol'zuetsya vyzov yadra Sendfd().)
Prostranstvo deskriptorov fajlov, v otlichie ot prostranstva imen puti, polnost'yu lokal'no dlya kazhdogo processa. Menedzher ispol'zuet sochetanie PID i FD, chtoby opredelit' upravlyayushchuyu strukturu, sozdannuyu predydushchim vyzovom open(). |ta struktura nazyvaetsya blok upravleniya fajlom (OCB ot anglijskogo open control block) i hranitsya vnutri menedzhera I/O.
Sleduyushchaya diagramma pokazyvaet, kak menedzher I/O nahodit sootvetstvuyushchij OCB dlya pary PID i FD.
PID i FD opredelyayut OCB dlya Menedzhera vvoda/vyvoda.
OCB soderzhit dejstvuyushchuyu informaciyu ob otkrytom resurse. Naprimer, fajlovaya sistema hranit zdes' tekushchij ukazatel' na poziciyu v fajle. Kazhdyj vyzov open() sozdaet novyj OCB. Takim obrazom, esli process dvazhdy otkryvaet odin i tot zhe fajl, lyubye vyzovy lseek(), ispol'zuyushchie odin FD, ne povliyayut na tekushchuyu poziciyu dlya drugogo FD.
To zhe samoe spravedlivo i dlya razlichnyh processov, otkryvayushchih odin i tot zhe fajl.
Sleduyushchaya diagramma pokazyvaet dva processa, odin iz kotoryh otkryvaet fajl dvazhdy, a drugoj otkryvaet etot zhe fajl odin raz. Pri etom net razdelyaemyh FD.
Process A otkryvaet fajl /tmp/file dvazhdy. Process B otkryvaet tot zhe fajl odin raz.
Neskol'ko deskriptorov fajla v odnom ili neskol'kih processah mogut ukazyvat' na odin i tot zhe OCB. |to mozhet byt' dostignuto dvumya sposobami:
Kogda neskol'ko FD ukazyvayut na odin i tot zhe OCB, togda lyuboe izmenenie v sostoyanii OCB nemedlenno vidimo dlya vseh processov, u kotoryh est' deskriptory fajlov, ukazyvayushchie na etot OCB.
Naprimer, esli odin iz processov ispol'zuet funkciyu lseek() dlya izmeneniya tekushchej pozicii, togda chtenie ili zapis' nachinaetsya s novoj pozicii, nezavisimo ot togo, kakoj iz deskriptorov fajla ispol'zuetsya.
Sleduyushchaya diagramma pokazyvaet dva processa, iz kotoryh odin otkryvaet fajl dvazhdy, a zatem vyzyvaet dup(), chtoby poluchit' tretij deskriptor. Zatem on sozdaet dochernij process, kotoryj nasleduet vse otkrytye fajly.
Process otkryvaet fajl dvazhdy, a zatem poluchaet tretij FD posredstvom dup(). Ego dochernij process unasleduet vse eti tri deskriptora fajla.
Vy mozhete predotvratit' nasledovanie deskriptora fajla pri ispol'zovanii spawn() ili exec(), predvaritel'no vyzvav funkciyu fcntl() i ustanoviv flag FD_CLOEXEC.
|ta glava ohvatyvaet sleduyushchie temy:
Menedzher fajlovoj sistemy (Fsys) obespechivaet standartizovannye sposoby sohraneniya dannyh na diskah i dostupa k nim. Fsys otvechaet za obrabotku vseh zaprosov na otkrytie, zakrytie, chtenie i zapis' fajlov.
V QNX fajl - eto ob®ekt, v kotoryj mozhet proizvodit'sya zapis', iz kotorogo mozhet proizvodit'sya chtenie, libo i to i drugoe. QNX podderzhivaet shest' tipov fajlov; pyat' iz nih podderzhivaet Fsys:
Vse eti tipy fajlov podrobno opisyvayutsya v etoj glave. SHestoj tip fajlov - blok-orientirovannye fajly - obsluzhivaetsya Menedzherom ustrojstv.
Fsys podderzhivaet chetyre razlichnyh metki vremeni dlya kazhdogo fajla. |to:
Dostup k regulyarnym fajlam i katalogam upravlyaetsya bitami rezhima, hranyashchimisya v inode (indeksnom deskriptore) fajla. Bolee podrobno inode opisan v sekcii "Svyazi i indeksnye deskriptory (inodes)". |ti bity razreshayut chtenie, zapis' i vypolnenie v zavisimosti ot effektivnyh ID pol'zovatelya i gruppy. Pri etom pol'zovateli delyatsya na tri kategorii:
Process mozhet vypolnyat'sya s ID pol'zovatelya ili ID gruppy fajla, a ne roditel'skogo processa. Mehanizm, kotoryj pozvolyaet eto, nazyvaetsya setuid (ustanovit' ID pol'zovatelya) i setgid (ustanovit' ID gruppy).
QNX rassmatrivaet regulyarnyj fajl kak posledovatel'nost' bajt s vozmozhnost'yu proizvol'nogo dostupa i ne imeyushchuyu drugoj predopredelennoj vnutrennej struktury. Prikladnye programmy sami nesut otvetstvennost' za ponimanie struktury i soderzhaniya konkretnogo regulyarnogo fajla.
Regulyarnye fajly sostavlyayut bol'shinstvo fajlov v fajlovyh sistemah. Fajlovye sistemy podderzhivayutsya Menedzherom fajlovoj sistemy i realizovany na baze blok-orientirovannyh fajlov, sootvetstvuyushchih razdelam diska (razdely opisany v sekcii "Rabota s diskami").
Katalog - eto fajl, kotoryj soderzhit elementy kataloga. Kazhdyj element kataloga uvyazyvaet imya fajla s fajlom. Imya fajla - eto simvol'noe imya, kotoroe pozvolyaet identificirovat' fajl i rabotat' s nim. Fajl mozhet byt' identificirovan neskol'kimi imenami (smotri sekcii "Svyazi i indeksnye deskriptory (inodes)" i "Simvolicheskie svyazi").
Sleduyushchaya diagramma pokazyvaet, kak proizvoditsya poisk fajla s imenem /usr/bill/file2.
Put' v strukture kataloga QNX k fajlu /usr/bill/file2.
Hotya katalog vedet sebya vo mnogom kak standartnyj fajl, Menedzher fajlovoj sistemy nakladyvaet nekotorye ogranicheniya na operacii, kotorye vy mozhete proizvodit' s katalogom. V chastnosti, vy ne mozhete otkryt' katalog dlya zapisi libo sozdat' svyaz' dlya kataloga s pomoshch'yu funkcii Si link().
Dlya chteniya elementov kataloga vy mozhete ispol'zovat' nabor funkcij Si, opredelennyh POSIX, kotorye obespechivayut ne zavisimyj ot OS dostup k elementam kataloga. |ti funkcii vklyuchayut:
Tak kak katalogi QNX - eto prosto fajly, soderzhashchie "izvestnuyu" informaciyu, vy mozhete takzhe chitat' elementy kataloga neposredstvenno funkciyami Si open() i read(). Odnako eta tehnika ne perenosima - format elementov kataloga otlichaetsya v razlichnyh operacionnyh sistemah.
V QNX regulyarnye fajly i fajly kataloga hranyatsya kak posledovatel'nost' ekstentov. |kstent - eto nepreryvnaya posledovatel'nost' blokov na diske.
Fajly, kotorye sostoyat tol'ko iz odnogo ekstenta, hranyat informaciyu ob ekstente v elemente kataloga. No, esli fajl sostoit bolee chem iz odnogo ekstenta, informaciya o raspolozhenii ekstentov hranitsya v odnom ili bolee svyaznyh blokah ekstentov (svyaznye - imeyushchie pryamye/obratnye ukazateli). Kazhdyj blok ekstentov mozhet soderzhat' informaciyu ne bolee chem o 60 ekstentah.
Fajl, sostoyashchij iz mnozhestva nepreryvnyh oblastej na diske, nazyvaemyh v QNX ekstentami.
Kogda Menedzheru fajlovoj sistemy neobhodimo uvelichit' fajl, on snachala pytaetsya uvelichit' poslednij ekstent, hotya by dazhe na odin blok. No esli poslednij ekstent ne mozhet byt' dopolnen, to dlya rasshireniya fajla vydelyaetsya novyj ekstent.
Dlya vydeleniya novyh ekstentov Menedzher fajlovoj sistemy ispol'zuet metod "pervogo popadaniya". Special'naya tablica v Menedzhere fajlovoj sistemy soderzhit svedeniya obo vseh blokah, opisannyh v fajle /.bitmap (etot fajl opisan v sekcii "Klyuchevye komponenty razdela QNX"). Dlya kazhdogo bloka ukazyvaetsya razmer sootvetstvuyushchego emu svobodnogo ekstenta. Menedzher fajlovoj sistemy vybiraet iz tablicy pervyj dostatochno bol'shoj ekstent.
V QNX fajl mozhet oboznachat'sya bolee chem odnim imenem. Kazhdoe imya fajla nazyvaetsya svyaz'yu. V dejstvitel'nosti sushchestvuet dva vida svyazej: zhestkie svyazi, ili prosto "svyazi", i simvolicheskie svyazi. Simvolicheskie svyazi opisany v sleduyushchej sekcii.
Dlya podderzhki svyazej kazhdogo fajla, imya fajla otdelyaetsya ot ostal'noj informacii, opisyvayushchej fajl. |ta informaciya hranitsya v strukture, nazyvaemoj inode (indeksnym deskriptorom).
Esli fajl imeet tol'ko odnu svyaz' (t.e. odno imya), to blok inode hranitsya v elemente kataloga dlya etogo fajla. No esli fajl imeet bolee chem odnu svyaz', to inode hranitsya kak zapis' v special'nom fajle /.inodes, a element kataloga dlya fajla soderzhit ukazatel' na zapis' inode.
Uchtite, chto vy mozhete sozdat' svyaz' dlya fajla, tol'ko esli fajl i svyaz' nahodyatsya v odnoj i toj zhe fajlovoj sisteme.
Odin i tot zhe fajl oboznachen dvumya svyazyami s imenami "more" i "less".
Sushchestvuet eshche dve situacii, v kotoryh dlya fajla sozdaetsya zapis' v fajle /.inodes:
Esli vy hotite: | Ispol'zujte: |
---|---|
Sozdat' svyaz' iz komandnogo interpretatora | Utilitu ln |
Sozdat' svyaz' iz programmy | Funkciyu link() |
Pri sozdanii fajla, dlya nego ustanavlivaetsya schetchik svyazej, ravnyj edinice. Po mere dobavleniya ssylok etot schetchik uvelichivaetsya; pri udalenii svyazi schetchik svyazej umen'shaetsya. Fajl ne udalyaetsya s diska do togo, kak schetchik svyazej stanet ravnym nulyu i vse programmy, ispol'zuyushchie etot fajl, zakroyut ego. |to pozvolyaet ispol'zovat' otkrytyj fajl dazhe posle togo, kak u nego udaleny vse svyazi.
Esli vy hotite: | Ispol'zujte: |
---|---|
Udalit' svyaz' iz komandnogo interpretatora | Utilitu rm |
Udalit' svyaz' iz programmy | Funkcii remove() ili unlink() |
Vy ne mozhete sozdavat' zhestkie svyazi dlya kataloga. Odnako kazhdyj katalog imeet dve zhestko opredelennye svyazi:
Imya fajla "tochka" sootvetstvuet tekushchemu katalogu; "tochka tochka" sootvetstvuet katalogu, predshestvuyushchemu tekushchemu katalogu.
Zamet'te, chto "tochka tochka" dlya kataloga "/" - eto prosto "/", - vy ne mozhete podnyat'sya vyshe.
Simvolicheskaya svyaz' - eto osobyj fajl, kotoryj soderzhit v kachestve dannyh imya puti. Kogda simvolicheskaya svyaz' ispol'zuetsya v zaprose vvoda/vyvoda - naprimer, open(), - oboznachenie svyazi v imeni puti zamenyaetsya ee "dannymi". Simvolicheskaya svyaz' yavlyaetsya gibkim sredstvom dlya perenapravleniya puti i chasto ispol'zuetsya dlya sozdaniya mnozhestva putej k odnomu i tomu zhe fajlu. V otlichie ot zhestkih svyazej, simvolicheskie svyazi mogut vyhodit' za predely fajlovoj sistemy i takzhe yavlyat'sya svyazyami dlya katalogov.
V sleduyushchem primere katalogi //1/usr/fred i //2/usr/barney yavlyayutsya svyazyami na odin i tot zhe katalog, hotya oni nahodyatsya v razlichnyh fajlovyh sistemah, i dazhe na razlichnyh uzlah (smotri sleduyushchuyu diagrammu). |to ne mozhet byt' sdelano s ispol'zovaniem zhestkih svyazej:
//1/usr/fred --> //2/usr/barney
Zamet'te, chto simvolicheskaya svyaz' i adresuemyj katalog ne obyazany imet' odno i to zhe imya. V bol'shinstve sluchaev simvolicheskie svyazi ispol'zuyutsya dlya privyazki odnogo kataloga k drugomu. Odnako oni takzhe mogut byt' ispol'zovany dlya fajlov, kak v etom primere:
//1/usr/eric/src/test.c --> //1/usr/src/game.c
Esli vy hotite: | Ispol'zujte utilitu: |
---|---|
Sozdat' simvolicheskuyu svyaz' | ln (s opciej -s) |
Udalit' simvolicheskuyu svyaz'* | rm |
Uznat', yavlyaetsya li fajl simvolicheskoj svyaz'yu | ls |
* Pomnite, chto udalenie simvolicheskoj svyazi dejstvuet tol'ko na svyaz', a ne na adresuemyj ob®ekt
Nekotorye funkcii operiruyut neposredstvenno s simvolicheskimi svyazyami. Dlya etih funkcij zamena oboznacheniya svyazi v puti na ee soderzhimoe ne proizvoditsya. K etim funkciyam otnosyatsya unlink() (kotoraya udalyaet simvolicheskuyu svyaz'), lstat() i readlink().
Tak kak simvolicheskie svyazi mogut ukazyvat' na katalogi, to nevernaya konfiguraciya mozhet privesti k problemam, takim, kak ciklicheskie svyazi. CHtoby zashchitit'sya ot ciklicheskih svyazej, sistema nakladyvaet ogranicheniya na kolichestvo perehodov; etot predel opredelen kak SYMLOOP_MAX vo vklyuchaemom fajle <limits.h>.
Programmnyj kanal - eto neimenovannyj fajl, kotoryj sluzhit kak kanal vvoda/vyvoda mezhdu dvumya ili bolee vzaimodejstvuyushchimi processami - odin process pishet v programmnyj kanal, drugoj chitaet iz programmnogo kanala. Menedzher fajlovoj sistemy obespechivaet buferizaciyu dannyh. Razmer bufera opredelen kak PIPE_BUF v fajle <limits.h>. Programmnyj kanal udalyaetsya posle togo kak zakryty oba ego konca.
Programmnye kanaly obychno ispol'zuyutsya, kogda dva processa hotyat vypolnyat'sya parallel'no, s odnonapravlennoj peredachej dannyh ot odnogo processa k drugomu. Esli trebuetsya dvunapravlennaya peredacha dannyh, to dolzhny ispol'zovat'sya soobshcheniya.
Tipichnoe primenenie programmnogo kanala sostoit v soedinenii vyvoda odnoj programmy s vvodom drugoj programmy. |to soedinenie chasto proizvoditsya komandnym interpretatorom (Shell). Naprimer:
ls | more
napravlyaet standartnyj vyvod ot utility ls cherez programmnyj kanal v standartnyj vvod utility more.
Esli vy hotite: | Ispol'zujte: |
---|---|
Sozdat' programmnyj kanal iz komandnogo interpretatora | Simvol programmnogo kanala ("|") |
Sozdat' programmnyj kanal iz programmy | Funkcii pipe() ili popen() |
Na bezdiskovyh rabochih stanciyah vy mozhete zapustit' Menedzher programmnyh kanalov (Pipe) vmesto Menedzhera fajlovoj sistemy, kogda trebuyutsya tol'ko programmnye kanaly. Menedzher programmnyh kanalov optimizirovan dlya kanal'nogo (konvejernogo) vvoda/vyvoda i mozhet obespechit' bol'shuyu propusknuyu sposobnost', chem Menedzher fajlovoj sistemy. |
FIFO - eto po sushchestvu to zhe samoe, chto i programmnye kanaly, za isklyucheniem togo, chto FIFO yavlyayutsya imenovannymi postoyannymi fajlami, kotorye hranyatsya v katalogah fajlovoj sistemy.
Esli vy hotite: | Ispol'zujte: |
---|---|
Sozdat' FIFO iz komandnogo interpretatora | Utilitu mkfifo |
Sozdat' FIFO iz programmy | Funkciyu mkfifo() |
Udalit' FIFO iz komandnogo interpretatora | Utilitu rm |
Udalit' FIFO iz programmy | Funkcii remove() ili unlink() |
Svojstva Menedzhera fajlovoj sistemy, obespechivayushchie vysokoproizvoditel'nyj dostup k disku:
Liftovyj poisk minimiziruet obshchie zatraty vremeni na pozicionirovanie magnitnoj golovki pri chtenii ili zapisi na disk. Zaprosy vvoda/vyvoda uporyadochivayutsya takim obrazom, chtoby vse oni mogli byt' vypolneny za odin prohod magnitnoj golovki, ot samogo mladshego k samomu starshemu adresu na diske.
Liftovyj poisk takzhe imeet usovershenstvovanie, obespechivayushchee vypolnenie mul'tisektornogo vvoda/vyvoda tam, gde vozmozhno.
Kesh-bufer - eto intellektual'nyj bufer mezhdu Menedzherom fajlovoj sistemy i drajverom diska. Kesh-bufer hranit bloki fajlov s cel'yu minimizirovat' kolichestvo obrashchenij Menedzhera fajlov