Csizmadia Balázs - Nyílt rendszerek alapszoftverei
-
Upload
katona-tamas -
Category
Documents
-
view
26 -
download
3
Transcript of Csizmadia Balázs - Nyílt rendszerek alapszoftverei
Ny��lt rendszerek alapszoftvereiKlasszikus v�altozat
Csizmazia Bal�azs 1
1Copyright 1993,1995,1996 Csizmazia Bal�azs. Szabadon terjeszthet}o.
2
Tartalomjegyz�ek
1 Bevezet�es 7
1.1 Folyamatok : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 8
1.2 F�ajlok : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 9
1.3 Mem�oriakezel�es : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 11
1.4 A shell : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 12
1.5 V�edelem : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 12
1.6 INPUT/OUTPUT : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 12
1.7 Oper�aci�os rendszerek bels}o szerkezete : : : : : : : : : : : : : : : : : : : : 13
1.8 Osztott rendszerek architektur�aja : : : : : : : : : : : : : : : : : : : : : : : 14
1.8.1 A t�avoli elj�ar�ash��v�as : : : : : : : : : : : : : : : : : : : : : : : : : : 15
1.8.2 �Uzenetsz�or�as : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 15
1.9 Holtpont : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 17
1.10 Az Intel 80386 mikroprocesszor architekt�ur�aja : : : : : : : : : : : : : : : : 17
1.11 Szabv�anyok : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 18
1.12 Objektum-orient�alt fel�uletek : : : : : : : : : : : : : : : : : : : : : : : : : : 20
1.12.1 Egyszer}u k�openy : : : : : : : : : : : : : : : : : : : : : : : : : : : : 20
1.12.2 Specializ�alt k�openy : : : : : : : : : : : : : : : : : : : : : : : : : : : 20
1.12.3 Objektum-orient�alt k�openyek tervez�ese : : : : : : : : : : : : : : : : 20
1.13 Mi lesz m�eg : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 21
1.14 K�erd�esek, feladatok : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 21
2 A UNIX oper�aci�os rendszer 23
2.1 N�eh�any alapvet}o UNIX-beli fogalom : : : : : : : : : : : : : : : : : : : : : 23
2.2 Folyamatok a UNIX rendszerben : : : : : : : : : : : : : : : : : : : : : : : 24
2.3 A folyamatok k�oz�otti kommunik�aci�o (IPC) a UNIX rendszerben : : : : : : 25
2.4 A UNIX f�ajlrendszere : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 26
2.5 A UNIX shelljei : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 30
2.6 V�edelem a UNIX oper�aci�os rendszerben : : : : : : : : : : : : : : : : : : : 30
2.7 A UNIX INPUT/OUTPUT rendszere : : : : : : : : : : : : : : : : : : : : 31
2.7.1 A UNIX architektur�aj�anak moderniz�al�asa : : : : : : : : : : : : : : 31
2.8 K�erd�esek, feladatok : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 35
3 Rendszerh��v�asok 37
3.1 Folyamatokat kezel}o rendszerh��v�asok : : : : : : : : : : : : : : : : : : : : : 38
3.2 A f�ajlrendszer rendszerh��v�asai : : : : : : : : : : : : : : : : : : : : : : : : : 41
3.2.1 Alapvet}o, f�ajlokkal kapcsolatos rendszerh��v�asok : : : : : : : : : : : 41
3.2.2 A f�ajlrendszer �es a mem�oriakezel}o kapcsolata : : : : : : : : : : : : 43
3
4 TARTALOMJEGYZ�EK
3.3 Egy�eb, f�ajlokkal kapcsolatos rendszerh��v�asok : : : : : : : : : : : : : : : : : 44
3.4 F�ajlok konkurrens el�er�ese : : : : : : : : : : : : : : : : : : : : : : : : : : : 47
3.5 Kiv�eteles esem�enyek kezel�es�enek rendszerh��v�asai : : : : : : : : : : : : : : 50
3.5.1 A signalok feladata : : : : : : : : : : : : : : : : : : : : : : : : : : : 50
3.5.2 Hagyom�anyos signalkezel�esi technik�ak : : : : : : : : : : : : : : : : 50
3.5.3 POSIX signal-szemantika : : : : : : : : : : : : : : : : : : : : : : : 51
3.6 M�eg egy kicsit a folyamatokr�ol : : : : : : : : : : : : : : : : : : : : : : : : 53
3.7 INPUT/OUTPUT eszk�oz�oket vez�erl}o rendszerh��v�as : : : : : : : : : : : : : 54
3.8 Egy�eb rendszerh��v�asok : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 56
3.9 Egy �osszetettebb p�elda: a shell : : : : : : : : : : : : : : : : : : : : : : : : 57
3.10 Daemon folyamatok : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 59
3.11 POSIX-threadek : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 60
3.11.1 POSIX threadek l�etrehoz�asa �es megsz}untet�ese : : : : : : : : : : : : 60
3.11.2 POSIX threadek identit�asa : : : : : : : : : : : : : : : : : : : : : : 61
3.11.3 POSIX threadek szinkroniz�aci�oja : : : : : : : : : : : : : : : : : : : 62
3.11.4 Mutexek illetve }orfelt�etel-v�altoz�ok attributumai : : : : : : : : : : : 64
3.11.5 K�onyvt�arak thread-biztoss�aga : : : : : : : : : : : : : : : : : : : : : 65
3.11.6 Folyamatok kommunik�aci�oja a UNIX-ban : : : : : : : : : : : : : : 66
3.12 K�erd�esek : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 69
4 H�al�ozatok 71
4.1 A h�al�ozati kapcsolat modellje : : : : : : : : : : : : : : : : : : : : : : : : : 72
4.2 A TCP/IP protokollcsal�ad : : : : : : : : : : : : : : : : : : : : : : : : : : : 72
4.2.1 A �zikai �es az adatkapcsolati szint : : : : : : : : : : : : : : : : : : 73
4.2.2 A h�al�ozati szint (IP) : : : : : : : : : : : : : : : : : : : : : : : : : : 73
4.2.3 A transzport szint : : : : : : : : : : : : : : : : : : : : : : : : : : : 75
4.3 TCP/IP kon�gur�aci�o : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 78
4.3.1 H�al�ozati csatlakoz�ok : : : : : : : : : : : : : : : : : : : : : : : : : : 78
4.3.2 IP c��m be�all��t�asa : : : : : : : : : : : : : : : : : : : : : : : : : : : : 79
4.3.3 ARP �es RARP protokollok : : : : : : : : : : : : : : : : : : : : : : 80
4.3.4 Routing t�abl�ak : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 81
4.4 K�erd�esek, feladatok : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 81
5 A Berkeley socketok 83
5.1 Egy �osszek�ottet�es-alap�u kliens-szerver kapcsolat menete : : : : : : : : : : 84
5.2 Egy nem �osszek�ottet�es-alap�u kliens-szerver kapcsolat menete : : : : : : : 84
5.3 Socketok c��mz�ese az Internet domainben : : : : : : : : : : : : : : : : : : : 85
5.4 Konverzi�o a h�al�ozati- �es host byte-�abr�azol�asm�od k�oz�ott : : : : : : : : : : 85
5.5 Kommunik�aci�os v�egpont (socket) l�etrehoz�asa : : : : : : : : : : : : : : : : 86
5.6 Socket c��m�enek kijel�ol�ese : : : : : : : : : : : : : : : : : : : : : : : : : : : : 87
5.7 Kapcsolat l�etrehoz�asa : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 87
5.8 Adat�atvitel �osszek�ottet�es-alap�u kapcsolatok eset�en : : : : : : : : : : : : : 88
5.9 Adat�atvitel nem �oszek�ottet�es-alap�u kapcsolatok eset�en : : : : : : : : : : : 89
5.10 Kapcsolat (socket) lez�ar�asa : : : : : : : : : : : : : : : : : : : : : : : : : : 89
5.11 T�obb socket p�arhuzamos �gyel�ese (select) : : : : : : : : : : : : : : : : : : 89
5.12 A kommunik�aci�os partner c��m�enek megszerz�ese : : : : : : : : : : : : : : : 90
5.13 H�al�ozatokkal kapcsolatos k�onyvt�ari seg�edf�uggv�enyek : : : : : : : : : : : : 90
TARTALOMJEGYZ�EK 5
5.13.1 Hostn�evr}ol IP-c��mre transzform�aci�o : : : : : : : : : : : : : : : : : 91
5.13.2 H�al�ozati szolg�altat�asok adatb�azisa : : : : : : : : : : : : : : : : : : 91
5.14 A socketokkal kapcsolatos tov�abbi rendszerh��v�asok : : : : : : : : : : : : : 92
5.14.1 TCP s�urg}os adat tov�abb��t�asa : : : : : : : : : : : : : : : : : : : : : 92
5.14.2 A socketokhoz kapcsol�od�o SIGIO �es SIGURG signalok : : : : : : : 93
5.14.3 UDP broadcast lehet}os�eg : : : : : : : : : : : : : : : : : : : : : : : 94
5.14.4 Socket aszinkron �uzemm�odra �all��t�asa : : : : : : : : : : : : : : : : : 94
5.15 P�eld�ak a socket rendszer haszn�alat�ara : : : : : : : : : : : : : : : : : : : : 95
5.15.1 P�elda egy egyszer}u iterat��v �osszek�ottet�es-alap�u szerverre : : : : : : 95
5.15.2 P�elda egy �osszek�ottet�es-alap�u kliensre : : : : : : : : : : : : : : : : 96
5.15.3 P�elda egy select-et haszn�al�o �osszek�ottet�es-alap�u szerverre : : : : : 98
5.15.4 P�elda egy konkurrens �osszek�ottet�es-alap�u szerverre : : : : : : : : : 99
5.15.5 P�elda egy �osszek�ottet�es-mentes (datagram) szerverre : : : : : : : : 101
5.15.6 P�elda egy �osszek�ottet�es-mentes (datagram) kliensre : : : : : : : : : 102
5.16 A h�al�ozati r�eteg (IP protokoll) el�er�ese : : : : : : : : : : : : : : : : : : : : 103
6 Security 105
6.1 Tervez�esi elvek : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 105
6.2 A felhaszn�al�o azonos��t�asa : : : : : : : : : : : : : : : : : : : : : : : : : : : 106
6.3 A 4.3BSD UNIX r-programjai : : : : : : : : : : : : : : : : : : : : : : : : : 107
6.4 A Kerberos illet�ekess�eg-vizsg�al�o protokoll : : : : : : : : : : : : : : : : : : 107
6.5 Tan�acsok setuid root programok ��r�as�ahoz : : : : : : : : : : : : : : : : : : 109
7 A rendszermag szerkezete 111
7.1 A folyamatok kezel�ese : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 112
7.1.1 A folyamatkezel�es adatszerkezetei : : : : : : : : : : : : : : : : : : : 112
7.1.2 A folyamatkezel�es rendszerh��v�asai : : : : : : : : : : : : : : : : : : 115
7.1.3 �Utemez�esi k�erd�esek : : : : : : : : : : : : : : : : : : : : : : : : : : : 116
7.2 A mem�oriakezel}o implement�aci�oja : : : : : : : : : : : : : : : : : : : : : : 117
7.2.1 A r�egi�om}uveletek : : : : : : : : : : : : : : : : : : : : : : : : : : : : 118
7.2.2 A r�egi�o rendszer adatszerkezetei : : : : : : : : : : : : : : : : : : : 119
7.2.3 A lapoz�as implement�al�asa : : : : : : : : : : : : : : : : : : : : : : : 120
7.2.4 A programbet�olt�es : : : : : : : : : : : : : : : : : : : : : : : : : : : 120
7.3 Az eszk�ozmeghajt�ok implement�aci�oja : : : : : : : : : : : : : : : : : : : : : 121
7.4 A bu�er cache szerepe �es implement�aci�oja : : : : : : : : : : : : : : : : : : 123
7.5 A f�ajlrendszer implement�aci�oja : : : : : : : : : : : : : : : : : : : : : : : : 126
7.5.1 A diszken t�arolt adatszerkezetek : : : : : : : : : : : : : : : : : : : 127
7.5.2 Az adatszerkezeteken oper�al�o m}uveletek : : : : : : : : : : : : : : : 130
7.5.3 Allok�aci�os strat�egi�ak : : : : : : : : : : : : : : : : : : : : : : : : : : 131
7.5.4 F�ajln�evr}ol - i-nodera transzform�aci�o : : : : : : : : : : : : : : : : : 131
7.5.5 A rendszerh��v�as interf�esz : : : : : : : : : : : : : : : : : : : : : : : 132
7.6 A kommunik�aci�os alrendszer implement�aci�oja : : : : : : : : : : : : : : : : 133
7.7 K�erd�esek : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 134
6 TARTALOMJEGYZ�EK
8 A UNIX SYSTEM V STREAMS programoz�asa 135
8.1 Bevezet�es : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 135
8.1.1 Alapfogalmak : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 135
8.1.2 A STREAMS el}onyei : : : : : : : : : : : : : : : : : : : : : : : : : : 136
8.1.3 A STREAMS rendszer vez�erl�ese : : : : : : : : : : : : : : : : : : : 136
8.1.4 A STREAMS �uzenett��pusai : : : : : : : : : : : : : : : : : : : : : : 138
8.1.5 Egy STREAMS-et haszn�al�o program : : : : : : : : : : : : : : : : : 140
8.1.6 Az ide tartoz�o rendszerh��v�asok : : : : : : : : : : : : : : : : : : : : 142
8.2 A STREAMS driverek fel�ep��t�ese : : : : : : : : : : : : : : : : : : : : : : : 142
8.2.1 Mire kell vigy�azni egy driver k�esz��t�esekor : : : : : : : : : : : : : : 142
8.2.2 STREAMS szolg�altat�asok : : : : : : : : : : : : : : : : : : : : : : : 143
8.2.3 Kritikus szakaszok v�edelme : : : : : : : : : : : : : : : : : : : : : : 146
8.2.4 Fontosabb adatszerkezetek : : : : : : : : : : : : : : : : : : : : : : : 147
8.2.5 Tov�abbi hasznos tan�acsok : : : : : : : : : : : : : : : : : : : : : : : 148
8.2.6 A driver hiba�uzenetei : : : : : : : : : : : : : : : : : : : : : : : : : 149
8.2.7 A driver list�aja : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 150
8.2.8 A driver kernelbe linkel�ese : : : : : : : : : : : : : : : : : : : : : : : 151
8.2.9 Driver install�al�as ISC UNIX alatt : : : : : : : : : : : : : : : : : : : 154
8.2.10 M�eg egy p�elda: a birka modul : : : : : : : : : : : : : : : : : : : : : 156
8.2.11 Egy egyszer}u debug modul : : : : : : : : : : : : : : : : : : : : : : 157
8.2.12 Flush kezel�ese a driverben : : : : : : : : : : : : : : : : : : : : : : : 160
8.3 Egy STREAMS loopback driver : : : : : : : : : : : : : : : : : : : : : : : : 160
8.3.1 Driver interface struktur�ak : : : : : : : : : : : : : : : : : : : : : : 160
8.3.2 Tov�abbi deklar�aci�ok : : : : : : : : : : : : : : : : : : : : : : : : : : 162
8.3.3 Loopback driver start rutinja : : : : : : : : : : : : : : : : : : : : : 162
8.3.4 Loopback driver open rutin : : : : : : : : : : : : : : : : : : : : : : 163
8.3.5 Loopback driver close rutin : : : : : : : : : : : : : : : : : : : : : : 163
8.3.6 Loopback driver service rutin : : : : : : : : : : : : : : : : : : : : : 164
8.3.7 Egy loopback drivert haszn�al�o program : : : : : : : : : : : : : : : 166
8.4 Multiplexer driverek : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 168
8.4.1 A multiplexerek elemei : : : : : : : : : : : : : : : : : : : : : : : : : 168
8.4.2 Egy multiplexer �osszerak�asa : : : : : : : : : : : : : : : : : : : : : : 168
8.4.3 Multiplexer ioctl-ek : : : : : : : : : : : : : : : : : : : : : : : : : : 169
8.4.4 Input/Output esem�enyek �gyel�ese : : : : : : : : : : : : : : : : : : 170
8.5 A kernel seg�edrutinjai : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 174
8.5.1 STREAMS-speci�kus h��v�asok : : : : : : : : : : : : : : : : : : : : : 174
8.5.2 �Altal�anosan haszn�alhat�o kernel rutinok : : : : : : : : : : : : : : : 179
8.6 K�erd�esek : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 181
8.7 Aj�anlott irodalom : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 182
Fejezet 1
Bevezet�es
A sz�am��t�og�epen fut�o programokat k�et csoportba szok�as osztani: a rendszerprogramok
csoportj�ara, �es a felhaszn�al�oi programok csoportj�ara. A rendszerprogramok k�oz�ul a
legalapvet}obb az oper�aci�os rendszer. Ennek feladata egyr�eszt az, hogy eltakarja a bony-
olult hardver elemek programoz�as�at a programoz�o el}ol, m�asr�eszt pedig ez a szoftver felel}os
a hardver er}oforr�asoknak a programok k�ozti eloszt�as�a�ert, az egyes hardver er}oforr�asok
v�edelm�e�ert.
Az oper�aci�os rendszerek az ut�obbi �evtizedekben nagyon nagy fejl}od�esen mentek
kereszt�ul. Az els}o gener�aci�os sz�am��t�og�epekben m�eg nem haszn�altak oper�aci�os rend-
szereket. Megjelen�es�uk a m�asodik gener�aci�ohoz k�ot}odik: a bonyolultabb hardver
rendszerekre egyre bonyolultabb oper�aci�os rendszereket �ep��tettek, majd megjelent a
multiprogramoz�as, a mai oper�aci�os rendszerek egy lapvet}o fontoss�ag�u tulajdons�aga.
A multiprogramoz�asnak k�et v�altozata van: a t�obbtaszkos (multitasking) illetve a
t�obbfelhaszn�al�os (multi user) rendszer (ez a k�et forma nem z�arja ki egym�ast). A
t�obbfelhaszn�al�os rendszerekben egy k�ozponti egys�egen osztozik t�obb felhaszn�al�o, de a
k�ozponti egys�eg nagy sebess�ege miatt minden felhaszn�al�o �ugy �erzi, hogy egy saj�at g�epe
van, amin dolgozik. A t�obbtaszkos rendszer annyit tud, hogy ott egy felhaszn�al�o egysz-
erre t�obb feladatot ind��that el, �es az elind��tott feladatok egyszerre (p�arhuzamosan) fognak
v�egrehajt�odni.
Az oper�aci�os rendszerekkel kapcsolatban a jelenlegi kutat�asok a h�al�ozati oper�aci�os
rendszerek k�or�eben t�ort�ennek. Ezekben a rendszerekben a sz�am��t�og�epek valami-
lyen dr�ottal �ossze vannak kapcsolva, �es a felhaszn�al�o az oper�aci�os rendszer seg��ts�eg�evel
ezeken a dr�otokon kereszt�ul adatokat vihet �at az egyik g�epr}ol a m�asikra; az egyik
g�epr}ol (mondjuk Magyarorsz�agr�ol) bejelentkezhet egy m�asik sz�am��t�og�epre (p�eld�aul
Kanad�aba), �es Magyarorsz�agr�ol �ugy dolgozhat, mintha k�ozvetlen�ul a kanadai sz�am��t�og�ep
egy k�eperny}oj�en dolgozna. Az, hogy az �altala beg�epelt karakterek illetve a v�egeredm�enyek
milyen m�odon jutnak el t}ole Kanad�aba (�es onnan vissza Magyarorsz�agra) rejtve marad
el}ole. A kommunik�aci�o t�ort�enhet ak�ar telefonvonalakon, ak�ar m}uholdon kereszt�ul - a
l�enyeg az, hogy az inform�aci�o eljusson az egyik helyr}ol a m�asikra. Az oper�aci�os rend-
szer feladata ilyenkor az, hogy a megb��zhatatlan, rossz min}os�eg}u telefonvonalakon egy
megb��zhat�o kommunik�aci�os csatorn�at biztos��tson a felhaszn�al�oknak, amiben az egyik
g�epr}ol a m�asikra k�uld�ott adatok "nem kall�odnak el", �es az adatokat a fogad�o �allom�as az
elk�uld�es sorrendj�eben kapja meg.
Eddig m�ar sz�amtalan sok oper�aci�os rendszer k�esz�ult, mindegyik m�as c�ellal, m�as
probl�emak�or megold�as�ara. Ma a legelterjedtebb ilyen rendszerek (t�obbek k�ozt): az
7
8 FEJEZET 1. BEVEZET�ES
OS/360, a CP/CMS, a VAX VMS, a UNIX �es az MS-DOS. M�ar el�eg id}o volt ah-
hoz, hogy a legfontosabb absztrakci�os szintek �es szolg�altat�ast��pusok kialakuljanak.
Ezek a szolg�altat�asok a hagyom�anyos oper�aci�os rendszerekben k�et f}o t�emak�orbe sorol-
hat�ok: folyamatokkal (processzekkel) kapcsolatos, �es a fajlokkal kapcsolatos absztrakci�os
eszk�oz�ok. A tov�abbiakban ezekr}ol lesz sz�o kicsit r�eszletesebben.
1.1 Folyamatok
A folyamat (processz) de�n��ci�oja UNIX k�ornyezetben a k�ovetkez}ok�eppen adhat�o meg:
folyamatnak tekinthet�unk minden egyes fut�o programot - az �altala lefoglalt mem�ori�aval�es
egy�eb er}oforr�asokkal egy�utt. (Gyakran haszn�alj�ak hasonl�o �ertelemben a taszk elnevez�est
is.) Az oper�aci�os rendszer minden egyes fut�o programr�ol bizonyos inform�aci�okat t�arol
egy �un. processz-t�abl�aban. A folyamatokkal kapcsolatban k�et alapvet}o m}uvelet van:
�uj folyamat l�etrehoz�asa, �es egy fut�o folyamat meg�all��t�asa (abort�al�asa, lel�ov�ese). Ha egy
folyamat l�etrehoz egy �uj folyamatot, akkor az �ujonnan l�etrehozott folyamatot gyermek
folyamatnak nevezik, azt a folyamatot, amely a gyermeket l�etrehozta sz�ul}o folyamatnak
nevezik. Fontos megoldani az egym�assal p�arhuzamosan fut�o folyamatok egym�as k�ozti
kommunik�aci�oj�at is.
Minden egyes folyamathoz t�obbek k�ozt hozz�a van rendelve egy egyedi �un. folyamat-
azonos��t�o (processz-id, pid), �es az, hogy ki ind��totta el azt a folyamatot (vagyis az,
hogy melyik felhaszn�al�o ind��totta el; persze az is t�arolva van minden egyes folyamatr�ol,
hogy melyik folyamat hozta l�etre, �es m�eg sok m�as adat). Ilyen jelleg}u inform�aci�ok ny-
ilv�antart�asa �erdek�eben minden egyes felhaszn�al�ohoz hozz�a van rendelve egy term�eszetes
sz�am, a felhaszn�al�o azonos��t�oja (user-id, uid). A folyamatot elind��t�o felhaszn�al�o uid-je
be lesz jegyezve a processz-t�abl�aba, �es k�es}obb ha kell, akkor onnan ki lehet azt nyerni.
A UNIX oper�aci�os rendszerben alap�ertelmez�es szerint minden egyes folyamat �or�okli a
sz�ul}oj�enek az uid-j�et �es a jogait valamint sz�amos m�as jellemz}oj�et is. (Ezzel szemben a
folyamat-azonos��t�o, a pid p�eld�aul nem �or�ok�olhet}o, mert ekkor az nem lenne egyedi.)
Az egym�assal p�arhuzamosan m}uk�od}o folyamatoknak gyakran kell kommunik�alniuk
valamilyen m�odon. Az oper�aci�os rendszer feladatai k�oz�e tartozik a folyamatok k�oz�otti
kommunik�aci�o (Interprocess Communication) megszervez�ese is.
Sok oper�aci�os rendszer a folyamat fogalmat k�et f}o r�eszre osztja: egy taszkra �es egy
vagy t�obb �un. threadre (magyarul: sz�al). A taszk egy "er}oforr�asgy}ujtem�eny" (f�ajlok,
mem�oriater�uletek �es m�as objektumok) a thread pedig a folyamat "lelke": l�enyeg�eben
egy processzor-�allapotb�ol �es egy saj�at stack-b}ol �all. Egy taszkban egy vagy t�obb thread
lehet. Az eredeti (UNIX-szer}u) modellben egy folyamat pontosan egy taszkb�ol �es egy
benne fut�o threadb}ol �all.
(Szok�as megk�ul�onb�oztetni preempt��v ill. nem preempt��v thread-rendszereket is.
Az el}obbiben minden egyes threadnek van egy-egy id}oszelete, am��g futhat, majd ha az
lej�ar, akkor egy m�asik thread kapja meg a CPU-t; az ut�obbi modellben a threadnak
valamilyen op-rendszer rendszerh��v�as megh��v�as�aval �onsz�ant�ab�ol kell lemondania a CPU-
haszn�alatr�ol - ez ut�obbi forma a program nyomk�ovet�esekor hasznos.)
1.2. F �AJLOK 9
1.2 F�ajlok
Minden sz�am��t�og�epet felszerelnek valamilyen h�att�ert�arral, ami adatokat k�epes t�arolni
hosszabb id}on kereszt�ul (f�ajlok "form�aj�aban"). Ezeknek a f�ajloknak neveket adhatunk.
Az, hogy a n�ev h�any �es milyen karaktert tartalmazhat, nagyon elt�er}o lehet a k�ul�onb�oz}o
oper�aci�os rendszerekben. A f�ajlok kezel�es�et v�egz}o oper�aci�os rendszer komponenseket
gyakran h��vj�ak f�ajlrendszer kezel}onek.
Egy kisebb m�eret}u UNIX rendszerben alaphelyzetben kb. 3000-10000 kisebb-nagyobb
f�ajl van a h�att�ert�aron, ez�ert az ott t�arolt f�ajlokat valahogyan rendszerezni kell. A
kialakult legelfogadhat�obb megold�ast a hierarchikus directory-szerkezet (directory
sz�o jelent�ese katal�ogus) jelenti. Ekkor a valamilyen szempont szerint �osszetartoz�o f�ajlok
ker�ulnek egy k�oz�os directoryba. A hierarchikuss�ag abban �all, hogy minden egyes di-
rectory tartalmazhat �un. aldirectorykat, amik szint�en tartalmazhatnak aldirectorykat
...
Az egyetemeken ez p�eld�aul �ugy haszn�alhat�o ki, hogy a felhaszn�al�okat k�et csoportba
osztva (pl. oktat�ok csoportj�aba ill. hallgat�ok csoportj�aba; persze lehet sok m�as csoport,
ez ink�abb csak p�elda �ert�ek}u) mindk�et csoportnak egy-egy k�ul�on directoryja lehet, ��gy a
hallgat�ok f�ajljai v�edve vannak a k��v�ancsi oktat�ok el}ol (�es term�eszetesen ford��tva is).
A hierarchikus directory-szerkezetet biztos��t�o oper�aci�os rendszerekben az egyes
f�ajlokra �ugy hivatkozhatunk, hogy el}osz�or meg kell adni azt, hogy a f�ajlt tartalmaz�o
directoryt melyik directorykon kereszt�ul �erhetj�uk el a hierarchikus directory-szerkezet
gy�oker�et}ol kiindulva, majd meg kell adni a f�ajlt tartalmaz�o directory nev�et �es mag�anak
a f�ajlnak a nev�et is. (Ezt nevezik a f�ajl pathname-j�enek.) Ha p�eld�aul van egy user nev}u
directory (tegy�uk fel, hogy ez a directory a directory-szerkezet gy�oker�eben van), aminek
van egy student nev}u aldirectoryja, akkor az abban az aldirectoryban lev}o xyz nev}u
f�ajlra a /user/student/xyz n�evvel hivatkozhatunk. (A UNIX oper�aci�os rendszerben a
pathname egyes tagjait a / jel v�alasztja el egym�ast�ol, �es a f�ajln�evben a legels}o / jel a
hierarchia tetej�en lev}o �un. gy�ok�er-directoryt jel�oli, amely egyetlen m�as directorynak sem
aldirectoryja.) Ha minden egyes f�ajlra csak ilyen "hossz�u m�odon" (�un. abszol�ut path-
name seg��ts�eg�evel) hivatkozhatn�ank, akkor nagyon neh�ez lenne az �elet (�es k�enyelmetlen
is!). Ez�ert alak��tott�ak ki a munka-directory (working directory) fogalm�at. Ez azt je-
lenti, hogy van egy �un. munka-directory, amelyben a f�ajlokat a gy�ok�ert}ol hozz�ajuk vezet}o
minden egyes aldirectory nev�enek felsorol�asa n�elk�ul �erhetj�uk el. Csak azoknak a direc-
toryknak a nev�et kell felsorolni, amely a hierarchi�aban a munka-directory alatt van. (Az
ilyen, a munkadirectoryb�ol kiindul�o pathname-eket relat��v pathname-nek szok�as nevezni.)
M�eg egy fontos elv van a f�ajlrendszerekkel kapcsolatban: a k�esz�ul�ekf�uggetlens�eg.
Eszerint az elv szerint a programokat �ugy kell meg��rni, hogy m}uk�odni tudjanak att�ol
f�uggetlen�ul, hogy az inputjukat �es az outputjukat k�epez}o f�ajlok egy oppy-lemezen vagy
egy winchesteren vannak (vagy esetleg az input a billenty}uzetr}ol lesz beadva ...).
Egyes oper�aci�os rendszerek a f�ajlokr�ol nem felt�eteleznek semmif�elebels}o strukt�ur�at:
egyszer}uen egy byte-folyamnak tekintik azokat (ilyen a UNIX). M�as rendszerekben a
f�ajlokmondjuk �x vagy v�altoz�o sz�am�u byteot tartalmaz�o rekordok sorozata - ez gyakori
volt a lyukk�arty�as id}oszakban: minden f�ajl 80 byteos rekordokb�ol �allt. Ma egyre ink�abb
a byte-folyam jelleg}u f�ajl k�ep ker�ul el}ot�erbe, �es a f�ajlok bels}o szerkezet�et pedig az azt
feldolgoz�o programok "saj�at bel�at�asuk szerint" alak��thatj�ak ki.
A f�ajlokhoz minden oper�aci�os rendszer nyilv�antart bizonyos �un. f�ajl-attributumokat.
Ezek a f�ajllal egy�utt a h�att�ert�aron lesznek t�arolva. Ilyen f�ajl-attributumok p�eld�aul a
10 FEJEZET 1. BEVEZET�ES
k�ovetkez}ok (nem minden oper�aci�os rendszer ad lehet}os�eget az itt felsorolt �osszes f�ajl-
attributum nyilv�antart�as�at):
� a f�ajl m�erete byteban VAGY blokkban (oper�aci�os rendszert}ol f�ugg a "VAGY" ..)
� a f�ajl hozz�af�er�es�ehez sz�uks�eges jelsz}o
� a f�ajl maxim�alis m�erete (n�ehol ez is el}ore meg van k�otve)
� a f�ajl tulajdonos�anak azonos��t�oja
� a f�ajl "system" f�ajl-e (az oper�aci�os rendszerenk�ent v�altozhat, hogy egy f�ajl
"system"-s�ege milyen lehet}os�egeket jelent)
� a f�ajl "archive" f�ajl-e (ez az egyik oper�aci�os rendszer szer}u eszk�ozben, az MS-DOS-
ban azt jel�oli, hogy a f�ajl ki van-e mentve (BACKUP-olva) vagy sem)
� a f�ajl "hidden"-e vagy sem
� a f�ajl l�eterehoz�as�anak d�atuma
� a f�ajl utols�o m�odos��t�as�anak d�atuma
� utols�o "haszn�alat" d�atuma
� a f�ajl jelszavakat tartalmaz, nem n�ezheti meg senki (esetleg m�eg a rendszergazda
sem)
� a f�ajl egy aldirectory (ilyenkor gyakran az adott aldirectory �altal t�arolt f�ajlok neveit
tartalmazza ...)
� esetleg azt is t�arolhatja a rendszer egy f�ajlr�ol, hogy a f�ajl a h�att�ert�ar hib�as szektorait
(bad blocks) is tartalmazza, ez�ert nem tan�acsos hozz�any�ulni.
Sok oper�aci�os rendszer a f�ajlokat vagy legal�abb egy r�esz�uket haszn�alatuk k�ozben a
mem�ori�aban tartja. Ezt cache-el�esnek nevezik, �es a mem�ori�anak azt a (gyakran di-
namikusan v�altoz�o m�eret}u) r�esz�et, amit az oper�aci�os rendszer erre felhaszn�al cache-
mem�ori�anak nevezik.
Sok f�ajlrendszer lehet}os�eget ny�ujt a f�ajlok "mem�ori�aba �agyaz�as�ara" (memory
mapped �les). Ez azt jelenti, hogy a folyamatok a mem�oria valamelyik szegmens�en
(r�esz�en) kereszt�ul a f�ajlba tudnak ��rni, illetve onnan tudnak olvasni: ha a program a
mem�oriaszegmens 0., 1., 2. ... bytej�at mondjuk megv�altoztatja, akkor vele egy�utt meg
fog v�altozni a h�att�ert�arol�on t�arolt f�ajl 0., 1., 2. ... byteja is. Ez a megold�as teh�at
egys�egess�e teszi a f�ajl- �es mem�oriahozz�af�er�es m�odj�at, kapcsolatot teremtve az oper�aci�os
rendszer f�ajlrendszere �es a mem�oriakezel}o komponense k�oz�ott.
Az oper�aci�os rendszer feladata a f�ajlrendszer konzisztenss�eg�enek a biztos��t�asa
is: ez p�eld�aul mag�aba foglalja azt is, hogy az oper�aci�os nehogy k�etszer ugyanazt a diszk-
szektort haszn�alja fel egy f�ajl k�ul�onb�oz}o r�eszeinek a t�arol�as�ara, mert��gy adatok veszn�enek
el.
1.3. MEM�ORIAKEZEL�ES 11
1.3 Mem�oriakezel�es
A mem�oria az egyik legfontosabb (�es gyakran a legsz}uk�osebb) er}oforr�as, amivel egy
oper�aci�os rendszernek gazd�alkodnia kell; f}oleg a t�obbfelhaszn�al�os rendszerekben, ahol
gyakran olyan sok �es nagy folyamat fut, hogy egy�utt nem f�ernek be egyszerre a
mem�ori�aba. A mem�oriakezel�esr}ol nem lesz sz�o a k�es}obbi fejezetekben, ez�ert itt is-
mertetem a fontosabb fogalmakat.
Am��g a multiprogramoz�as nem jelent meg, addig az oper�aci�os rendszerben nem volt
olyan nagy sz�uks�eg a mem�oriakezel}o r�eszekre. A multiprogramoz�as megjelen�es�evel azon-
ban sz�uks�egess�e v�alt a mem�ori�anak a fut�o folyamatok k�oz�otti valamilyen "igazs�agos"
eloszt�as�ara. A megold�ast a virtu�alis mem�oriakezel�es jelentette. Ez �ugy m}uk�odik,
hogy az oper�aci�os rendszer minden egyes folyamatnak ad a k�ozponti mem�ori�ab�ol egy
akkora r�eszt, amelyben a folyamat m�eg �ugy ahogy m}uk�odik, �es a folyamatnak csak
azt a r�esz�et tartja a k�ozponti mem�ori�aban, amely �eppen m}uk�odik. A folyamatnak azt
a r�esz�et, amelyre nincs sz�uks�eg (mert p�eld�aul m�ar r�eg nem ad�odott r�a a vez�erl�es, �es
felt�etelezhetj�uk, hogy r�ovid id}on bel�ul nem is fog v�egrehajt�odni) ki kell rakni a h�att�ert�arra
(a diszken az �un. lapoz�asi ter�uletre). Ez a megold�as az�ert m}uk�odik, mert a pro-
gramok legt�obbsz�or egy elj�ar�ason bel�ul ciklusban dolgoznak, nem csin�alnak gyakran nagy
ugr�asokat a program egyik v�eg�er}ol a m�asikra (ez a lokalit�as elve).
A k�ozponti egys�eg fel van szerelve egy �ugynevezett mem�oriakezel}o egys�eggel
(MMU), amely �gyeli, hogy olyan k�odr�eszre ker�ul-e a vez�erl�es, amely nincs benn a
k�ozponti mem�ori�aban (mert p�eld�aul a h�att�ert�arra van kirakva). Ha a mem�oriakezel}o
egys�eg azt tal�alja, hogy ez az eset �all fenn, akkor az oper�aci�os rendszert arra utas��tja,
hogy rakja ki a h�att�ert�arra a folyamatnak azt a r�esz�et, amely jelenleg a mem�ori�aban van,
�es azt a r�eszt hozza be a hely�ere, amelyre ezut�an sz�uks�eg lesz.
A virtu�alis mem�oria kezel�ese leggyakrabban lapoz�assal (paging) t�ort�enik. Ekkor
a virtu�alis mem�oria (egy folyamat virtu�alis c��mtartom�anya, amit a CPU biztos��t) fel
lesz osztva egyenl}o nagys�ag�u r�eszekre, �un. lapokra (pages) - a h�att�ert�ar �es a mem�oria
k�oz�ott legal�abb ennyi byteot fog az oper�aci�os rendszer �atvinni (vagy ennek t�obbsz�or�os�et).
A �zikai mem�oria pedig fel lesz osztva ugyanolyan m�eret}u lapkeretekre (page frames).
Ha mondjuk a virtu�alis c��mtartom�any 128 KByte, �es 64 KByte �zikai mem�oria van
a sz�am��t�og�epbe �ep��tve, akkor ez 32 lapot, �es 16 lapkeretet jelent, ha a lapm�eret 4
KByte. Ha egy program v�egrehajt egy olyan (g�epi k�od�u) utas��t�ast, amely a mem�oria
valamelyik rekesz�ere hivatkozik (a hivatkozott mem�oriarekesz c��m�et nevezik virtu�alis
c��mnek), akkor ezt a c��met el}osz�or a processzor �atadja az MMU-nak, ami majd egy
�zikai mem�oriabeli c��met �all��t el}o bel}ole. E feladat�anak ell�at�as�ahoz az MMU t�arol egy
�un. lapt�abl�at (vagy legal�abbis valamilyen m�odon hozz�af�er a lapt�abl�ahoz), amely a
lapok �es lapkeretek egym�ashoz rendel�es�et tartalmazza egy speci�alis �un. "�erv�enyess�egi"
bittel, ami minden egyes laphoz t�arolva van, �es a bit �ert�eke azokn�al a lapokn�al 1, ame-
lyekhez tartozik a �zikai mem�ori�aban lapkeret. Az MMU m}uk�od�ese sor�an egy kapott
virtu�alis c��mhez tartoz�o lapr�ol megvizsg�alja, hogy az "�erv�enyess�egi" bitje 1-e. Ha igen,
akkor a megadott laphoz tartoz�o lapkeret sorsz�am�at visszaadja a CPU-nak (mondjuk
... ez t�ort�enhet ��gy is), �es az a k��v�ant adatot a megfelel}o (�zikai mem�oria-) rekeszb}ol
megszerzi (vagyis azt csin�al vele, amit a g�epi k�od�u programban a v�egrehajtott g�epik�od�u
utas��t�asban megadtak). Mi t�ort�enik akkor, ha az "�erv�enyess�egi" bit 0? Ekkor egy �un.
hardware-interrupt (megszak��t�as) keletkezik, amit laphib�anak (page faultnak) neveznek.
Ekkor ker�ul v�egrehajt�asra az oper�aci�os rendszer mem�oriakezel}o r�esze, ami egy m�asik
12 FEJEZET 1. BEVEZET�ES
"�erv�enyes" (�zikai mem�oriabeli) lapnak az 1-es �erv�enyess�egi bitj�et 0-ra �all��tja, �es a hozz�a
tartoz�o lapkeretet a diszkre menti (az �un. lapoz�asi ter�uletre). A lapkeretet ezut�an be��rja
a lapt�abl�aba ahhoz a laphoz, amelyhez a laphiba sor�an hozz�a akartak f�erni, bet�olti a dis-
zkr}ol (lapoz�asi ter�uletr}ol) a megfelel}o laphoz tartoz�o lapkeret tartalm�at, a laphoz tartoz�o
"�erv�enyess�egi" bitet 1-re �all��tja, �es az MMU ezut�an m�ar laphiba n�elk�ul el tudja v�egezni
a c��mtranszform�aci�ot.
T�obb programnak sz�uks�ege lehet esetleg t�obb virtu�alis c��mtartom�anyra is. Sok CPU
lehet}os�eget ad szegment�alt mem�oriakezel�esre, ami annyit jelent, hogy a program
t�obb �un. szegmensben is t�arolhat adatokat, �es mindegyik szegmenshez k�ul�on-k�ul�on
lapt�abla tartozhat (mondjuk ... de ez nem mindig van��gy). Minden szegmensnek van egy
dinamikusan v�altoztathat�o m�erete, ami az adott szegmensben megengedett legmagasabb
sorsz�am�u mem�oriarekeszt adja meg. Ilyen rendszerekben a mem�oria c��mz�esekor meg kell
adni egy szegmens-sorsz�amot �es az azon bel�uli virtu�alis c��met is. Ilyen CPU-kon gyakori
az is, hogy az oper�aci�os rendszer r�ovid id}ore nemcsak egy-egy lapot, hanem egy eg�esz
szegmenst visz ki a h�att�ert�arra - l�enyeg�eben azt nevezik swappingnek.
A fenti le��r�as alapj�an m�ar meg�erthet}o a virtu�alis mem�oriakezel�es l�enyege, de azt
fontos megeml��teni, hogy ez a val�odi (m}uk�od}o) oper�aci�os rendszereknek az egyik legbony-
olultabb r�esze, �es nagyon neh�ez egy�eb szempontoknak is megfelel}o, r�aad�asul hat�ekony
mem�oriakezel}ot ��rni.
1.4 A shell
Az oper�aci�os rendszerekhez tartozik a felhaszn�al�oval (interakt��v) kapcsolatot tart�o
parancs�ertelmez}o, a shell (igaz nem olyan szorosan, mint az el}obbi pontokban eml��tett
r�eszek). A legegyszer}ubb shellek csak annyit tudnak, hogy egy tetsz}oleges programot
el tudnak ind��tani (p�eld�aul azt a programot, amelyiknek a nev�et a felhaszn�al�o a bil-
lenty}uzeten beadta). A bonyolultabb shellek pedig ak�ar egy komplett programnyelvet
ny�ujtanak a programoz�o sz�am�ara (ilyen shell p�eld�aul a REXX, vagy a UNIX shelljei).
1.5 V�edelem
A v�edelem nagyon fontos, f}oleg a t�obbfelhaszn�al�os oper�aci�os rendszerekben. Itt kell
v�edeni a felhaszn�al�okat egym�as el}ol, �es az oper�aci�os rendszer "bels}o dolgait" a (k��v�ancsi,
rosszindulat�u, �ugyetlen) felhaszn�al�ok, �es a hib�as programok el}ol. A v�edelem alapj�at az
k�epezi, hogy a legt�obb mikroprocesszor k�etf�ele �uzemm�odban tud m}uk�odni: felhaszn�al�oi
illetve fel�ugyel}oi �uzemm�odban. A fel�ugyel}oi �uzemm�odban minden meg van engedve, a
felhaszn�al�oi �uzemm�odban n�eh�any dolog nincs megengedve (p�eld�aul az, hogy az egyik
felhaszn�al�o �at��rja a m�asik felhaszn�al�o programj�at, �es a felhaszn�al�ok nem ny�ulhatnak az
oper�aci�os rendszer "beleegyez�ese n�elk�ul" a k�ul�onf�ele hardver perif�eri�akhoz). A fel�ugyel}oi
�uzemm�od fenn van tartva az oper�aci�os rendszernek, a felhaszn�al�oi �uzemm�odban pedig az
egyes felhaszn�al�ok programjai futhatnak.
1.6 INPUT/OUTPUT
Az oper�aci�os rendszer f}o feladatai k�oz�e tartozik az is, hogy vez�erelje a sz�am��t�og�ephez
kapcsolt I/O perif�eri�akat. A perif�eri�akat k�et csoportba szokt�ak osztani: blokk-
1.7. OPER�ACI �OS RENDSZEREK BELS }O SZERKEZETE 13
el�er�es}uek �es karakter-el�er�es}uek. Az els}o csoportba tartoznak azok, amelyekn�el a
hardver perif�eria elemi m}uvelet�enek egy blokk (nagyobb adatter�ulet mondjuk 512 byte
vagy annak a t�obbsz�or�ose) beolvas�as�at ill. ki��r�as�at lehet tekinteni, �es az egyes blokkok
"c��mezhet}ok".
A karakter-el�er�es}uek csoportj�aba tartoznak azok, amelyekn�el az elemi m}uveletnek az
egy darab karakter ki��r�asa ill. beolvas�asa tekinthet}o - itt p�eld�aul "poz��cion�al�asra" eleve
nincs lehet}os�eg. Ez a feloszt�as nem a legjobb, de l�enyeg�eben megfelel}o. P�eld�ak blokk-
el�er�es}u perif�eri�akra: oppy-disk, winchester, RAM-diszk. Karakter-el�er�es}u perif�eri�ak:
billenty}uzet, RS232-vonal, eg�er, printer. Az oper�aci�os rendszereknek azon r�eszeit, ame-
lyek a hardver perif�eri�ak kezel�es�e�ert felel}osek, eszk�ozmeghajt�oknak (device drivereknek)
nevezik.
1.7 Oper�aci�os rendszerek bels}o szerkezete
Az oper�aci�os rendszer bels}o szerkezete t�obbf�ele lehet: p�eld�aul monolitikus, r�etegzett
(layered), virtu�alis g�epeken alapul�o valamint a kliens-szerver modellen alapul�o.
A monolitikus oper�aci�os rendszer (mint p�eld�aul a UNIX) magja egyetlen programb�ol
�all. Ebben a programban az elj�ar�asok szabadon h��vhatj�ak egym�ast, a k�ozt�uk lev}o kom-
munik�aci�o elj�ar�asparam�etereken �es glob�alis v�altoz�okon kereszt�ul zajlik.
A r�etegzett szerkezet}u oper�aci�os rendszer magja t�obb modulb�ol �all, �es a modulok
k�oz�ott egy export-import hierarchia �gyelhet}o meg: minden modul kiz�ar�olag a hierar-
chi�aban alatta lev}o modul interf�esz�et haszn�alja.
A virtu�alis g�epeken alapul�o oper�aci�os rendszerben k�ozponti r�eszen helyezkednek el
a virtu�alis g�epeket menedzsel}o (hypervisor) rendszerrutinok. Ez a program lehet}ov�e
teszi a hardver er}oforr�asainak (CPU, diszk, perif�eri�ak, mem�oria, ...) t�obb oper�aci�os
rendszer k�oz�otti hat�ekony eloszt�as�at. A hypervisor leggyakrabban a sz�am��t�og�ep hard-
ver�et "t�obbsz�or�ozi meg" �ugy, hogy a rajta fut�o oper�aci�os rendszerek azt higgy�ek, hogy
�ov�uk�e az eg�esz g�ep (pedig "csak" egy virtu�alis g�epen futnak). Ha p�eld�aul egy hardver-
megszak��t�as gener�al�odik, akkor ez a szoftver adja �at annak a virtu�alis g�epnek, amelyre
ez tartozik (az, hogy kire tartozik egy hardver-megszak��t�as, t�obbf�elek�eppen eld�onthet}o:
p�eld�aul az alapj�an, hogy a k�erd�eses I/O eszk�ozt ki haszn�alta utolj�ara). Ilyen hypervisor
p�eld�aul az IBM VM/370. Az �altala l�etrehozott �es ir�any��tott virtu�alis g�epek az IBM /370-
es hardver "pontos m�asolatai", �es tudnak futtatni (egym�ast�ol f�uggetlen�ul) AIX, CMS,
TSO �es m�as oper�aci�os rendszereket.
A kliens-szerver modellen alapul�o oper�aci�os rendszerek eset�eben az oper�aci�os rendszer
k�ozponti magja �altal�aban egy �un. mikrokernel, �es maga az oper�aci�os rendszer itt t�obb
p�arhuzamosan fut�o folyamatb�ol �all. Mindegyik folyamat az oper�aci�os rendszer valamely
j�ol elk�ul�on��thet}o r�esz�et val�os��tja meg (p�eld�aul lehet egy vagy ak�ar t�obb f�ajlszerver folya-
mat, egy diszkvez�erl}o, egy printervez�erl}o folyamat a rendszerben). Ezeknek a folyama-
toknak valamilyen kommunik�aci�os eszk�ozt kell biztos��tani, �es ez a mikrokernel egyik f}o
feladata (a mem�oriakezel�esen k��v�ul). A legt�obb ma haszn�alt ilyen kernel az �uzenet�atad�ast
(message passing) teszi lehet}ov�e a p�arhuzamosan m}uk�od}o folyamatok k�oz�otti kommu-
nik�aci�o elv�egz�ese �erdek�eben. Az alacsonyszint}u �uzenet�atad�as m}uk�odhet k�et teljesen
k�ul�onb�oz}o host k�oz�ott is ugyan�ugy, mint egy hoston bel�ul k�ul�onb�oz}o folyamatok k�oz�ott,
ami a kommunik�aci�o form�aj�at egys�egess�e teheti egy g�epen bel�ul �es k�et g�ep k�oz�ott (ezt a
transzparenci�at nagyon neh�ez el�erni).
14 FEJEZET 1. BEVEZET�ES
1.8 Osztott rendszerek architektur�aja
Manaps�ag a sz�am��t�og�epes h�al�ozatok �or�asi �utemben fejl}odnek { a nagysebess�eg}u h�al�ozatok
egyre olcs�obbak lesznek (p�eld�aul a 100 megabit/sec �atviteli sebess�eg}u Ethernet m�ar
sok helyen felv�altja az eddig alkalmazott 10 megabit/sec-es Ethernetet, �es egyre t�obb
helyen alkalmaznak (mikro)processzorok adatvonalainak k�ozvetlen �osszekapcsol�as�an ala-
pul�o h�al�ozati adat�atviteli technol�ogi�at), �es ezzel p�arhuzamosan egyre olcs�obban egyre
gyorsabb mikroprocesszorokat fejlesztenek ki a hardverfejleszt}ok laborat�oriumaiban. En-
nek a fejl}od�esnek egy nagyon fontos k�ovetkezm�enye az, hogy m�od van nagyteljes��tm�eny}u
mikroprocesszorok nagysebess�eg}u h�al�ozaton kereszt�ul t�ort�en}o �osszek�ot�es�ere (ezzel osztott
rendszerek1 l�etrehoz�as�ara). Ma m�ar kialak��tottak t�obb(t��z)ezer mikroprocesszorb�ol �all�o
sz�am��t�og�epes rendszereket, de ezek k�oz�ul nem viselheti mindegyik az osztott rendszer
nevet, mivel az alapszoftvere nem biztos��tja a felhaszn�al�o fel�e a kell}o m�ert�ek}u transz-
parenci�at, vagyis a felhaszn�al�o akarva-akaratlanul is szembetal�alkozik olyan { p�eld�aul
folyamatok szinkroniz�aci�oj�aval kapcsolatos { probl�em�akkal, amiket az okoz, hogy a rend-
szer nem egyetlen processzoron van implement�alva.
Manaps�ag az osztott rendszerek alkalmaz�as�anak sz�amos el}onye van, �es a jelenleg
m}uk�od}o megval�os��t�asok probl�em�ai miatt sz�amos h�atr�anya is akad.
Az osztott rendszerek alkalmaz�asa mellett sz�olnak az al�abbi t�enyez}ok:
� gazdas�agoss�aguk (p�eld�aul a hasonl�o teljes��tm�eny}u szupersz�am��t�og�epekkel szemben)
� a vel�uk el�erhet}o t�enyleges feldolgoz�asi kapacit�as �ori�asi m�ert�eke (a legt�obb rendszer
teljes��tm�enye a bekapcsolt processzorok sz�am�anak line�aris f�uggv�enye)
� az eg�esz rendszer megb��zhat�os�ag�anak, el�erhet}os�eg�enek n�oveked�ese
Ahogyan az osztott rendszerek mellett tal�altunk sz�amos okot arra, hogy alka-
lmaz�asukat b�arkinek aj�anlhassuk, �ugy tal�alhatunk t�obb olyan t�enyez}ot is, ami a jelenlegi
osztott-rendszer technol�ogia alkalmaz�asa ellen sz�ol:
� a megfelel}o transzparencia hi�anya
� a rendszer komponensei k�ozti kapcsolatot biztos��t�o adat�atviteli k�ozeg (vagyis a
h�al�ozat : : : ) megb��zhat�os�aga nagyban befoly�asolja a rendszer alkalmazhat�os�ag�at2
� egy osztott rendszer er}oforr�as-adminisztr�aci�oja (itt nem a rendszergazda felada-
tok ell�at�as�ara gondolok, hanem p�eld�aul a f�ajlok �es m�as oper�aci�os rendszer
er}oforr�asokra) sokkal er}oforr�asig�enyesebb az egyes komponensek �osszekapcsolatlan
�allapotbeli adminisztr�aci�oj�an�al
Az osztott rendszerek hardware komponenseitk�epez}o sz�am��t�og�epeket szok�asmul-
ticomputer illetvemultiprocesszor halmazra felbontani aszerint, hogy a processzoraik
1De�n��ci�o: osztott rendszeren egy olyan t�obbprocesszoros rendszert �ert�ek, amely t�obb (ak�ar k�oz�osmem�ori�aval nem rendelkez}o) sz�am��t�og�epen m}uk�odik, de a rendszer felhaszn�al�oja m�egis �ugy l�atja, minthaaz eg�esz rendszer egyetlen nagyteljes��tm�eny}u sz�am��t�og�ep lenne. (Itt a felhaszn�al�o elnevez�es alatt nemc-sak a klasszikus �ertelemben vett felhaszn�al�okat �ertem (akik a rendszerre k�esz��tett alkalmaz�oi programokat
haszn�alj�ak), hanem azokat a programoz�okat is, akik a rendszerre �uj programokat fejlesztenek.)2Az Ethernet h�al�ozatokban p�eld�aul nem lehet id}o tekintet�eben fels}o korl�atot adni arra, hogy egy adatcso-
magot egy sz�am��t�og�ep mikor tud a dr�oton tov�abb��tani (annak ellen�ere, hogy m�ern�ok�ok val�osz��n}uleg be tudj�ak
bizony��tani, hogy annak a val�osz��n}us�ege 1 (HF: t�enyleg mennyi ez a val�osz��n}us�eg?), hogy egy adatcsomagotegy sz�am��t�og�ep korl�atos id}on bel�ul el tud k�uldeni), ez�ert az Ethernet �altal�aban nem haszn�alhat�o val�os idej}uelosztott rendszerek k�esz��t�es�ere.
1.8. OSZTOTT RENDSZEREK ARCHITEKTUR�AJA 15
rendelkeznek-e k�oz�os haszn�alat�u mem�ori�aval vagy sem. A multiprocesszor eset�en van
ilyen k�oz�os haszn�alat�u mem�oria.
A szoftver tekintet�eben pedig szok�as besz�elni laz�an kapcsolt rendszerekr}ol il-
letve szorosan kapcsolt rendszerekr}ol (az el}obbiekben csak egy-egy rendszerkompo-
nens van elosztva a h�al�ozaton { ilyen p�eld�aul a h�al�ozati f�ajlrendszer, az NFS, amely-
ben csak a f�ajlrendszer elosztott, �es a rendszer t�obbi komponense egym�ast�ol teljesen
f�uggetlen�ul m}uk�odik, m��g a szorosan kapcsolt rendszerekben nagyon kev�es az egym�ast�ol
f�uggetlen�ul m}uk�od}o komponens). A szorosan kapcsolt szoftverek tervez�esekor a legnagy-
obb neh�ezs�eget az okozza, hogy a rendszerben senki sem ismer glob�alis inform�aci�okat a
rendszerr}ol, mindig csak annak egy r�esz�er}ol (esetleg csak p�ar t��zezer sz�am��t�og�epr}ol egy
milli�o sz�am��t�og�epet tartalmaz�o h�al�ozatban) vannak r�eszletes inform�aci�ok.
Megjegyezz�uk, hogy a kommunik�aci�o, a kommunik�al�o felek szerkezete nagyon
sokf�ele lehet az osztott rendszerekben. Ilyen ter�uleten is kialakultak m�ar "szok�asos"
megold�asok: kliens-szerver p�arok kapcsolat�at gyakran a t�avoli elj�ar�ash��v�asi mod-
ellre �ep��tik; (kett}on�el) t�obb komponens}u rendszereket pedig gyakran az �uzenetsz�or�asra
(broadcasting) �ep��tik: itt az egyik r�esztvev}o (rendszerkomponens) olyan eszk�oz�okkel ren-
delkezik, amivel egy �uzenetet k�uldhet az �osszes t�obbi r�esztvev}onek.
1.8.1 A t�avoli elj�ar�ash��v�as
A helyi elj�ar�ash��v�as sor�an a h��v�o f�el a h��vott elj�ar�as sz�am�ara �atadand�o argumentumokat
�altal�aban a programv�egrehajt�asi veremre helyezi, majd �atad�odik a vez�erl�es a h��vott
elj�ar�asnak, amely a veremr}ol leolvashatja az argumentumokat, �es elv�egzi vel�uk a fe-
ladat�at. Miut�at az elj�ar�as befejez}od�ott, a v�egeredm�enyeket (a h��v�o elj�ar�asnak vis-
szaadand�o �ert�ekeket) r�arakhatja a veremre, �es miut�an a h��v�o elj�ar�as visszakapja a
vez�erl�est, kiolvashatja a veremb}ol az egyes visszat�er�esi �ert�ekeket, �es felhaszn�alhatja azokat
tov�abbm}uk�od�ese sor�an.
A t�avoli elj�ar�ash��v�as sor�an a h��v�o �es a h��vott elj�ar�asok nem felt�etlen�ul ugyanazon a
sz�am��t�og�epen vannak: mialatt egy elj�ar�as v�egre lesz hajtva a t�avoli g�epen, addig a h��v�o
elj�ar�as fut�asa felf�uggeszt}odik (mondjuk a v�alasz vissza�erkez�es�eig). A param�eter�atad�as
megold�as�ara kialakultak m�ar elfogadhat�o technik�ak { ezzel majd egy k�es}obbi kiad�asban
r�eszletesebben fogunk foglalkozni.
1.8.2 �Uzenetsz�or�as
M��g a t�avoli elj�ar�ash��v�as �altal�aban a k�etkomponens}u kliens-szerver kapcsolatok imple-
ment�al�as�ara haszn�alhat�o, addig az �uzenetsz�or�as enn�el t�obb komponens kapcsolat�at (is)
k�epes megteremteni. Term�eszetesen kett}on�el t�obb rendszerkomponens kommunik�aci�oja
megszervezhet}o az egyes komponensek k�oz�otti t�avoli elj�ar�ash��v�asi m}uveletekkel, de egy
ilyen esetben a kommunik�aci�o lebonyol��t�as�ahoz sz�uks�eges t�avoli elj�ar�ash��v�asok sz�ama a
kommunik�al�o felek sz�am�an�al eggyel kevesebb, azaz azok sz�am�anak n�oveked�es�evel egyenes
ar�anyban n}o. Az �uzenetsz�or�as abban k�ul�onb�ozik l�enyegesen a t�obb komponens k�oz�ott
elv�egzett t�avoli elj�ar�ash��v�as k�oz�ott, hogy alkalmaz�asakor az �osszes c��mzetthez egyetlen
m}uvelettel lehet az �uzenetet elk�uldeni.
Egy �uzenet c��mzettjeinek a halmaz�at csoportnak nevezz�uk. Egy csoportot �altal�aban
folyamatoknak azon halmaz�ab�ol alak��tanak ki, amelyek valamilyen tekintetben azonosan
viselkednek. Szoftver tekintetben az azonos viselked�es egyik alapja a csoportok k�oz�otti
16 FEJEZET 1. BEVEZET�ES
kommunik�aci�oj�anak azon tulajdons�aga, hogy a csoportnak k�uld�ott �uzenetek minden
csoport-tagn�al meg�erkeznek, �es az �uzenetek meg�erkez�esi sorrendje minden csoport-tagn�al
ugyanaz. Most r�oviden �attekint�unk egy { az Amoeba elosztott oper�aci�os rendszer-
ben implement�alt { �uzenetsz�or�asi protokollt, amely megfelel a fenti k�ovetelm�enyeknek
(vagyis k�et tetsz}olegesen kiv�alsztott �uzenet egym�ashoz viszony��tott sorrendje az �osszes
sz�am��t�og�epen megegyezik).
Az algoritmus felt�etelez egy koordin�ator sz�am��t�og�epet, amely a csoportok kommu-
nik�aci�oj�anak koordin�al�as�a�ert felel}os (amennyiben ez a sz�am��t�og�ep elromlana, akkor a
protokoll �uj koordin�ator v�alaszt�as�at��rja el}o { ami p�eld�aul az elosztott rendszerbe kapcsolt
sz�am��t�og�epek k�oz�ul valamilyen m�odon kiv�alaszthat�o { ak�ar �ugy is, hogy a legmagasabb
hardware-azonos��t�oj�u hostot v�alasztjuk ki e c�elra).
Az algoritmus a k�ovetkez}ok�eppen m}uk�odik:
1. Az �uzenetsz�or�assal elk�uldend}o �uzenetet az �uzenetsz�or�ast k�er}o folyamat �atadja
az oper�aci�os rendszernek, ami gondoskodik a koordin�atorhoz val�o elk�uld�esr}ol
(mondjuk egy hagyom�anyos, t�avoli elj�ar�ash��v�asra �ep�ul}o eszk�ozzel), kieg�esz��tve egy
sorozatsz�ammal (ami az eddig fogadott �uzenetek sorozatsz�am�anak maximum�aval
kell, hogy megegyezzen).
2. A koordin�ator a kapott �uzenetet a k�ovetkez}o, az eddig haszn�altakn�al eggyel
nagyobb �uzenetsorsz�ammal kieg�esz��tve a hardware ny�ujtotta { nem felt�etlen�ul
megb��zhat�o { �uzenetsz�or�asi eszk�ozzel mindenki sz�am�ara elk�uldi az �uzenetet.
3. Egy (broadcast) �uzenet fogad�asakor az �uzenetet fogad�o sz�am��t�og�ep oper�aci�os rend-
szer �osszehasonl��tja az �uzenet sorsz�am�at az eddig kapott �uzenetek sorsz�am�anak a
maximum�aval. Ha a kapott �uzenet sorsz�ama nem csak eggyel nagyobb az eddigi
�uzenetek sorsz�am�anak maximum�an�al, akkor az oper�aci�os rendszer felt�etelezheti,
hogy valamilyen okn�al fogva egy (vagy t�obb) �uzenetet nem kapott meg { egyes
�uzenetek nem jutottak el hozz�a (amik persze m�asokhoz m�ar eljuthattak). Amen-
nyiben alapos a gyan�uja annak, hogy egy �uzenetet nem kapott meg egy adott
sz�am��t�og�ep, akkor annak az �uzenetnek az �ujrak�uld�es�et fogja k�erni a koordin�atort�ol.
Megjegyz�esek:
A koordin�atornak el kell t�arolnia az �osszes eddigi olyan �uzenetet, amelyek �ujrak�uld�es�et
valamelyik folyamat m�eg k�erheti (eml�ekezz�unk r�a, hogy a koordin�atornak k�uld�ott
�uzenetek tartalmazz�ak az addig megkapott, legnagyobb sorsz�am�u �uzenet sorsz�am�at).
Ha az �uzenet k�uld}oje �ugy l�atja, hogy a koordin�ator egy bizonyos id}on bel�ul nem
tov�abb��totta (sz�orta sz�et ...) az �uzenetet, akkor �ujra k�uldheti az �uzenetsz�or�as ir�anti
k�erelm�et a koordin�atorhoz.
Minden �uzenet el van l�atva egy egyedi azonos��t�oval is a duplik�atumok kisz}ur�ese
c�elj�ab�ol.
Az is el}ofordulhat, hogy az �uzenet k�uld}oje nem az �altala k�uld�ott �uzenetet kapja meg,
hanem el}obb n�eh�any m�asikat, �es csak azt�an a saj�atj�at. Ez akkor lehet, ha t�obben is
egyszerre akartak �uzenetsz�or�assal kommunik�alni, �es a koordin�ator egy m�asik �uzenetet
kapott meg �es tov�abb��tott el}obb.
Ha a koordin�ator sz�am��t�og�ep �osszeomlana, akkor �uj koordin�atort kell v�alasztani. Az �uj
koordin�atornak fel kell k�esz�ulnie esetlegesen �uzenetek �ujraad�as�ara, ��gy az eddig elk�uld�ott,
de mindenki �altal nem megkapott �uzeneteket az �osszes potenci�alis koordin�ator-jel�oltnek
el kell t�arolnia.
1.9. HOLTPONT 17
1.9 Holtpont
L�athat�o, hogy az oper�aci�os rendszernek nagyon neh�ez feladata az er}oforr�asok igazs�agos
(�es hat�ekony m}uk�od�est eredm�enyez}o) kioszt�asa. Ennek megold�asa gyakran lehetetlens�eg,
mert nem ismert a folyamatok j}ov}obeli viselked�ese (vagyis nem lehet tudni, hogy
egy adott folyamatnak milyen er}oforr�asokra lesz m�eg sz�uks�ege). Vannak olyan
"megoszthatatlan" er}oforr�asok (mint p�eld�aul a legt�obb m�agnesszalag-egys�eg), amelyet
egyszerre csak egy folyamat haszn�alhat, �es abb�ol ad�odhatnak a gondok, ha m�egis k�et
folyamat pr�ob�alja egyszerre haszn�alni }oket. Tegy�uk fel, hogy egy multitaskingot biz-
tos��t�o oper�aci�os rendszerrel felszerelt g�epen egy m�agnesszalag-egys�eg van, �es egy darab
printer. K�et folyamat fut, �es mindkett}o ki akar nyomtatni egy m�agnesszalagon t�arolt f�ajlt.
Az egyik folyamat megnyitja a m�agnesszalag-f�ajlt (ezzel kiz�ar�olagos hozz�af�er�esi jogot
nyer az egys�eghez), a m�asik folyamat (multitaszkos volt a rendszer) ezzel p�arhuzamosan
megnyitja a nyomtat�ora ir�any��tott f�ajlt (ezzel kiz�ar�olagos hozz�af�er�esi jogot nyer a ny-
omtat�ohoz). Ekkor az els}o folyamatmegpr�ob�alhatjamegnyitni a printer-f�ajlt, de mivel az
"foglalt", ez�ert k�enytelen v�arni (folyamatosan), am��g a m�asik folyamat "el nem engedi"
azt. A m�asik folyamat megpr�ob�alja megnyitni a m�agnesszalag-f�ajlt, de }o is k�enytelen
v�arni, am��g a m�asik folyamat el nem engedi azt. Vagyis mindk�et folyamat olyan
esem�eny bek�ovetkezt�ere v�ar, amelyet a k�et folyamat k�oz�ul A m�asik folyamat
id�ezhet el}o. Az ilyen helyzeteket nevezik holtpont-helyzetnek, m�as n�even deadlocknak.
L�eteznek ezt felismer}o vagy megel}oz}o algoritmusok, de ezek az algoritmusok gyakran
"k�enyelmetlens�egeket" okoznak a felhaszn�al�oknak (pl. meg van k�otve, hogy egy fel-
haszn�al�o maximum h�any folyamatot ind��that el, mivel a processz-t�abla is betelhet, �es ez
is okozhat holtpontot), ez�ert t�obb oper�aci�os rendszer (mint p�eld�aul. a UNIX) egyszer}uen
tudom�ast sem vesz arr�ol, hogy ez bek�ovetkezhet, �es ha bek�ovetkezne egy ilyen esem�eny,
akkor a felhaszn�al�ora b��zza az ilyen helyzetbe ker�ult folyamatok "kil�ov�es�et" (ld. majd
k�es}obb).
1.10 Az Intel 80386 mikroprocesszor architekt�ur�aja
Az Intel 80386-os mikroprocesszor egy olyan igazi 32-bites mikroprocesszor, amely a pro-
gramoz�onak egy szegment�alt �es lapoz�asos virtu�alis mem�ori�at biztos��t. Hardver m�odon
t�amogatja a k�ul�onf�ele v�edelmi rendszerek kialak��t�as�at (a programok 4 k�ul�onb�oz}o v�edelmi
kateg�ori�akba sorolhat�oak, �es az egyes kateg�ori�akban a programok jogai el�eg �noman
szab�alyozhat�ok). A 386-os nagyon j�o alapot biztos��t a UNIX oper�aci�os rendszer im-
plement�al�as�ahoz, ez�ert �erdemes a processzor architektur�aj�at k�ozelebbr}ol is megismerni.
Err}ol lesz sz�o itt r�oviden.
A processzor mem�oriakezel�es�enek a lelk�et k�et t�abl�azat k�or�e �ep��tik: ezek a t�abl�ak a
lok�alis- �es glob�alis le��r�o t�abl�ak (LDT: local descriptor table, GDT: global descrip-
tor table). Ezek a t�abl�ak ��rj�ak le a szegmensek szerkezet�et (p�eld�aul a szegmens hely�et
(b�azisc��m�et), m�eret�et (lapokban vagy byteokban m�erve) �es v�edelmi jellemz}oit). A GDT-
t minden program k�oz�osen haszn�alja, �es a fontosabb rendszerszegmensek (mondjuk az
oper�aci�os rendszer szegmensei) �erhet}ok el ezen kereszt�ul. Minden program rendelkezik
egy-egy saj�at LDT-vel, amelyben a program saj�at szegmensei vannak le��rva - amelyek a
programk�odot, adatokat �es egy�eb inform�aci�okat tartalmazz�ak.
A processzornak 6 szegmensregisztere van: a CS, DS, SS, ES, FS �es GS. Minde-
gyik szegmensregiszter egy 16-bites �un. szelektor �ert�eket tartalmaz, amely egy�ertelm}uen
18 FEJEZET 1. BEVEZET�ES
azonos��t egy-egy le��r�ot�ablabeli elemet. (Pontosabban a 16 bitb}ol 1 bit mondja meg, hogy
a lok�alis vagy glob�alis deszkriptor t�abl�ar�ol van-e sz�o; tov�abbi 13 bit mondja meg, hogy az
adott t�abl�an bel�ul melyik sorsz�am�u szegmensr}ol van sz�o; a marad�ek k�et bit pedig v�edelmi
inform�aci�okat tartalmaz.) A szegmensregiszterek k�oz�ul a CS a k�odszegmenst azonos��tja
(vagyis azt a szegmenst, amely a v�egrehajtand�o k�odot tartalmazza), a DS az adatszeg-
menst (vagyis azt a szegmenst, ahonnan a program a fut�as�ahoz sz�uks�eges adatokat ve-
heti), az SS pedig a program verem szegmens�et azonos��tja. A m�asik h�arom szegmenst
(ES, FS, GS) a programoz�o arra haszn�alja, amire akarja - p�eld�aul egyes utas��t�asok el�e egy-
egy �un. pre�x byteot ��rva el�erhet}o az, hogy a processzor az adott utas��t�as v�egrehajt�asa
sor�an a DS szegmens helyett mondjuk az ES-t haszn�alja az adatok el�er�es�ere.
Ezen k��v�ul egy speci�alis kontroll-regiszter tartalmazza a lapt�abla kezd}oc��m�et a
mem�ori�aban - ez alapj�an t�ort�enik az �un. line�aris c��m �zikai c��mm�e konvert�al�asa (a 386-os
processzor 4 KByte-os lapokat kezel). A line�aris c��m kisz�am��t�asa a k�ovetkez}ok�eppen
t�ort�enik: amikor egy program egy adott szegmens adott bytej�ara hivatkozik (a byte o�-
szetj�enek nevezik a byte szegmensen bel�uli hely�et), akkor a processzor a szegmensszelek-
tornak megfelel}o le��r�ot�ablaelemb}ol a b�azisc��met �es a bytehoz tartoz�o o�szetet �osszeadja,
�es��gy kapjameg az �un. line�aris c��met. A lapoz�as term�eszetesen letilthat�o (vagyis "kikapc-
solhat�o"), �es ekkor a line�aris c��m megegyezik a k�erd�eses byte �zikai mem�oriabeli c��m�evel.
A processzor v�edelmi modellje a k�ovetkez}o: 4 �un. logikai v�edelmi gy}ur}u van (ezek
k�oz�ul a 0-�as sorsz�am�u a legt�obb privilegiumot biztos��t�o, m��g a 3-as sorsz�am�u a legkevesebb
privilegiumot biztos��t�o, �un. legkev�esb�e privilegiz�alt gy}ur}u). Minden programr�ol t�arolva
van, hogy melyik gy}ur}uben fut (ez az, amit a program nem v�altoztathat meg), �es minden
egyes szegmeshez is t�arolva van a deszkriptort�abl�aban egy-egy ilyen privilegium-szint. A
legfontosabb szab�aly az, hogy a program nem ny�ulhat bele a n�al�an�al jobban privilegiz�alt
szegmensekbe. Egy�eb esetekben �un. (�altal�anos) v�edelmi kiz�ar�as keletkezik, amikor az
oper�aci�os rendszer kapja meg a vez�erl�est, �es a "saj�at bel�at�asa szerint" cselekedhet (mond-
juk kil}oheti a szab�alytalankod�o programot). A privilegiz�altabb k�odszegmensekben t�arolt
elj�ar�asok megh��v�asa is csak ellen}orz}ott m�odon t�ort�enhet - csakis a deszkriptort�abl�aban
t�arolt �un. call-kapukon kereszt�ul ker�ulhet�unk privilegiz�altabb k�odszegmensbe. (Egy-egy
ilyen call-kapu (call gate) l�enyeg�eben a privilegiz�altabb szegmens "nyilv�anos" bel�ep�esi
pontjait t�arolja, �es nem lehet csak �ugy egy privilegiz�alt szegmens belsej�ebe "beleugrani".)
Ebben a pontban { folytatva a mikroprocesszor architektur�ak ismertet�es�et { az IBM
�altal a 90-es �evekben kifejlesztett Power mikroprocesszor architektur�at fogom bemutatni.
Ez egy cs�okkentett utas��t�ask�eszlet}u (RISC) processzor (az utas��t�ask�eszlet cs�okkent�ese az
egy utas��t�as �ertelmez�es�ere/dek�odol�as�ara sz�uks�eges id}o cs�okkent�ese �erdek�eben hasznos {
ezzel "gyorsabb" lesz a processzor).
(majd egyszer ...)
1.11 Szabv�anyok
A ny��lt rendszerek "ny��lts�ag�anak" az az alapja, hogy a kommunik�aci�ojukmegfelel}oen (sz-
abv�anyokban) r�ogz��tett protokollok alapj�an t�ort�enik - ezek a szabv�anyok teszik lehet}ov�e
a kommunik�aci�ot. A ma kialakult szabv�anyok nagyon sokr�et}uek �es sokfajt�ak: r�ogz��tik
azt, hogy az alapszoftvernek mit kell tudnia, az alapszoftver egyes moduljainak milyen
interface-ei legyenek (�es m�eg sok m�as dolgot).
A legismertebb alapszofvterrel kapcsolatos szabv�anyok: a POSIX (Portable Oper-
ating System Inteface for UNIX) �es az XPG3 (X/Open Portability Guide Volume 3),
1.11. SZABV �ANYOK 19
valamint l�etezik m�eg az AT&T �altal kiadott SVID (UNIX System V Interface De�ni-
tions) szabv�any is.
A SVID nyilv�an az AT&T elk�epzel�esei alapj�an k�esz�ult (a kialakult 4.3BSD UNIX-
szal szemben), a POSIX szabv�anyok ink�abb az AT&T �es a 4.3BSD UNIX "metszete"
alapj�an, m��g az XPG3 ink�abb az AT&T �es a 4.3BSD UNIX "uni�oja" alapj�an k�esz�ult el.
Term�eszetesen ezek a szabv�anyok sok nem a UNIX-szal kapcsolatos dolgot is tartalmaz-
nak.
Most r�oviden �osszefoglaljuk, hogy milyen ismertebb (gyakrabban haszn�alt) kompo-
nensei vannak a POSIX oper�aci�os rendszer interf�esz szabv�anyoknak:
� 1003.1 : C k�onyvt�ari f�uggv�enyek { ide tartoznak a rendszerh��v�asok is, mivel azok
is a C k�onyvt�aron kereszt�ul �erhet}ok el.
� 1003.2 : Parancs�ertelmez}ok �es seg�edprogramok { vagyis ide tartozik az is, hogy
mit kell tudnia egy-egy shellnek.
� 1003.3 : Annak az ellen}orz�es�ere m�odszerek, hogy egy rendszer illeszkedik-e a
POSIX szabv�anyokhoz.
� 1003.4 : Val�os-idej}u rendszerekre vonatkoz�o szabv�anyok (itt lehet id}obeli
korl�atokat is biztos��tani a szolg�altat�asokra).
� 1003.4a : T�obbsz�al�u (multithreaded) alkalmaz�asok��r�as�ara vonatkoz�o szabv�anyok.
� 1003.5 : Egy szabv�anyos Ada k�onyvt�ar interf�esz a POSIX-hoz.
� 1003.6 : Security { biztons�agoss�agi k�erd�esek vannak benne r�ogz��tve.
� 1003.7 : Rendseradminisztr�aci�os lehet}os�egek.
� 1003.8 : (H�al�ozati) transzparens f�ajlel�er�es biztos��t�asa a POSIX-hoz.
� 1003.9 : Egy szabv�anyos FORTRAN k�onyvt�ar interf�esz a POSIX-hoz.
Fontos szerepe van a szabv�anyos��t�asban (f}oleg a programnyelvek �es a sz�am��t�og�epes
h�al�ozatok ter�en) az ISO-nak (International Standards Organization) �es az ANSI-nak (ez
a szervezet az ISO tagja).�Erdekes megeml��teni, hogy az Internet vil�agh�al�ozatban haszn�alt TCP/IP kommu-
nik�aci�os protokollok a nagy elterjed�es�uk miatt v�altak de facto szabv�anny�a, �es ez m�og�ott
nem a fenti "nagy" szabv�anyos��t�o szervezetek �allnak.
L�eteznek olyan szabv�anyok is, amelyek egy adott processzort��pusra leford��tott
t�argyk�od hordozhat�os�ag�at akarj�ak biztos��tani a k�ul�onf�ele oper�aci�os rendszerek k�oz�ott.
Ilyen szabv�any p�eld�aul az iBCS2 (Intel Binary Compatibility Standard, 2. edition). A
legt�obb 386-os PC-s UNIX megfelel ennek - ez�ert ezek a UNIX-ok egym�as programjait
minden tov�abbi n�elk�ul k�epesek futtatni. (Az iBCS2 nem csak ISA vagy EISA buszos
386-osokon (ill. 486-osokon) �el! Pont ez a sz�ep benne!)
Term�eszetesen a ny��lt rendszerek fogalmanem azonos a UNIX-szal, hab�ar a ny��lt rend-
szerekkel kapcsolatos (�es elfogadott) szabv�anyok legt�obbsz�or UNIX-alap�uak - a UNIX
rendszerb}ol sz�armaznak. Az OpenVMS oper�aci�os rendszer a DEC p�eld�aja arra, hogy
nem UNIX-os k�ornyezetben is biztos��that�o a "ny��lt rendszer" k�ep.
20 FEJEZET 1. BEVEZET�ES
1.12 Objektum-orient�alt fel�uletek
Manaps�ag nagyon terjed}oben vannak az objektum-orient�alt eszk�oz�ok illetve programoz�asi
nyelvek, viszont a legt�obb szabv�any illetve oper�aci�os rendszer szolg�altat�as valamilyen
procedur�alis (azaz nem objektum-orient�alt) interf�eszen kereszt�ul �all a programoz�ok
rendelkez�es�ere. Ez�ert sokan k�esz��tenek a m�ar meglev}o procedur�alis szeml�elet}u pro-
gramk�onyvt�arakhoz olyan kieg�esz��t�eseket (�un. "k�openyeket"), amelyek objektum-
orient�alt szeml�elet}u hozz�af�er�est biztos��tanak az alatta lev}o nem objektum-orient�alt
fel�ulethez (ezek a kieg�esz��t�esek �altal�aban valamilyen objektum-orient�alt nyelvi eszk�oz�oket
(pl. �or�okl}od�es, oszt�alyok) biztos��t�o programoz�asi nyelven k�esz�ulnek, mint p�eld�aul a
C++ vagy az Objective-C). Az objektum-orient�alt eszk�oz�ok el}onyei t�obbek k�ozt az
�ujrafelhaszn�alhat�o eszk�oz�ok tervez�es�eben ill. k�esz��t�es�eben valamint az eszk�oz�ok { gyakran
{ k�onnyebb meg�erthet}os�eg�eben, megtanulhat�os�ag�aban rejlenek.
Eddig m�ar sz�amos k�openyk�esz��t�esi elv kialakult, itt most r�oviden �attekintj�uk ezeket.
1.12.1 Egyszer}u k�openy
Akkor besz�el�unk egyszer}u k�openyr}ol, ha a k�openy az eredeti procedur�alis fel�ulethez
k�epest nem ny�ujt gazdagabb szolg�altat�asokat. Ezek a k�openyek gyakran �ugy
k�esz�ulnek, hogy egy j�ol de�ni�alt rendszerobjektum k�or�e �ep��tik; biztos��tj�ak az adott
objektum l�etrehoz�as�ahoz illetve megsz}untet�es�ehez haszn�alhat�o konstruktor illetve de-
struktor m}uveleteket, valamint objektum-met�odusk�ent biztos��tj�ak az eredeti nem
objektum-orient�alt fel�ulet egyes m}uveleteit (kieg�esz��tve esetleg konverzi�os m}uveletekkel,
amik olyankor lehetnek sz�uks�egesek, ha az eredeti nem objektum-orient�alt fel�ulethez
hozz�af�erni sz�and�ekoz�o k�onyvt�arakat ezen objektum-orient�alt fel�uletre �ep��tve akarunk
tov�abbhaszn�alni).
1.12.2 Specializ�alt k�openy
Specializ�alt k�openyekr}ol olyankor szok�as besz�elni, ha az �altalunk l�etrehozott objektum-
oszt�alyok met�odusai �es az eredeti programoz�oi fel�ulet elj�ar�asai k�ozt nem lehet egy
egy�ertelm}u megfeleltet�est l�etes��teni; ilyenkor �altal�aban egy-egy oszt�alym}uvelet az ere-
deti procedur�alis fel�ulet t�obb szolg�altat�as�at is ig�enybe v�eve igen �osszetett feladatokat
l�athat �es l�at is el. �Altal�aban nehezebb ilyen k�openyeket j�ol meg��rni, viszont ezeket a
k�openyeket gyakran k�onnyebb felhaszn�alni, mint az egyszer}u k�openyeket (ui. az egyszer}u
k�openyekn�el a k�openy haszn�al�oj�anak m�eg viszonylag j�ol kell ismernie az eredeti oper�aci�os
rendszer fel�uletet). Az is igaz, hogy ilyen specializ�alt k�openyeket jobban lehet igaz��tani
az alkalmaz�as-fejleszt}ok ig�enyeihez, ami szint�en a k�openy haszn�al�oj�anak a lehet}os�egeit
k�onny��ti.
1.12.3 Objektum-orient�alt k�openyek tervez�ese
Az objektum-orient�alt eszk�oz�ok (k�openyek) tervez�esekor minden esetben azonos��tani
kell a rendszerbeli er}oforr�asokat (objektum oszt�alyokat), valamint a rajtuk v�egezhet}o
m}uveleteket. Oper�aci�os rendszerek eset�en objektumok p�eld�aul a folyamatok, a f�ajlok, a
mem�oria, stb. Ezeken pedig sokf�ele m}uvelet v�egezhet}o (amik term�eszetesen oper�aci�os
rendszerenk�ent k�ul�onb�oz}oek lehetnek). Miut�an megvannak az objektum oszt�alyok,
1.13. MI LESZ M�EG 21
meg kell hat�arozni a kapcsolatukat { a k�ozt�uk lev}o esetleges �or�okl}od�esi rel�aci�okat.
Fontos, hogy az objektum-orient�alt k�openyek hibat}ur}oek legyenek, az eredeti procedur�alis
fel�ulethez k�epest, vagyis cs�okkents�ek a hib�asan haszn�alhat�o oper�aci�os rendszer eszk�oz�ok
sz�am�at: seg��tse a programoz�ot a programhib�ak kik�usz�ob�ol�es�eben valamint felder��t�es�eben.
1.13 Mi lesz m�eg
E r�ovid bevezet}o ut�an a 2. �es 3. fejezetben sz�o lesz a ma legelterjedtebb ny��lt rendsz-
ernek, a UNIX-nak a m}uk�od�es�er}ol, �es a legalacsonyabb szint}u programoz�oi interfacer}ol:
a rendszerh��v�asokr�ol. Az ezut�an k�ovetkez}o fejezetekben a ny��lt rendszerek egym�as k�ozti
kommunik�aci�oj�ar�ol lesz sz�o t�obb szempontb�ol is: a 4. fejezet a sz�am��t�og�epes h�al�ozatokat
mutatja be, valamint a legalacsonyabb szint}u programoz�oi interfacet, amelyet h�al�ozati
alkalmaz�asok fejleszt�es�en�el kihaszn�alhatunk: a Berkeley socketokat �es az XTI-t (X/Open
Transport Interface).
A m�asodik fejezet nagyon k�epl�ekeny, most (1995-ben) m�ar nem is igaz�an tetszik
nekem, ez�ert v�arhat�oan v�altozni fog (b�ar ez a v�altoz�as majd csak egy-k�et kiad�as eltelt�evel
fog realiz�al�odni; addig marad ez a megold�as).
1.14 K�erd�esek, feladatok
1. Mi az oper�aci�os rendszer, �es mi a feladata?
2. Mit jelentenek a k�ovetkez}o fogalmak?
� cache-mem�oria
� gyermek-folyamat
� taszk
� processz-t�abla
� f�ajl
� f�ajl-attributum
� lap
� lapkeret
� paging
� swapping
� szegmens
� multicomputer
� multiprocesszor
3. Mit �ert�unk hierarchikus directory-szerkezeten?
4. Mit �ert�unk k�esz�ul�ekf�uggetlens�egen?
5. Mi a v�edelem szerepe az oper�aci�os rendszerekben? Mit �es ki el}ol kell v�edeni?
6. Mi a shell?
22 FEJEZET 1. BEVEZET�ES
7. Keress�unk p�eld�at olyan perif�eri�ara, amely nem teljesen illeszthet}o be sem a blokk-
el�er�es}u, sem a karakter-el�er�es}u perif�eri�akr�ol alkotott k�epbe!
8. Mi a virtu�alis mem�oriakezel�es?
9. Mi a processzor mem�oriakezel}o egys�eg�enek a szerepe?
10. *Lehet-e egy (virtu�alis-) mem�oriakezel}o egys�eg n�elk�uli hardveren virtu�alis g�epeket
szimul�alni? Mi okozhat itt komoly probl�em�at?
11. *Lehetne-e mondjuk egy Intel 80386-on virtu�alis 80386-os g�epeket szimul�alni? Ha
igen, akkor mit lehet mondani a szimul�aci�o hat�ekonys�ag�ar�ol.
12. *A mem�ori�aba �agyazott f�ajlok hossza t�obb oper�aci�os rendszerben is csak a pro-
cesszor mem�oriakezel}o egys�eg�enek (MMU-nak) a lapm�eret�enek t�obbsz�or�ose lehet.
Vajon mi�ert? Milyen probl�em�at akarnak ��gy kik�usz�ob�olni?
13. Mi�ert fontos a f�ajlrendszer konzisztenci�aj�anak biztos��t�asa?
14. Mi a holtpont �es hogyan alakulhat ki?
15. Mit �ert�unk az osztott rendszer fogalom alatt?
16. Mi a l�enyeges k�ul�onbs�eg a szorosan illetve a laz�an kapcsolt rendszerek k�oz�ott?
Fejezet 2
A UNIX oper�aci�os rendszer
A UNIX oper�aci�os rendszer els}o v�altozat�at 1969-ben k�esz��tette el Ken Thompson az
AT&T-n�el egy leselejtezett PDP-7 sz�am��t�og�epen. Miut�an munkat�arsai is j�o lehet}os�egeket
l�attak a programban, az AT&T szoftverfejleszt}oinek egy r�esze elkezdett ezzel komolyab-
ban foglalkozni, �es egyre �ujabb, fejletteb v�altozatokat hoztak ki. Mivel a UNIX rendszert
C nyelven k�esz��tett�ek, nagyon k�onny}u volt �at��rni egy �uj hardverre, ez�ert nagyon hamar
elterjedt az eg�esz vil�agon. Elterjed�es�et seg��tette az is, hogy az els}o p�ar �evben a rendszer
teljes forr�aslist�aja b�arki sz�am�ara (ingyen) hozz�af�erhet}o volt. Ennek egy k�ovetkezm�enye
volt az is, hogy a legt�obb helyen az egyetemi oktat�asban ezt a rendszert haszn�alt�ak. A
UNIX hetedik v�altozat�anak megjelen�ese ut�an az AT&T l�atta a UNIX piaci siker�et, �es a
forr�ask�od m�ar csak a magas jogd��jak meg�zet�ese ellen�eben volt hozz�af�erhet}o.
A UNIX legf}obb gyenges�ege az lett, hogy nagyon sok (t�obb�e-kev�esb�e elt�er}o) v�altozata
van. (M�ar kialakult t�obbf�ele szabv�any, p�eld�aul a SVID, amelyben azt speci�k�alj�ak, hogy
mit kell tudnia egy "igazi" UNIX-nak.) Ennek ellen�ere a UNIX alatt meg��rt programok
sokkal hordozhat�obbak, mint p�eld�aul a DOS alatt meg��rtak. A UNIX m�ar majdnem
minden sz�am��t�og�epre �at lett ��rva (az IBM PC-t}ol kezdve a szupersz�am��t�og�epekig).
Az AT&T UNIX v�altozata mellett jelent}os a BSD UNIX (Berkeley Software Distribu-
tion - ennek a jelenlegi (aktu�alis) v�altozata a 4.4-es BSD UNIX), �es a Microsoft XENIX
rendszere is.
A UNIX egy multitaskos �es t�obbfelhaszn�al�os oper�aci�os rendszer, ez�ert alkalmas arra,
hogy az ilyen �es ehhez hasonl�o rendszerekben felmer�ul}o probl�em�akat ezen vizsg�aljuk meg.
2.1 N�eh�any alapvet}o UNIX-beli fogalom
A k�ovetkez}o fogalmak ismeret�ere lesz sz�uks�eg:
� uid: A felhaszn�al�o azonos��t�oja (a rendszernek minden egyes felhaszn�al�onak egy
egyedi ilyen azonos��t�oja van).
� gid: Csoportazonos��t�o. A UNIX rendszerben minden felhaszn�al�o be van osztva egy
csoportba. A gid annak a csoportnak az azonos��t�oja, amelybe a felhaszn�al�o tartozik.
(A csoportbeoszt�as tetsz}oleges lehet; van olyan rendszer, ahol minden felhaszn�al�o
egy k�oz�os csoportba tartozik, �es p�eld�aul az egyetemeken gyakori a teachers illetve
students csoport.)
� pid: Folyamat-azonos��t�o.
23
24 FEJEZET 2. A UNIX OPER�ACI �OS RENDSZER
� pgrp-id: Folyamat-csoport azonos��t�oja. Ez egyenl}o a folyamat-csoport vezet}oj�enek
a pid-j�evel (minden folyamat tagja valamely folyamat csoportnak, minden folyamat
megalap��that egy saj�at folyamat-csoportot, �es lehet}os�eg van p�eld�aul egy folyamat-
csoport minden tagj�anak a "kil�ov�es�ere" egyetlen m}uvelettel).
� tgrp-id : Termin�al group-id. Minden folyamathoz ez is t�arolva van. Ez
egyenl}o annak a folyamatnak a pid-j�evel, amely a folyamathoz tartoz�o termin�al-
(k�eperny}o)f�ajlt legel}osz�or megnyitotta. Ez �altal�aban a legel}osz�or elindult login
shell.
� euid: (e�ektiv user id) - �altal�aban egyenl}o az uid-del, a felhaszn�al�oi azonos��t�obval,
de bizonyos esetekben (�un. setuid-bites programokn�al) m�as is lehet. Ilyen m�odon
egy adott folyamatnak t�obb jogot lehet adni, mint ami a folyamat elind��t�oj�anak
van.
� egid: (e�ektiv group id) - mint euid, csak a csoport-azonos��t�ora.
� szuperfelhaszn�al�o: minden jogokkal rendelkez}o felhaszn�al�o. A felhaszn�al�oi
azonos��t�oja �altal�aban 0 szokott lenni minden UNIX-ban, �es felhaszn�al�oi neve (login
neve) �altal�aban root.
2.2 Folyamatok a UNIX rendszerben
A UNIX rendszer egy igazi multitaskos rendszer, minden folyamat l�etrehozhat egy vagy
t�obb gyermek-folyamatot, �es a gyermek-folyamatok a sz�ul}o-folyamattal p�arhuzamosan
futnak. A gyermek-folyamat �or�okli a sz�ul}oj�enek a jogait, �es egy�eb tulajdons�agait. A
processz-t�abl�aban egy folyamathoz (t�obbek k�oz�ott) a k�ovetkez}o inform�aci�ok vannak
t�arolva:
� pid (folyamat azonos��t�o )
� pgrp-id (folyamat-csoport azonos��t�o)
� A sz�ul}o-folyamat azonos��t�oja
� A processzor-regiszterek �ert�ekei
� A folyamat �altal elhaszn�alt CPU id}o
� A folyamat gyermek-folyamatainak a sz�ama
� A folyamatot elind��t�o felhaszn�al�o felhaszn�al�o azonos��t�oja �es a csoportj�anak az
azonos��t�oja.
� A folyamat e�ektiv uid-je �es gid-je (ezt ld. k�es}obb)
� A folyamat munka-directoryja (working directory)
� A folyamat megnyitott f�ajljai
2.3. A FOLYAMATOKK �OZ �OTTI KOMMUNIK �ACI �O (IPC) A UNIX RENDSZERBEN25
(A folyamat kulcsfogalomnak sz�am��t minden oper�aci�os rendszerben - nem csak a
UNIX-ban. Az, hogy mi tartozik egy folyamathoz nagyon nagy m�ert�ekben befoly�asolja
az eg�esz oper�aci�os rendszer lehet}os�egeit �es szerkezet�et.)
Az oper�aci�os rendszer egy kicsi, de fontos r�esze a folyamat-�utemez}o (scheduler).
Mivel a legt�obb UNIX-ot futtat�o hardveren csak egy processzor van, ez�ert ezen szimul�alni
kell a folyamatok p�arhuzamos fut�as�at. Ez pedig a k�ovetkez}ok�eppen t�ort�enik:
1. Az �utemez}o a fut�asra v�ar�o �osszes folyamat k�oz�ul valamilyen szempont szerint
kiv�alaszt egyet, �es �atadja annak a vez�erl�est.
2. (Ha a folyamat valamikor a h�att�ert�arra kiker�ult, valamilyen virtu�alis mem�oria-
kezel}o m}uvelet eredm�enyek�ent, akkor el}obb visszahozza onnan.)
3. A kiv�alasztott folyamat elkezd futni (vagyis megkapja a CPU-haszn�alati jogot),
eg�esz addig, am��g az �un. id}oszelete le nem j�ar. Ez azt jelenti, hogy ha a folyamat
id}oszelete mondjuk 40 millisec., akkor a folyamat (kb.) 40 millisec.-ig fog futni.
4. Ha a folyamat id}oszelete lej�ar, akkor ism�et az �utemez}o kezd el m}uk�odni, az �ujabb
folyamatot v�alaszt ki �es annak adja �at a vez�erl�est (vagyis vissza az 1. ponthoz).
A fentiekben az egyetlen probl�em�as dolog az, hogy hogyan "j�ar le a folyamat
id}oszelete" (vagyis egy folyamatnak �onmag�anak "le kell-e mondania" a processzorr�ol,
vagy pedig az id}oszelet lej�arta ut�an az oper�aci�os rendszer automatikusan el tudja-e venni
a folyamatt�ol a processzorhaszn�alati jogot). A multitaskos rendszerekben legt�obbsz�or a
m�asodik eset �all fenn (a UNIX rendszerekn�el mindig). Ha az els}o eset �allna fenn, akkor
lehetne olyan folyamatot ��rni, amely sosem mond le a processzor haszn�alat�ar�ol, �es ezzel
a teljes oper�aci�os rendszer megb�enulna, nem tudn�a ell�atni a feladat�at (az er}oforr�asok
igazs�agos eloszt�as�at).
Az Intel 8088-as mikroprocesszor eset�en ez az �ora-megszak��t�asok kihaszn�al�as�aval old-
hat�o meg. Az IBM PC-ben van egy bels}o �ora, amely 1 m�asodpercben (kb. 100-szor) egy
�un. �ora-megszak��t�ast gener�al. Ennek a megszak��t�asnak van egy sorsz�ama, teh�at tartozik
hozz�a egy�ertelm}uen egy megszak��t�as-vektor. Az oper�aci�os rendszert ilyen g�epen �ugy
��rj�ak meg, hogy a megszak��t�as-vektor az �utemez}o modul mem�oriabeli c��m�et tartalmazza,
�es ilyen m�odon minden m�asodpercben kb. 100-szor, amikor a bels}o �ora "�ut", akkor az
�utemez}o automatikusan megkapja a vez�erl�est �es �uj folyamatot v�alaszt ki.
2.3 A folyamatok k�oz�otti kommunik�aci�o (IPC) a
UNIX rendszerben
Kezdetben a UNIX csak a pipeokat tartalmazta mint IPC-eszk�ozt (ezt ld. k�es}obb), ami
egy nagyon primit��v eszk�oznek bizonyult, mert a kommunik�aci�o csak olyan folyamatok
k�oz�ott t�ort�enhetett, amelyeknek van k�oz�os }ose. Az IPC m�as eszk�ozei a UNIX rend-
szerbe csak a fejleszt�es�enek egy k�es}oi szakasz�aban ker�ultek be, ez�ert az AT&T UNIX
(ezzel egy�utt a Microsoft XENIX-e) �es a BSD UNIX (ezzel egy�utt p�eld�aul az Ultirx)
rendszerek m�as eszk�oz�oket ny�ujtanak a programoz�ok sz�am�ara az IPC megszervez�es�ere.
Itt az AT&T UNIX �altal ny�ujtott eszk�oz�ok lesznek bemutatva, mert k�es}obb az lett
szabv�anyos��tva (az X/Open szabv�anyba ez ker�ult be), igaz a m�asik t�abor, a Berkeley
(BSD) UNIX fejleszt}oinek csoportja ezt a t�enyt mindm�aig egyszer}uen �gyelmen k��v�ul
26 FEJEZET 2. A UNIX OPER�ACI �OS RENDSZER
hagyta. (A legt�obb BSD UNIX forgalmaz�o az�ert ad valamilyen k�onyvt�arakat, amelyek az
AT&T rendszerh��v�asokat implement�alj�ak vagy szimul�alj�ak.) Az AT&T UNIX h�aromf�ele
eszk�ozzel rendelkezik ezen a t�eren: szemaforokkal, osztott mem�ori�aval (shared mem-
ory) �es �uzenet�atad�assal (message passing).
A szemafor egy 0 �es 32767 k�oz�otti �ert�eket vehet fel, �es a programoz�o ennek az �ert�ek�et
n�ovelheti �es cs�okkentheti �ugy, hogy e k�et m}uvelet oszthatatlan m}uveletnek tekinthet}o,
vagyis az oper�aci�os rendszer gondoskodik arr�ol, hogy ne tudj�ak ketten egyszerre ugyanan-
nak a szemafornak az �ert�ek�et megv�altoztatni �ugy, hogy a v�altoztat�as a rendszerben
inkonzisztenci�at okozna. (Inkonzisztencia p�eld�aul onnan eredhetne, hogy ha k�et folyamat
egyszerre pr�ob�alja egy 2 byteos szemafor �ert�ek�et megv�altoztatni, �es ek�ozben az egyiknek
kiosztott id}oszelet lej�ar miut�an a k�et byte egyik�et �at�all��totta (de a m�asik byteot m�eg
nem), a vez�erl�est megkapja a m�asik folyamat, az �at�all��tja a szemafor �ert�ek�et a maga
elk�epzel�esei szerint, majd amikor a vez�erl�est visszakapja az el}oz}o folyamat, akkor az
�at�all��tja a m�asik byteot, �es ezzel kaotikus �allapotok alakulhatnak ki).
Az osztott mem�oria haszn�alata lehet}ov�e teszi azt, hogy egy bizonyos mem�oriater�uletet
(nyilv�an a benne t�arolt adatokkal egy�utt) egyszerre t�obb folyamat is l�assa.
Az �uzenetek lehet}ov�e teszik egy-egy mem�oriater�ulet (bu�er) tartalm�anak
�atk�uld�es�et az egyik folyamatt�ol a m�asiknak. K�et primit��v m}uvelet van az �uzenetek
kezel�es�ere: �uzenet elk�uld�ese �es �uzenet fogad�asa. Az �uzenetfogad�o primit��v lehet blokkol�o
vagy nem-blokkol�o aszerint, hogy ha a v�egrehajt�as�anak pillanat�aban m�eg nem �erkezett
a folyamat sz�am�ara �uzenet, akkor a program v�arjon egy �uzenet be�erkez�es�eig vagy fusson
tov�abb jelezve azt, hogy nem volt beolvashat�o �uzenet.
2.4 A UNIX f�ajlrendszere
A UNIX oper�aci�os rendszer f�ajlrendszere hierarchikus, a rendszerben egyetlen gy�ok�er-
directory van, �es annak tetsz}oleges m�elys�egben tetsz}oleges sz�am�u aldirectoryja lehet,
azoknak az aldirectoryjainak szint�en tetsz}olegesen sok aldirectoryjuk lehet, stb. A UNIX
a f�ajlt egyszer}uen egy byte-folyamnak tekinti. A UNIX rendszerben l�etezik a munka-
directory koncepci�oja (minden folyamatnak van egy saj�at munka-directoryja). A UNIX
abban l�enyegesen k�ul�onb�ozik az MS-DOS-t�ol, hogy csak egy gy�ok�er-directoryja van, �es a
m�agneslemezeken lev}o k�ul�on f�ajlrendszerek (a lemezen kialak��tott directory-struktur�ak)
beilleszthet}ok (mountolhat�ok) a gy�ok�erdirectory- rendszerbe. Erre n�ezz�unk egy p�eld�at {
a UNIX gy�ok�er-f�ajlrendszere tartalmaz t�obb directoryt:
f�ajln�ev szerepe
/etc egy aldirectory a rendszerf�ajloknak
/etc/passwd a jelsz�of�ajl a /etc directoryban (ez FILE!)
/etc/limit egy aldirectory a /etc directoryban
/usr a felhaszn�al�ok directoryjait tartalmaz�o directory
/usr/csb a "csb" nev}u felhaszn�al�o f�ajljait tartalmaz�o directory
/lib a UNIX C k�onyvt�arait tartalmaz�o directory
/tmp tempor�alis f�ajlokat tartalmaz�o directory
/bin Fontosabb rendszerprogramokat tartalmaz�o directory.
Most tegy�uk fel, hogy van egy f�ajlrendszer�unk egy oppy-diszken, amely a k�ovetkez}o
dolgokat tartalmazza:
2.4. A UNIX F�AJLRENDSZERE 27
f�ajln�ev szerepe
/alma valamilyen f�ajl
/mylib a f�ajlrendszeren egy "mylib" nev}u directory
/mylib/alma a mylib directoryn bel�ul az alma nev}u f�ajl
/barack egy tetsz}oleges barack nev}u f�ajl
A felhaszn�al�o k�erheti a UNIX rendszert, hogy illessze be a oppy-diszken lev}o
f�ajlrendszert a gy�ok�er-f�ajlrendszer valamelyik �ures directoryj�aba. Most n�ezz�uk, hogy
mi lesz akkor, ha a fenti gy�ok�er-f�ajlrendszer /usr/csb directoryj�aba beillesztj�uk a fent
elk�epzelt oppy-diszken lev}o f�ajlrendszert. Ezut�an a oppyn lev}o f�ajlokat a k�ovetkez}o
neveken �erhetj�uk el:
/usr/csb/alma (a oppyn a /alma nev}u f�ajl)
/usr/csb/mylib (a oppyn a /mylib directory)
/usr/csb/mylib/alma (a oppyn a /mylib/alma f�ajl)
/usr/csb/barack (a oppyn a /barack nev}u f�ajl)
Term�eszetesen ha ezekre a f�ajlokra m�ashol lenne sz�uks�eg (pl. a /tmp directory-
ban, akkor oda is be lehetne }oket illeszteni - mountolni). Ez az alapja a UNIX �un.
k�esz�ul�ekf�uggetlens�eg�enek. A f�ajlokra val�o hivatkoz�askor nem kell tudni azt, hogy az
adott f�ajl milyen �zikai perif�eri�an van. Ehelyett el�eg a f�ajlnak a f�ajlrendszer-hierarchiabeli
nev�et megadni.
A UNIX-ban minden egyes f�ahlhoz tartoznak �un. v�edelmi bitek (ezeket rwx
biteknek is nevezik). A f�ajlokat ezekkel lehet v�edeni a jogosulatlan hozz�af�er�es ellen.
Mint m�ar sz�o volt r�ola, minden felhaszn�al�onak van egy saj�at uid-je, gid-je. L�enyeg�eben
ez a UNIX f�ajlv�edelm�enek az alapja. Minden egyes f�ajlhoz t�arolva van az }ot l�etrehoz�o
felhaszn�al�o uid-je �es gid-je, illetve a fent eml��tett rwx- bitek (�osszesen 9 bit). Az rwx-b}ol
az "r" bet}u a f�ajl elolvas�asi jog�at jelenti, a "w" bet}u a f�ajl fel�ul��r�asi (m�odos��t�asi) jog�at
jel�oli, �es a v�egrehajthat�o programok eset�en az "x" bit a v�egrehajt�asi jogot jel�oli. Az
rwx-bitekkel meg lehet adni, hogy a fenti 3 jog k�oz�ul a f�ajlt l�etrehoz�o felhaszn�al�onak
milyen jogai vannak a f�ajlon; a f�ajlt l�etrehoz�o felhaszn�al�o csoportt�arsainak milyen jogai
vannak; �es v�eg�ul meg lehet adni, hogy azoknak az "egy�eb" felhaszn�al�oknak, akik a fenti
k�et halmaz egyik�ebe sincsenek benn mik legyenek a jogai. (A v�edelmi bitek sorrendje
ugyanez; el}osz�or a tulajdonos, majd a csoportt�arsak, v�eg�ul pedig az egy�eb felhaszn�al�ok
jogait kell megadni.) Ha egy f�ajl v�edelmi bitjei r-xr-x--x alak�uak, akkor a tulajdonos a
f�ajlt elolvashatja, v�egrehajthatja (de nem m�odos��thatja); a tulajdonos csoportt�arsainak
ugyanez a joguk; az egy�eb felhaszn�al�oknak pedig csak v�egrehajt�asi joguk van. A f�ajlhoz
tartoz�o v�edelmi biteket csak a f�ajl tulajdonosa vagy a root (superuser) v�altoztathatja
meg.
Ezen k��v�ul n�eh�any v�egrehajthat�o f�ajln�al �erdemes haszn�alni a UNIX egy m�as speci�alis
lehet}os�eg�et: a sticky bitet. Ha ez a bit be van �all��tva egy v�egrehajthat�o f�ajlon, �es a f�ajlban
t�arolt programot v�egrehajtj�ak, akkor a program befejez}od�ese ut�an a k�odszegmense (ha
az nem v�altozott meg) megmarad a winchester virtu�alis mem�oria ter�ulet�en - ��gy egy
k�ovetkez}o v�egrehajt�as val�osz��n}uleg gyorsabban fog elkezd}odni, mivel a k�odszegmens
�ujb�oli bet�olt�ese megsp�orolhat�o. (Egy speci�alis v�edelmi bitr}ol - a setuid bitr}ol k�es}obb
lesz sz�o.)
A UNIX rendszerben egy m�asik nagyon j�o �otlet az �un. speci�alis f�ajlok koncepci�oja.
Ilyen m�odon az egyes hardware perif�eri�akat a f�ajlrendszerbeli nev�uk�on �erhetj�uk el. Az
28 FEJEZET 2. A UNIX OPER�ACI �OS RENDSZER
�otlet azon alapszik, hogy p�eld�aul egy 360 KByte-os (mondjuk IBM PC/XT form�atum�u)
oppy-diszket tekinthet�unk �ugy, mint egy 360 KByte-os f�ajlt. Ha a lemezen a blokkm�eret
512 byte, akkor az ilyen f�ajl els}o karaktere a diszk 0-adik blokkj�aban az els}o byte; a f�ajl
512-edik karaktere a diszk 0-adik blokkj�aban az utols�o (512-edik) byte, p�eld�aul az 1025-
�odik byte pedig a diszk m�asodik blokkj�anak az els}o karaktere : : :Vannak blokk-speci�alis
f�ajlok, �es karakter-speci�alis f�ajlok. A blokk-speci�alis f�ajlok abban k�ul�onb�oznek a karakter-
speci�alis f�ajlokt�ol, hogy a blokk-speci�alis f�ajloknak n�eh�any "gyakrabban haszn�alt" blokkja
a cache mem�ori�aban marad a gyorsabb el�er�es �erdek�eben, m��g a karakter- speci�alis
f�ajlokn�al erre nincs lehet}os�eg.
A UNIX f�ajlrendszr�eben a /dev directory tartalmazza az ilyen speci�alis f�ajlokat.
P�eld�aul a legt�obb rendszerben a /dev/fd0 n�even a 0-�as lemezegys�eget �erhetj�uk el (PC-
ken ez az MS-DOS alatt az A: jel}u lemezegys�eg).
A UNIX m�asik �erdekes lehet}os�ege a pipe ( cs}ovonal). Ez a p�arhuzamos folyama-
tok k�oz�otti kommunik�aci�o (IPC) egyik eszk�oze. Ezt t�enyleg �ugy tekinthetj�uk, mint k�et
folyamat k�ozti cs}ovonalat: az egyik folyamat ��rhat ebbe a cs}ovonalba valamilyen ada-
tokat, a m�asik folyamat pedig kiolvashatja a be��rt adatokat a pipe-b�ol. (A pipe csak
egy half-duplex (egyir�any�u) kapcsolatot biztos��t, vagyis ha mindk�et r�esztvev}o folyamat
akar a m�asiknak adatokat k�uldeni, akkor a k�etir�any�u adat�atvitelhez k�et ilyen pipe-ra van
sz�uks�eg.) A pipe-ra ��rni �es arr�ol olvasni is a UNIX f�ajlm}uveleteivel lehet. S}ot lehet}os�eg
van arra is, hogy pipeokat n�evvel l�assunk el (a pipeok nevei ekkor f�ajlnevek lesznek,
amin kereszt�ul b�armelyik folyamat tud a pipera ��rni - esetleg arr�ol olvasni, ehhez csak a
pipehoz tartoz�o f�ajl nev�et kell ismernie).�Erdekes m�eg, hogy a h�al�ozati kapcsolatok is l�enyeg�eben f�ajldeszkriptorokon kereszt�ul
�erhet}ok el, de err}ol majd k�es}obb lesz sz�o.
A UNIX egy t�obbfelhaszn�al�os oper�aci�os rendszer, ��gy egy f�ajlt egyszerre t�obb fel-
haszn�al�o is v�altoztathat. Ez gyakran probl�em�ak forr�asa is lehet. N�ezz�uk a k�ovetkez}o
helyzetet: egy bank sz�am��t�og�ep�en UNIX rendszer fut, a sz�am��t�og�ephez t�obb k�eperny}o
van kapcsolva (minden egyes p�enzt�aros asztal�an van egy-egy termin�al). Tegy�uk fel, hogy
k�et p�enzt�arhoz egyszerre megy oda k�et �ugyf�el, �es ugyanarra a banksz�aml�ara mindket-
ten 500 forintot akarnak rakni. Ekkor mindk�et sz�am��t�og�ep kiolvassa a sz�amla aktu�alis
egyenleg�et (ez legyen mondjuk 1000 forint), kisz�amolja, hogy mennyi lesz az 500 forint
berak�asa ut�an az �uj egyenleg (1500 forint), �es vissza��rja azt. Mivel ezek az �ugyfelek lehet,
hogy nem is tudnak arr�ol, hogy a m�asik is ugyanarra a sz�aml�ara rakott be 500 forintot,
boldogan mennek hazafel�e a bank-igazol�assal, amelyen �uj egyenlegk�ent 1500 forint van
felt�untetve, nem veszik �eszre, hogy a g�ep hib�azott. Mivel a gyakorlatban az ilyen eseteket
nem szabad elhanyagolni (egy nagyobb bank k�ozponti sz�am��t�og�ep�ere t�obb ezer termin�alt
r�a lehet kapcsolni), �es sok olyan sz�amlasz�am van, amelyre sokan �zetnek be p�enzt (pl.
k�ozhaszn�u alap��tv�anyokra), ez�ert erre kell valami megold�ast tal�alni.
A UNIX az ilyen esetekre ny�ujtja a f�ajl- ill. rekord-lefoglal�as (f�ajl and record
locking) lehet}os�eg�et. Egy folyamat k�erheti az oper�aci�os rendszert, hogy egy f�ajlt vagy
annak egy r�esz�et "foglaljon le" eg�eszen addig, am��g a folyamat el nem v�egzi rajta a dolg�at
(mondjuk ink�abb �ugy, hogy a feladat�at : : : ). A lefoglal�as ideje alatt m�as folyamat nem
ny�ulhat a f�ajl lefoglalt r�esz�ehez; ha m�egis hozz�a akarna ny�ulni, akkor v�arnia kell addig,
am��g a f�ajlt lefoglal�o folyamat "elengedi" a f�ajlt.
M�asik fontos elt�er�es a UNIX �es az MS-DOS f�ajlrendszere k�oz�ott az, hogy a UNIX
f�ajlrendszerben nem egy k�oz�os nagy MS-DOS-ban haszn�alt FAT-szer}u t�abl�azatban
t�arolj�ak azt, hogy a f�ajl a diszk melyik blokkjain helyezkedik el, hanem minden egyes
2.4. A UNIX F�AJLRENDSZERE 29
f�ajlhoz k�ul�on t�arolj�ak (egy-egy a f�ajlhoz tartoz�o �un. i-nodeban) azt, hogy a f�ajl a diszk
melyik r�esz�en helyezkedik el. Az i-node t�arolja azt is, hogy ki a f�ajl tulajdonosa (mi volt
a tulajdonos uid-je �es gid-je akkor amikor a f�ajlt l�etrehozta), mekkora a f�ajl hossza (byte-
ban m�erve), mikor hozt�ak l�etre, mikor m�odos��tott�ak utolj�ara, mik a f�ajl v�edelmi bitjei.
Minden egyes i-nodenak van egy sorsz�ama, �es a directoryk (l�enyeg�eben speci�alis f�ajlk�ent
- amit megnyithatunk �es ezeket az inform�aci�okat kiolvashatjuk bel}ole) a k�ovetkez}o in-
form�aci�ok sorozat�at tartalmazz�ak:
maximum 14 karakteres f�ajln�ev hozz�a tartoz�o i-node sorsz�ama
Ez az�ert hasznos, mert ��gy egy f�ajlra t�obb directoryb�ol is hivatkozhatunk. Ezzel
megoldhatjuk azt, hogy k�et vagy t�obb felhaszn�al�o ugyanazt a f�ajlt el�erje a saj�at direc-
toryj�ab�ol. Erre n�ezz�uk a k�ovetkez}o p�eld�at: a /usr/pista directoryban van egy ilyen
bejegyz�es :
test.c 234
a /usr/mariska directoryban pedig a k�ovetkez}o bejegyz�es van (a szerkezet a fent
bemutatottak szerint �ertend}o):
proba.c 234
Itt a test.c illetve a proba.c f�ajloknak m�as a neve, de a k�et f�ajl (tartalma) egy
�es ugyanaz. Ha mondjuk a /usr/mariska/proba.c f�ajl le lesz t�or�olve, akkor a f�ajl
(a benne t�arolt adatokkal) a lemezr}ol nem lesz let�or�olve, mert m�eg hivatkoznak r�a
/usr/pista/test.c n�even. (Egy ilyen hivatkoz�ast neveznek az i-nodera mutat�o linknek
- nyilv�an az i-node tartalmaz egy referenciasz�aml�al�ot, �es a f�ajl csak akkor lesz t�enylegesen
t�or�olve, ha e referenciasz�aml�al�o �ert�eke null�ara cs�okken.) Eszerint egy f�ajl a lemezr}ol csak
akkor lesz let�or�olve, ha r�a egyetlen link sem vonatkozik.
Itt �erdemes megjegyezni azt is, hogy az i-node tartalmazza azokat az inform�aci�okat,
amely alapj�an a f�ajl helye a diszken "felt�erk�epezhet}o" a k�ovetkez}ok szerint . Az i-node
tartalmaz 13 darab blokk-c��met (a UNIX csak blokk-el�er�es}u perif�eri�akon tud f�ajlrendszert
l�etrehozni) - most a p�elda k�onnyebb meg�ert�ese �erdek�eben felt�etelezz�uk, hogy a blokkm�eret
1 KByte. Ebb}ol a 13 blokk-c��mb}ol 10 darab �un. direkt c��m. Azaz azok k�oz�ul az els}o
tartalmazza annak a (diszk-)blokknak a c��m�et, amelyen a f�ajl els}o 1024 (1 Kbyte) darab
byteja van. A m�asodik tartalmazza annak a (diszk-)blokknak a c��m�et, amelyen a f�ajl
k�ovetkez}o 1024 byteja van, stb. . A 11-edik blokk-c��m egy �un. egyszeres indi-
rekt blokk-c��m (single indirect): az a blokk, amelyet ez az egyszeres indirekt blokk-
c��m megc��mez mind direkt c��meket tartalmaz. (Ha egy blokk-c��m m�erete n byte, akkor
�osszesen 1024/n darab direkt c��m f�er ide.) Vagyis az egyszeres indirekt blokkban t�arolt
els}o c��m a f�ajl 11-edik kilobytej�at tartalmaz�o diszk-blokk c��m�et tartalmazza.
A 13-b�ol a 12-edik egy �un. k�etszeres indirekt blokk-c��m (double indirect address):
az a blokk, amelyet ez a k�etszeres indirekt blokk-c��m megc��mez mind egyszeres indirekt
c��meket tartalmaz - ezek szerkezete olyan, mint azt az el}obb le��rtam.
A 13-adik pedig egy h�aromszoros indirekt blokk-c��m (triple indirect): az ez �altal
megc��mzett blokk 1024/n darab k�etszeres indirekt blokk- c��met tartalmaz. (Ha egy
f�ajl hossza mondjuk 4567 byte, akkor csak az els}o 5 direkt c��m van kit�oltve "�ert�ekes"
inform�aci�okkal. A t�obbi helyen mindegy mi van.)
30 FEJEZET 2. A UNIX OPER�ACI �OS RENDSZER
2.5 A UNIX shelljei
A UNIX-ban (az MS-DOS-hoz hasonl�oan) t�obbfajta shell lehet, �es minden egyes fel-
haszn�al�o a rendelkez�esre �all�o shellek k�oz�ul v�alaszthat egyet mag�anak, amit majd
haszn�alni fog. Jelenleg a legelterjedtebb shellek a k�ovetkez}ok: Bourne-shell (ez min-
den UNIX rendszerben megtal�alhat�o); C-shell (ezt a shell m�ar kevesebben haszn�alj�ak); a
Korn-shell pedig a leg�ujabb shell, ami a Bourne-shell kiterjeszt�es�enek tekinthet}o (azzal
kompatibilis).
A UNIX shelljei programozhat�ok (mint p�eld�aul a nagy IBM g�epek shellje, a REXX),
a shell "programnyelve" a legink�abb a C nyelvhez hasonl��t. Hat�ekonys�ag�at mutatja, hogy
adatb�aziskezel}o rendszereket is ��rtak m�ar benne (ehhez egy�eb "szabv�anyos" utilityket is
felhaszn�alva, mint p�eld�aul az awk - a shell �onmag�aban nem volt ehhez el�eg).
2.6 V�edelem a UNIX oper�aci�os rendszerben
A UNIX rendszer v�edelmi rendszere el�eg j�o. A rendszerbe bejelentkezni minden fel-
haszn�al�o csak a jelszav�aval tud. A UNIX megv�edi az egyik felhaszn�al�o fut�o programjait
egy m�asik felhaszn�al�o illeg�alis beavatkoz�asa el}ol (vagyis nem tudom a tan�ar programj�at
"kil}oni"). M�asr�eszt pedig lehet}os�eg a f�ajlok v�edelm�ere a jogosulatlan hozz�af�er�esek el}ol.
A UNIX v�edelmi koncepci�oj�ahoz hozz�atartozik az is, hogy van egy �un. szuperfelhaszn�al�o
(legt�obbsz�or }o a "rendszergazda" - a root), aki majdnem minden v�edelmi korl�atot
megs�erthet, mindenkinek a f�ajljaihoz hozz�af�erhet. (Erre sz�uks�eg is van, k�ul�onben nem
tudna a rendszerben lev}o f�ajlokr�ol biztons�agi m�asolatokat k�esz��teni. Ha nem k�esz�uln�enek
biztons�agi m�asolatok, akkor egy rendszerhiba eset�en lehet, hogy egyes felhaszn�al�oknak
nagyon sok �ert�ekes munk�aja veszne el.) (Most m�ar �erthet}o, hogy mi�ert pr�ob�alj�ak meg
p�eld�aul az egyetemeken a hallgat�ok a szuperfelhaszn�al�o jelszav�at kital�alni.)
A UNIX ellen}orizhet}o m�odon lehet}os�eget ad arra, hogy egy felhaszn�al�o valamely m�as
felhaszn�al�o jogaival rendelkez}o folyamatot elind��tson. Ennek eszk�oze a setuid bit. Ez
azt jelenti, hogy ha egy v�egrehajthat�o program el van l�atva a setuid bittel, akkor a pro-
gram v�egrehajt�asa alatt nem a saj�at uid-�unknek megfelel}o jogaink vannak, hanem annak
a felhaszn�al�onak a jogaival rendelkez�unk, aki�e a program (az lesz a folyamat e�ektiv
user-id-je). Ezzel nagyon �ovatosan kell b�anni! K�ul�on�osen vesz�elyesek lehet az, ha egy
program �un. setuid root program, vagyis ha valaki ezt a programot v�egrehajtja, akkor a
v�egrehajt�as ideje alatt a szuperfelhaszn�al�o jogaival rendelkezik. Ilyen setuid root program
p�eld�aul a passwd, amellyel b�armelyik felhaszn�al�o megv�altoztathatja a saj�at jelszav�at. A
programnak a szuperfelhaszn�al�oi jogok az�ert kellenek, hogy a jelsz�of�ajlt (/etc/passwd)
meg tudja v�altoztatni. A setuid bites programokat a k�ovetkez}ok�eppen lehet felismerni:
az ls -l parancs �altal kiadott directory-list�aban a program tulajdonos�ara vonatkoz�o rwx
bitek x bet}uje hely�en egy s bet}u �all (pl. rws--x--x). K�es}obb m�eg lesz sz�o r�ola, hogy
milyen eszk�oz�okkel lehet viszonylag "biztons�agos" setuid root programokat ��rni.
Az IPC eszk�oz�okh�oz is t�arolva van a l�etrehoz�o folyamat felhasz�al�oi azonos��t�oja �es
csoport-azonos��t�oja (uid ill. gid), illetve t�arolva vannak hozz�a a szok�asos rwx-bitek is.
Ez teszi biztons�agoss�a a folyamatok k�oz�otti kommunik�aci�ot.
2.7. A UNIX INPUT/OUTPUT RENDSZERE 31
2.7 A UNIX INPUT/OUTPUT rendszere
A UNIX a hardver berendez�esekkel a device driverek seg��ts�eg�evel kommunik�al (ott van
"elrejtve" az oper�aci�os rendszer g�epf�ugg}o, hardver-f�ugg}o r�esze). A device driverek nem
illeszthet}ok be olyan dinamikusan egy hagyom�anyos UNIX rendszerbe, mint ahogyan
az az MS-DOS alatt megy (a CONFIG.SYS f�ajlon kereszt�ul), �es a device driverek nem
olyan fel�ep��t�es}uek, mint mondjuk a DOS megfelel}oik (egy UNIX device drivernek m�as
szolg�altat�asokat kell ny�ujtania, mint egy DOS device drivernek). Azt �erdemes tudni, hogy
egyik PC-s UNIX sem haszn�alja a BIOS-t, mert a BIOS rutinok �ugy vannak meg��rva,
hogy v�arnak az I/O m}uvelet befejez}od�es�eig, �es csak ezut�an adj�ak vissza a vez�erl�est az
oper�aci�os rendszernek, ami egy multiprogramozott oper�aci�os rendszerben elfogadhatat-
lan.
A device drivereket a UNIX kernel t�obbi r�esz�evel �ossze kell linkelni (itt most a
linkage editorra gondoljunk, ne a f�ajlrendszer linkjeire). A device driverek bizonyos
szolg�altat�asokat ny�ujtanak a kernelnek (pl. minden device drivernek lehet egy olyan ruti-
nja, amelyet a r�a vonatkoz�o open()-n�el kell megh��vni : : : ). Ezek a rutinok egy az eg�esz
kernelre n�ezve glob�alis t�ombben vannak felsorolva. Egy device driver szolg�altat�asainek
ezen t�ombbeli index�et nevezik a devicehoz tartoz�o major device numbernek. (L�enyeg�eben
ezen kereszt�ul lehet a device drivereket egym�ast�ol megk�ul�onb�oztetni.)
Minden device driver kezelhet t�obb (egym�ast�ol ak�ar f�uggetlen ak�ar nem f�uggetlen)
perif�eri�at is, amiket az �un. minor device numberekkel k�ul�onb�oztethet meg egym�ast�ol.
(Egy speci�alis f�ajlhoz tartoz�o az i-nodeban a 13 blokk- c��m hely�en van t�obbek k�ozt
a minor ill. major device number t�arolva.) Amikor egy speci�alis f�ajlt megnyitunk a
f�ajlrendszerben t�arolt neve alapj�an, akkor az oper�aci�os rendszer az i-node alapj�an tudja,
hogy az egy speci�alis f�ajl, megszerzi az i-nodeb�ol a major ill. minor device numbereket, �es
a device driver open() szolg�altat�as�at v�egz}o rutint megh��vja (t�obbek k�ozt a minor device
numberrel mint param�eterrel).
A device driverek l�enyeg�eben h�arom csoportba sorolhat�oak: a karakteres interface-t
ny�ujt�oak, a blokk-interfacet ny�ujt�oak �es a STREAMS driverek.
2.7.1 A UNIX architektur�aj�anak moderniz�al�asa
A UNIX oper�aci�os rendszer egy monolitikus rendszer: van ugyan j�o n�eh�any logikailag
egym�ast�ol elk�ul�on��thet}o komponense, de a jelenlegi struktur�aban m�eg akadnak probl�em�ak
az �uj hardware-re t�ort�en}o �at��r�askor. A Carnegie Mellon egyetemen az ut�obbi �evekben
legink�abb azzal foglalkoztak, hogy hogyan lehetne a UNIX-ot (}ok a k��s�erletez�eseikre a
Berkeley UNIX 4.3BSD v�altozat�at haszn�alt�ak) g�epf�ugg}o illetve g�epf�uggetlen r�eszekre
bontani. E munka eredm�enyek�ent j�ott l�etre a Mach mikrokernel, amely a m�odos��tott
Berkeley UNIX "g�epf�ugg}o" r�eszeib}ol lett kifejlesztve. A Mach-ot is egy oper�aci�os rend-
szerr�e alak��tott�ak: a UNIX "g�epf�uggetlen" r�esz�et �ugy ��rt�ak �at, hogy az a Mach oper�aci�os
rendszer szolg�altat�asait haszn�alja ki ott, ahol valamilyen g�epf�ugg}o szolg�altat�ast kell
elv�egeznie. Az ��gy elk�esz�ult rendszer teljesen kompatibilis az eredeti Berkeley UNIX-
szal (��gy bin�aris kompatibilit�ast is el tudtak �erni, vagyis a r�egebbi 4.3BSD-n meg��rt pro-
gramokat �ujra se kell ford��tani ahhoz, hogy az �uj Mach-alap�u rendszereken haszn�aljuk
}oket).
32 FEJEZET 2. A UNIX OPER�ACI �OS RENDSZER
A Mach mikrokernel szerkezete
Ez a r�esz r�oviden v�azolja a Mach 3 kernel felhaszn�al�oi sz�am�ara ny�ujtott fel�ulet�et.
A Mach rendszert oper�aci�os rendszerek alapj�anak tervezt�ek. Sz�elesk�or}u
lehet}os�egekkel rendelkezik a mem�oriakezel�es ter�en, biztos��tja a folyamatonk�ent (Mach
terminol�ogi�aban taszkonk�ent) t�obb v�egrehajt�asi pont l�etrehoz�as�anak lehet}os�eg�et (angol
nev�en threadek alkalmaz�as�at) �es j�o folyamatok (taszkok) k�ozti kommunik�aci�os eszk�oz�oket
ny�ujt. A Mach alapvet}o jellemz}oi a k�ovetkez}ok:
� Rugalmas mem�oriakezel�esi technik�ak biztos��t�asa a fut�o folyamatoknak.
� Transzparens hozz�af�er�esi lehet}os�eg biztos��t�asa a h�al�ozaton kereszt�ul el�erhet}o
er}oforr�asokhoz, ehhez a megfelel}o kommunik�aci�os m�odszerek biztos��t�asa.
� A kor�abbi szoftver-k�ornyezetekkel val�o kompatibilit�as biztos��t�asa (p�eld�aul a Berke-
ley UNIX rendszerrel).
� Lehet}os�eget kell teremteni min�el magasabbfok�u p�arhuzamos��t�asra mind az
oper�aci�os rendszerben mind pedig az alkalmaz�oi programokban.
A 2.5-�os �es kor�abbi v�altozataiban a Mach rendszert be�agyazt�ak a Berkeley UNIX-ba
�es ��gy biztos��tott�ak a "hagyom�anyos" (UNIX-szer}u) oper�aci�os rendszer szolg�altat�asok j�o
r�esz�et. A 3.0-�as v�altozatt�ol kezdve a Mach m�ar csak alapvet}o kernel szolg�altat�asokat
ny�ujt, nem biztos��tja a kernelbe �agyazva a kor�abbi v�altozatokban megismert sz�elesk�or}u
oper�aci�os rendszer szolg�altat�asokat (mint p�eld�aul a f�ajlkezel�esi oper�aci�os rendszer
szolg�altat�asokat). Itt az oper�aci�os rendszer funkcionalit�ast nem a kernelbe �agyazva,
hanem �un. kernelen k��v�ul fut�o szerverekkel biztos��tj�ak.
Term�eszetesen a taszkok kommunik�aci�oj�an k��v�ul vannak m�as szolg�altat�asok is, amiket
a kernelnek kell biztos��tania { ilyenek p�eld�aul a k�ovetkez}ok:
� A taszkok �es v�egrehajt�asi pontjaik (threadek) kezel�ese.
� A taszkok virtu�alis mem�ori�aj�anak biztos��t�asa �es kezel�ese.
� Hardware perif�eri�ak kezel�ese (p�eld�aul a processzorok, perif�eri�ak �es az �ora),
valamint egy magasabbszint}u hardware-interf�esz biztos��t�asa az oper�aci�os rendszer
szolg�altat�asokat biztos��t�o taszkok fel�e.
2.7. A UNIX INPUT/OUTPUT RENDSZERE 33
A Mach kernel absztrakci�oi: B�ar a Mach kernel tervez�esekor c�el volt a kernel
�altal biztos��tott absztrakci�os eszk�oz�ok sz�am�anak cs�okkent�ese, nem volt c�el az ezen
eszk�oz�ok �altal biztos��tott lehet}os�egek sz}uken tart�asa. A legfontosabb kernel absztrakci�ok
a k�ovetkez}ok:
� taszk { Er}oforr�asok lefoglal�as�ara k�epes egys�eg (minden taszknak van egy
saj�at mem�oriac��mtartom�anya, �es minden taszkhoz t�arolva vannak a taszk port-
hozz�af�er�esi jogosults�agai is).
� thread { Programv�egrehajt�asi pont (kicsi az er}oforr�asig�enye).
� port {
Kommunik�aci�os csatorna, hozz�af�er�es csak megfelel}o adatk�uld�esi/adatfogad�asi jo-
gon kereszt�ul lehets�eges.
� �uzenet { Adatobjektumok gy}ujtem�enye.
� mem�oria objektum { A mem�oriakezel�es bels}o egys�ege (ezeken kereszt�ul
vez�erelhetik az egyes taszkok a mem�oriakezel�est).
Taszkok �es threadek: Mivel minden oper�aci�os rendszer nyilv�antart bizonyos in-
form�aci�okat a folyamatokr�ol,mint p�eld�aul a futtat�o felhaszn�al�o azonos��t�oj�at, signalkezel�H
ok1 �allapot�at, �es ez a folyamat absztrakci�o oper�aci�os rendszerenk�ent m�as �es m�as, ez�ert a
Mach kernel (a 3.0-�as v�altozatt�ol kezdve) nem biztos��tja a m�as oper�aci�os rendszerekben
megtal�alhat�o folyamat fogalmat, a Mach folyamat fogalma sokkal primit��vebb.
Egy taszk �osszes threadje hozz�af�er a taszk �osszes er}oforr�as�ahoz. K�et taszknak
alap�ertelmez�es szerint nincsenek k�oz�os er}oforr�asaik (b�ar lehetnek k�oz�os er}oforr�asaik,
ehhez azonban a taszkoknak gondoskodniuk kell arr�ol, hogy a k�oz�os hozz�af�er�es}u
er}oforr�asok mindkett}oj�ukben el�erhet}ok legyenek { ehhez a Mach kernel biztos��t nem t�ul
bonyolultan haszn�alhat�o mechanizmusokat).
Egy thread kis r�aford��t�assal l�etrehozhat�o, m}uk�od�es�ehez kev�es er}oforr�asra van sz�uks�ege
(ez az�ert van ��gy, mert a threadhez tartoz�o bels}o �allapot minim�alis { altal�aban a pro-
cesszor regiszterk�eszlete { �es az �altala el�ert er}oforr�asok kezel�es�et az }ot tartalmaz�o taszk
v�egzi). Egy multiprocesszoros rendszerben egy taszknak egyidej}uleg t�obb threadje is
v�egrehajt�odhat.
A Mach mem�oriakezel�ese: A Mach kernel biztos��tja a nagy, nem felt�etlen�ul
�osszef�ugg}o mem�oria kezel�es�ehez sz�uks�eges mechanizmusokat. Minden taszk rendelkezik
egy kernel �altal manipul�alt c��mt�erk�eppel, amely vez�erli a virtu�alis mem�oriac��mek �zikai
mem�oriac��mekre t�ort�en}o lek�epez�es�et. Mint az a virtu�alis mem�ori�at biztos��t�o rendszerek
nagy r�esz�ere jellemz}o, a taszkok virtu�alis c��mtartom�any�anak mindig van egy-egy r�esze,
amely nincs benn a �zikai mem�ori�aban egy-egy adott id}opillanatban, ez�ert kell valamilyen
mechanizmus a �zikai mem�ori�anak a taszkok virtu�alis c��mtartom�any�anak a cache-el�es�ere
val�o haszn�alat�ara (�es val�osz��n}uleg ez a Mach-ban megjelen}o egyik legnagyobb �otlet).
Nem �ugy, mint m�as virtu�alis mem�ori�at kezel}o rendszerek, a Mach kernel nem imple-
ment�alja ennek a cache-el�esnek az �osszes r�eszlet�et, ehelyett lehet}os�eget ny�ujt felhaszn�al�o
�altal k�esz��tett taszkoknak arra, hogy e cache-el�es egyes r�eszleteit megval�os��ts�ak.
1Kiv�eteles esem�enyek kezel�es�e�ert felel}os elj�ar�asok.
34 FEJEZET 2. A UNIX OPER�ACI �OS RENDSZER
Egy taszk allok�alhat �uj mem�oriater�uleteket, deallok�alhat mem�oriater�uleteket �es
m�odos��thatja a r�ajuk vonatkoz�o v�edelmi inform�aci�okat. Ezenk��v�ul egy taszk
meghat�arozhatja az egyes mem�oriar�eszeinek az �or�okl�esi jellemz}oit is. Egy �uj
taszk l�etrehoz�asakor mindig ki kell jel�olni egy m�ar meglev}o taszkot, amelyet az �uj
taszk mem�oriaszerkezet�enek kialak��t�asakor az oper�aci�os rendszer mint�anak fog tekin-
teni. Ilyenkor a meglev}o (mintak�ent haszn�aland�o) taszkban lev}o egyes mem�oriar�eszek
�or�okl�esi jellemz}oi hat�arozz�ak meg azt, hogy az �ujonnan l�etrehozott taszkban a megfelel}o
mem�oriar�esz de�ni�alt legyen-e, illetve amennyiben azt a r�eszt az �uj taszk �or�okli, akkor a
sz�ul}otaszkkal egy k�oz�os, megosztott mem�oriater�uletk�ent haszn�alja azt, vagy pedig saj�at
p�eld�anyt kell, hogy kapjon.
A Mach rendszerben a legt�obb mem�oriam�asol�asi m}uvelet copy-on-write m�odszerrel
van optimaliz�alva: a m�asoland�o mem�oriar�eszek tartalma nem lesz egyb}ol lem�asolva,
hanem m�asol�as ut�an a hazn�al�ok a k�et p�eld�anyt "��r�asv�edetten" ugyan, de k�oz�osen
haszn�alj�ak tov�abb. Ha b�armelyik haszn�al�o megpr�ob�alja a k�oz�osen haszn�alt "��r�asv�edett"
mem�oriar�esz tartalm�at m�odos��tani, akkor a megfelel}o r�esz t�enyleges lem�asol�as�ara
a m�odos��t�as pillanat�aban ker�ul sor. Ez a k�esleltetett mem�oriam�asol�as egy fontos
hat�ekonys�agot n�ovel}o optimaliz�aci�o a Mach kernelben.
B�armely mem�oriar�esz m�og�ott van egy-egy mem�oria objektum. Egy mem�oria-
kezel}o taszk biztos��tja a (�zikai) mem�ori�aban lev}o lapok tartalma �es az ugyanehhez
az inform�aci�otartalomhoz tartoz�o, nem a �zikai mem�ori�aban t�arolt inform�aci�o (egy ab-
sztrakt mem�oria objektum) k�ozti kapcsolatot, konverzi�ot. A Mach kernel tartalmaz
egy alap�ertelmez�esk�ent haszn�alhat�o mem�oria-kezel}ot, amely olyan mem�oria objektumok
l�etrehoz�as�at biztos��tja, amelyek kezdetben nulla k�od�u �ert�ekekkel vannak felt�oltve, �es a
rendszer lapoz�asi ter�ulet�ere lesznek sz�uks�eg eset�en kilapozva.
Taszkok k�ozti kommunik�aci�o: A taszkok k�oz�otti kommunik�aci�o a Mach
eszk�ozt�ar�anak egy nagyon fontos elem�et alkotja. A Mach egy kliens/szerver alap�u
rendszerstrukt�ur�at felt�etelez, ahol egyes taszkok (kliensekk�ent) m�as taszkok (szerverek)
szolg�altat�asait �erhetik el a az }oket �osszek�ot}o kommunik�aci�os csatorn�an kereszt�ul k�uld�ott
�uzenetek seg��ts�eg�evel. Mivel a Mach kernel �onmag�aban kev�es szolg�altat�ast ny�ujt (p�eld�aul
a f�ajlkezel�esi szolg�altat�as sem r�esze), ez�ert egy "�atlagos" Mach taszk sok m�as taszkkal
kell, hogy kommunik�aljon annak �erdek�eben, hogy hozz�af�erjen a sz�am�ara sz�uks�eges
szolg�altat�asokhoz. A taszkok k�oz�otti kommunik�aci�o kommunik�aci�os csatorn�aj�at portnak
nevezik. Egy port egy egyir�any�u csatorna, amelyen lehet kor�atos mennyis�eg}u �uzenet.
Egy �uzenet tartalmazhat adatokat, mem�oriar�eszeket �es portok hozz�af�er�esi jogait. Egy
port hozz�af�er�esi joga egy n�ev, amellyel az adott taszk a porthoz val�o hozz�af�er�esi jogo-
sults�ag�at azonos��tja (a Mach kernellel szemben). Egy taszk csak akkor f�erhet hozz�a egy
porthoz, ha a portra vonatkoz�oan a megfelel}o hozz�af�er�esi jogokkal rendelkezik. Egy adott
portra vonatkoz�oan csak egyetlen taszknak lehet olvas�asi joga. Ez az egy taszk jogosult
a portra k�uld�ott �uzenetek feldolgoz�as�ara (beolvas�as�ara). Egyidej}uleg egy adott portra
vonatkoz�oan t�obb taszknak is lehet adatk�uld�esi joga, amivel lehet}os�eg�uk van az adott por-
tra �uzenetek k�uld�es�ere. K�et taszk kommunik�aci�ojakor a k�uld}o az elk�uldend}o adatokb�ol
fel�ep��t egy �uzenetet, �es egy �uzenetk�uld�esi m}uveletet hajt v�egre egy olyan porton, amelyre
adatk�uld�esi joggal rendelkezik. K�es}obb az a taszk, amelynek erre a portra vonatkoz�oan
olvas�asi joga van, v�egrehajt egy �uzenetolvas�asi m}uveletet. Megjegyezz�uk, hogy ez az
�uzenet�atvitel egy aszinkron m}uvelet. Az �uzenet �atm�asol�asa �altal�aban a kor�abban is
eml��tett copy-on-write optimaliz�aci�os technik�aval t�ort�enik.
2.8. K�ERD�ESEK, FELADATOK 35
UNIX implement�aci�oja a Machon
A UNIX Mach rendszeren val�o implement�al�asa m�og�otti alap�otletet m�ar l�attuk: sz�et kell
szedni a hagyom�anyos UNIX-ot egy g�pef�uggetlen �es egy g�epf�ugg}o r�eszre, �es ezut�an a
g�epf�uggetlen (kisebb) r�esz �atvitele ut�an az oper�aci�os rendszer tov�abbi komponenseinek a
leford��t�asa m�ar sokkal egyszer}ubb.
Az ut�obbi �evekben m�ar nemcsak a Carnegie Mellon-on dolgoznak ezen a projek-
ten, hanem a vil�agon sokfel�e. Egyre t�obb oper�aci�os rendszert m�odos��tanak �ugy, hogy
a g�epf�ugg}o r�eszeiket Mach szolg�altat�asok v�egrehajt�as�ara cser�elik, ��gy azoknak a hor-
dozhat�os�aga is megn}o. Jelenleg m�ar a Linux oper�aci�os rendszernek is k�esz�ul a Mach-
feletti v�altozata.
A Mach-alap�u oper�aci�os rendszerek szerkezet�uk alapj�an k�et csoportba sorolhat�ok: az
egyszerveres �es a t�obbszerveres implement�aci�ok csoportj�ara. Az egyszerveres imple-
ment�aci�ok (ilyen lesz p�eld�aul a Mach-alap�u Linux, �es ilyen a m�ar elk�esz�ult Mach-alap�u
4.3BSD) a UNIX "g�epf�uggetlen" funkcionalit�as�at egyetlen programban "monolitikusan"
implement�alja. Ezzel szemben a t�obbszerveres implement�aci�ok (ilyen lesz p�eld�aul a GNU
Hurd oper�aci�os rendszere) t�obb program (�un. szolg�altat�o program, szerver) seg��ts�eg�evel
val�os��tj�ak meg a UNIX funkcionalit�ast: itt p�eld�aul lehet, hogy k�ul�on program foglalkozik
a f�ajlrendszerrel, k�ul�on program a mem�oriakezel�essel, k�ul�on program v�egzi a felhaszn�al�ok
igazol�as�at, a perif�eriakezel�est, stb.
2.8 K�erd�esek, feladatok
1. Mi alapj�an k�ul�onb�ozteti meg a UNIX az abszol�ut �es a relat��v pathname-eket.
2. Ismertesse a UNIX f�ajlrendszer�enek a bels}o szerkezet�et!
3. Milyen esetben mi a �esszer}ubb az 512 byteos diszk-blokk v�alaszt�as, mint az 1024
byteos blokkok? Mi�ert?
4. Milyen inform�aci�ok ker�ulhetnek bele a UNIX rendszer processz-t�abl�aj�aba?
5. Hogyan val�os��that�o meg az �utemez}o az Intel 8088 mikroprocesszoron? s az Intel
80386-on?
6. Mit jelentenek a k�ovetkez}o fogalmak?
� id}oszelet
� rwx-bitek
� szuperfelhaszn�al�o
� speci�alis f�ajl
� f�ajl-attrib�utum
� i-node
� i-node-ra mutat�o link
� setuid bit
� single indirect
� major device number
36 FEJEZET 2. A UNIX OPER�ACI �OS RENDSZER
� minor device number
7. Pista (uid=234; gid=17) ��rt egy levelet, �es a k�ovetkez}o �ert�ekekre �all��totta a levelet
tartalmaz�o f�ajl v�edelmi bitjeit: rwxr|{. (A - jel azt jelenti, hogy az ott lev}o jog
nincs megadva.) El tudja-e ezt a levelet olvasni Mariska (uid=252; gid=17)? s
Zsolt (uid=756; gid=50) el tudja olvasni?
8. Mi a pipe?
9. Sok programoz�o osztott mem�oria haszn�alat�aval szimul�alja az �uzenet�atad�ast, mivel
az gyorsabb megold�asnak t}unik. T�enyleg gyorsabb? Vagy nem felt�etlen�ul?
10. A hierarchikus directoryszerkezetet �abr�azolni lehet egy a gy�ok�er-directoryb�ol kiin-
dul�o fastruktur�aval. Mi a helyzet, ha bej�onnek a UNIX-ban megismert LINK-ek?
Ekkor milyen gr�a�al lehetne hasonl�o m�odon jellemezni a f�ajlrendszert?
Fejezet 3
Rendszerh��v�asok
Az oper�aci�os rendszerek a felhaszn�al�oi programok el}ol eltakarj�ak a g�ephez kapcsolt
"nyers" hardver r�eszleteket, �es a programoz�onak ��gy k�enyelmes programfejleszt�esi
k�ornyezetet biztos��t�anak. S}ot a legt�obb komoly rendszerben az oper�aci�os rendszer nem
is engedi meg, hogy az "�atlagos" felhaszn�al�ok beleturk�aljanak a rendszer lelkivil�ag�aba
(p�eld�aul a UNIX rendszerben sincs mindenkinek megengedve az, hogy a oppy-diszkhez
tartoz�o speci�alis f�ajlt megnyissa �es haszn�alja). Ehelyett az oper�aci�os rendszer �un.
szolg�altat�asokat ny�ujt a programoknak. Ilyen szolg�altat�as p�eld�aul egy adott nev}u f�ajl
megnyit�asa, egy adott f�ajlb�ol karakterek olvas�asa, illetve f�ajlba karakterek ��r�asa, stb ...
Ezeket a szolg�altat�asokat a programok (a szolg�altat�asok (ki)haszn�al�oi) �un. rendsz-
erh��v�asokon kereszt�ul �erhetik el. Ezt �ugy kell �erteni, hogy minden felhaszn�al�oi program a
processzor felhaszn�al�oi �uzemm�odj�aban fut, sz�amol, ciklust szervez, stb ... Ha valamiolyan
m}uveletet akar v�egrehajtani, amely esetleg m�as fut�o programokat megzavarna (p�eld�aul
ilyenek a f�ajlm}uveletek), akkor meg kell k�ernie az oper�aci�os rendszert, hogy hajtsa v�egre
neki a k�ert m}uveletet. Az oper�aci�os rendszer ellen}orizheti, hogy a felhaszn�al�onak van-e
joga ahhoz, amit k�ert, �es ha nincs, akkor a rendszerh��v�ast visszautas��thatja. Ha pedig a
felhaszn�al�onak jogosults�aga van az adott m}uvelet v�egrehajt�as�ara (p�eld�aul egy winchester
formatt�al�as�ara), akkor az oper�aci�os rendszer a k�ert szolg�altat�ast elv�egzi. Ilyen m�odon
tudja az oper�aci�os rendszer az els}o fejezetben eml��tett feladat�at, a hardver er}oforr�asok
v�edelm�et �es eloszt�as�at helyesen ell�atni.
A k�ovetkez}okben egy m}uk�od}o oper�aci�os rendszer (a UNIX) rendszerh��v�asain kereszt�ul
lesz bemutatva az, hogy milyen eszk�oz�ok �allnak a programoz�o rendelkez�es�ere. A UNIX
rendszerh��v�asainak csak egy nagyon sz}uk r�eszhalmaza lesz bemutatva - f}oleg azok, ame-
lyek "k�oz�osek" minden UNIX-ban (a 7-es v�altozatt�ol kezdve). A rendszerh��v�asok itt is a
m�ar kor�abban eml��tett szempontok szerint lesznek csoportos��tva.
A rendszerh��v�asokr�ol m�eg annyit �erdemes megjegyezni, hogy egy eg�esz t��pus�u �ert�ek
a visszat�er�esi �ert�ek�uk, �es a negat��v visszat�er�esi �ert�ek legt�obbsz�or a rendszerh��v�as
v�egrehajt�asa alatt fell�ep}o hib�at jelzi, vagy azt, hogy a rendszerh��v�as hiba n�elk�ul le-
futott. Hiba eset�en az errno eg�esz t��pus�u glob�alis v�altoz�o t�arolja a hiba ok�at: min-
den egyes hibafajt�at egy-egy eg�esz sz�am azonos��t, �es az errno v�altoz�oban az �eppen
v�egrehajtott rendszerh��v�as sikertelens�eg�et okoz�o hiba k�odja van. Ezt a hibak�odot ki��rni
(a hozz�a tartoz�o szok�asos angol nyelv}u sz�ovegekkel) a perror k�onyvt�ari rutinnal lehet
(ez nem rendszerh��v�as!). (Az errno-beli hibak�odok egy errno.h include f�ajlban vannak
"olvashat�o" form�aban: ugyanis ott vannak C nyelv}u makr�ode�n��ci�okkal a hibak�odoknak
megfelel}o "standard" konstansok megadva. Ez egy�ebk�ent is jellemz}o a UNIX-ra �es m�as
37
38 FEJEZET 3. RENDSZERH��V�ASOK
rendszerekre is, hogy bizonyos konstansoknak szimbolikus megfelel}oit belerakj�ak a C
k�onyvt�arba vagy header-f�ajlokba. Ez az�ert j�o, mert a programk�od ezek haszn�alat�aval
olvashat�obb lesz, �es ha esetleg a konstanst megv�altoztatj�ak (vagyis azt, amit az oper�aci�os
rendszer v�ar), akkor minden programban megkeresni �es �at��rni ... az nagyon nagy munka
lenne). Ilyen konstansokat (�un. manifest-konstansokat) ebben a le��r�asban is k�ul�on eml��t�es
n�elk�ul fogok haszn�alni. Az egyes rendszerh��v�asokhoz tartoz�o referencia k�ezik�onyv lapok
(amit a UNIX man parancs ki��r) tartalmazz�ak azokat a header-f�ajlokat, amelyek az ott
haszn�alhat�o manifest-konstansokat (... makr�okat) de�ni�alj�ak.
3.1 Folyamatokat kezel}o rendszerh��v�asok
A folyamatokat kezel}o rendszerh��v�asok a k�ovetkez}ok: fork(), exec(), exit(), wait(),
getpid(), getppid(), setpgrp() �es nice(). A fork() rendszerh��v�assal lehet egy �uj
folyamatot l�etrehozni. A l�etrehozott gyermek-folyamat a sz�ul}o-folyamat pontos m�asolata
lesz, vagyis a gyermek-folyamat a sz�ul}o-folyamat majdnem minden jellemz}oj�et �or�okli (a
pid-et p�eld�aul nem!). A gyermek- �es a sz�ul}o-folyamat egym�assal p�arhuzamosan fognak
futni. A fork() rendszerh��v�as C nyelvben egy int t��pus�u �ert�ekkel t�er vissza, �es ez az, ami
alapj�an meg lehet k�ul�onb�oztetni, hogy melyik a sz�ul}o- ill. melyik a gyermek-folyamat.
A gyermek-folyamatban a visszat�er�esi �ert�ek: 0, m��g a sz�ul}o-folyamatban a visszat�er�esi
�ert�ek egyenl}o a gyermek-folyamat pid-j�evel. Negat��v visszat�er�esi �ert�ek a rendszerh��v�as
sikertelens�eg�et jelzi (a hiba oka lehet p�eld�aul az, hogy nem volt el�eg mem�oria a gyermek-
folyamat l�etrehoz�as�ahoz). A fork() a k�ovetkez}o form�aban fordul el}o a leggyakrabban:
valtozo=fork(); /* Megszuljuk a gyermeket ... */
if (valtozo < 0) {
/* Hibauzenet kiirasa, a sikertelen rendszerhivasrol! */
} else {
if (valtozo == 0) {
... /* A gyermek ezt csinalja ... */
} else {
... /* A szulo pedig ezt ... */
}
}
Mi az, amit a gyermek-folyamat fork ut�an a sz�ul}ot}ol �or�ok�ol?
� A folyamatot futtat�o felhaszn�al�ora vonatkoz�o inform�aci�okat (a futtat�o felhaszn�al�o
azonos��t�oj�at, a futtat�o felhaszn�al�o csoportj�anak az azonos��t�oj�at)
� E�ektiv user id-et (ha a program setuid bites, akkor ez elt�erhet a programot futtat�o
felhaszn�al�o azonos��t�oj�at�ol)
� E�ektiv csoport azonos��t�ot
� Folyamat-csoport azonos��t�oj�at
� Munkadirectory
� Signal-kezel}o elj�ar�asok
3.1. FOLYAMATOKAT KEZEL }O RENDSZERH��V �ASOK 39
� umask �ert�eket (ld. k�es}obb)
Mi az, ami a fork ut�an elt�er a sz�ul}o �es a gyermek k�oz�ott?
� Folyamat-azonos��t�o
� Sz�ul}o folyamat azonos��t�oja
� A gyermek folyamatnak saj�at m�asolata van a sz�ul}o folyamat f�ajldeszkriptorjair�ol
� Ha a sz�ul}o valamikorra egy ALARM signalt k�ert, azt a gyermek nem fogja
megkapni.
A leggyakrabban a gyermek-folyamatnak a sz�ul}o feladat�at�ol teljesen elt�er}o dolgot kell
csin�alnia, p�eld�aul egy m�asik f�ajlban t�arolt programot kell v�egrehajtania. Erre val�o az
exec rendszerh��v�as, amely a UNIX kernelnek tal�an a legbonyolultabb rendszerh��v�asa.
Az exec t�obb k�ul�onb�oz}o form�aban �erhet}o el, itt az execle() h��v�as lesz bemutatva.
Amikor egy C nyelv}u programot az oper�aci�os rendszer shellj�eb}ol elind��tunk, akkor a shell-
parancsk�ent beadott programn�ev ut�an ��rt egy�eb programparam�eterek hogyan lesznek a
programb�ol el�erhet}ok. A C program f}o-elj�ar�as�at a k�ovetkez}o m�odon kell deklar�alni:
main(argc, argv, envp)
int argc;
char **argv, **envp;
A program ezut�an a h��v�askor megadott param�eterek darabsz�am�at az argc
param�eteren kereszt�ul tudja megkapni, maguk a param�eterek pedig az argv (karak-
teres t�omb) v�altoz�on kereszt�ul �erhet}ok el. Az envp karakter t�omb a shell-v�altoz�okat
tartalmazza. Az mindig igaz, hogy argc > 0, �es az argv[0] nem �ures, mert a nulladik
parancs-param�eter az maga a beadott parancsn�ev szokott lenni. P�elda az execle()
h��v�asra:
r=execle("/bin/ls","ls","-l","alma.c",(char *)0, envp);
Az els}o param�eter a v�egrehajtand�o bin�aris program f�ajlnev�et tartalmazza. A
k�ovetkez}o param�eter mag�anak a parancsnak a nev�et tartalmazza (ez nem kell, de ��gy
szok�as), a harmadik �es a negyedik param�eter a v�egrehajtand�o parancs egy�eb param�etereit
tartalmazza. A (char *)0 a programnak �atadand�o param�eter-felsorol�as v�eg�et jelzi. Az
utols�o (envp) param�eter az �uj programnak �atadand�o shell-v�altoz�okra mutat.
Az exec() rendszerh��v�asok v�egrehajt�asukkor ellen}orzik, hogy a v�egrehajtand�o f�ajl rwx-
bitjei k�oz�ul az x-bit be van-e �all��tva, az �uj folyamat bef�er-e m�eg a mem�ori�aba. Ha a
fenti felt�etelek nem teljes�ulnek, akkor az exec rendszerh��v�as sikertelen lesz (ez�ert kell
�gyelni az exec rendszerh��v�as visszat�er�esi �ert�ek�et). (Az exec rendszerh��v�as nem z�arja le
automatikusan a kor�abban haszn�alt f�ajlokat! A megnyitott f�ajlokat az �ujabb, exec-elt
program tov�abb haszn�alhatja.)
Ha egy sz�ul}o-folyamat megsz�ul egy gyermek-folyamatot, majd a gyermek elv�egzi
a feladat�at, akkor a gyermeknek meg kell h��vnia az exit() rendszerh��v�ast. Az exit
rendszerh��v�asnak egyetlen param�etere van, egy 0 �es 255 k�oz�e es}o eg�esz sz�am, az �un.
exit-st�atusz. A sz�ul}o folyamat lek�erdezheti a gyermek-folyamat exit-st�atusz�at, �es
ebb}ol p�eld�aul arra k�ovetkeztethet, hogy a gyermek-folyamat milyen eredm�ennyel tudta
40 FEJEZET 3. RENDSZERH��V�ASOK
a feladat�at ell�atni. A sz�ul}o-folyamat a gyermek- folyamat befejez}od�es�ere a wait() rend-
szerh��v�as seg��ts�eg�evel v�arakozhat. A wait() rendszerh��v�as egyetlen param�etere egy eg�esz
t��pus�u v�altoz�ora mutat, �es a rendszerh��v�as v�egrehajt�asa ut�an a befejez}od�ott gyermek-
folyamat exit-st�atusza ker�ul a megadott v�altoz�o magasabb helyi�ert�ek}u bytej�aba. Ha a
gyermek-folyamat v�egrehajtotta az exit() rendszerh��v�ast, a sz�ul}o pedig m�eg nem adta
ki a wait rendszerh��v�ast, akkor a gyermek-folyamat �altal�aban �un. zombie-processz
lesz, vagyis az �altala lefoglalt mem�oria felszabadul, de a processz-t�abl�aban m�eg foglalja a
helyet. (Ha egy sz�ul}o-folyamat nem hajt v�egre egyetlen wait()-et sem, akkor el}obb- ut�obb
betelhet a processz-t�abla, �es a rendszer nem lesz k�epes �ujabb folyamatokat elind��tani.)
A fenti rendszerh��v�asokat p�eld�aul a k�ovetkez}ok�eppen haszn�alhatjuk:
main(argc, argv, envp)
int argc;
char **argv, **envp;
{
int eredm;
/*
.
.
.
*/
if (fork() == 0) {
execle("/bin/ls","ls","-l",(char *)0,envp);
} else {
wait(&eredm);
}
}
A fenti program elind��t egy gyermek-folyamatot, amely v�egrehajtja a UNIX ls
parancs�at, �es a sz�ul}o megv�arja, am��g a gyermek-folyamat befejez}odik. L�enyeg�eben a
UNIX shelljei is ��gy m}uk�odnek (ezt k�es}obb egy r�eszletesebb p�eld�an is megn�ezhetj�uk).
A getpid() �es a getppid() rendszerh��v�asok k�oz�ul az el}obbi az }ot v�egrehajt�o folyamat
pid-j�et, az ut�obbi pedig az }ot v�egrehajt�o folyamat sz�ul}o-folyamat�anaka pid-j�et adja vissza
(mindk�et f�uggv�eny eg�esz t��pus�u �ert�eket ad vissza).
A setpgrp() rendszerh��v�as az }ot v�egrehajt�o folyamat folyamat-csoport azonos��t�oj�at a
folyamat azonos��t�oj�ara (pid-j�ere) �all��tja, �es az �uj folyamat-csoport azonos��t�ot adja vissza.
A folyamat-csoport azonos��t�o az�ert hasznos, mert a kill() rendszerh��v�assal signal-t lehet
k�uldeni egy folyamat-csoport minden egyes tagj�anak (ld. k�es}obb).
A nice() rendszerh��v�assal lehet egy folyamat �utemez�esi priorit�as�at m�odos��tani. Az
alap�ertelmez�es szerinti priorit�asi �ert�ek 20; ezt az �ert�eket n�ovelve cs�okken a folyamat
priorit�asa. A nice() param�eter�eben megadott �ert�eket az oper�aci�os rendszer hozz�aadja
a folyamat priorit�as�ahoz. Negativ param�etert csak szuperfelhaszn�al�o jog�u folyamatokt�ol
fogad el az oper�aci�os rendszer.
3.2. A F �AJLRENDSZER RENDSZERH��V�ASAI 41
3.2 A f�ajlrendszer rendszerh��v�asai
A f�ajlrendszer-kezel}o rendszerh��v�asok a k�ovetkez}ok: access(), creat(), open(),
close(), read(), write(), lseek(), stat(), fstat(), dup(), pipe(), link(),
unlink(), mount(), umount(), sync(), chdir(), mkdir() �es az rmdir(). Fontos
megeml��teni, hogy ezek a rendszerh��v�asok nem azonosak a C szabv�anyos I/O k�onyvt�ar
fopen(), fclose(), : : : f�uggv�enyeivel. Ha lehet, akkor ne keverj�uk egy programon bel�ul a
fenti k�et f�uggv�enycsoportot, mert meglepet�esek �erhetnek! (Ha lehet, akkor a szabv�anyos
I/O k�onyvt�arat haszn�aljuk, mert a programunk hordozhat�obb lesz. Az open(), close(),
: : : rendszerh��v�asok �altal�aban csak a UNIX rendszerekben vannak meg, m��g az fopen(),
fclose() : : : rutinok gyakorlatilag minden C nyelvi k�ornyezetben el�erhet}ok.)
3.2.1 Alapvet}o, f�ajlokkal kapcsolatos rendszerh��v�asok
Az access() rendszerh��v�assal lehet lek�erdezni az oper�aci�os rendszert}ol azt, hogy egy
adott f�ajlon egy adott m}uveletet elv�egezhet�unk-e. Lek�erdezhetj�uk, hogy egy adott nev}u
f�ajl l�etezik-e, olvashatjuk-e, ��rhatjuk-e illetve v�egrehajthatjuk-e azt. Az ellen}orz�es nem
az e�ektiv user- ill. group-id alapj�an t�ort�enik.
A creat() �es az open() rendszerh��v�as foglalkozik a f�ajlok megnyit�as�aval. A creat()
l�etrehoz egy, az els}o param�eter�eben megadott nev}u f�ajlt, ha eddig az adott nev}u f�ajl nem
l�etezett; ha pedig az els}o param�eter�eben megadott f�ajl m�ar l�etezik, akkor annak a hossz�at
0 bytera �all��tja. A creat() rendszerh��v�as visszat�er�esi �ert�eke egy eg�esz t��pus�u �ert�ek, egy
�un. f�ajldeszkriptor. Ezzel lehet k�es}obb a f�ajlm}uveletekn�el erre a f�ajlra hivatkozni. A
creat() ezenk��v�ul be�all��tja a m�asodik param�eter�eben megadott �ert�ek szerint az �uj f�ajl
v�edelmi bitjeit.
Az open() rendszerh��v�as egy m�ar meglev}o f�ajlt nyit meg ��r�asra vagy olvas�asra. A
megnyitand�o f�ajl neve az open() els}o param�etere, a m�asodik param�eter �ert�eke �altal�aban
0, ha a f�ajlt olvas�asra nyitjukmeg; 1, ha a f�ajlt��rni akarjuk (ezeknek megfelel}o konstansok:
az O RDONLY, O WRONLY illetve O RDWR, amelyek az <fcntl.h> nev}u header-f�ajlban vannak
deklar�alva). Ennek a visszat�er�esi �ert�eke szint�en egy f�ajldeszkriptor.
A close() rendszerh��v�as a param�eter�eben megadott f�ajldeszkriptorhoz tartoz�o f�ajlt
lez�arja. Itt �erdemes megjegyezni azt, hogy minden egyes folyamat f�ajldeszkriptorjai
0-t�ol kezd}od}oen vannak sorsz�amozva, �es ha egy �uj f�ajlt megnyitunk, akkor mindig a
legkisebb "�ert�ek}u" f�ajldeszkriptor lesz a f�ajlhoz rendelve. (Ez azt jelenti, hogy ha pl.
a 0-�as f�ajldeszkriptort lez�arjuk, akkor a k�ovetkez}o open() rendszerh��v�as a megnyitott
f�ajlt a 0-�as f�ajldeszkriptorhoz fogja k�otni. Minden program elindul�asakor h�arom "sz-
abv�anyosan" megnyitott f�ajlon dolgozhat: a 0-�as deszkriptor�u szabv�anyos bemeneten,
az 1-es deszkriptor�u szabv�anyos kimeneten �es a 2-es deszkriptor�u szabv�anyos hibac-
satorn�an. Alaphelyzetben ezek a termin�alhoz (billenty}uzethez ill. k�eperny}oh�oz) vannak
rendelve, de a shell-ben ezek �atir�any��that�oak tetsz}oleges f�ajlba.)
A k�ovetkez}o l�enyeges rendszerh��v�asok: a read() �es a write() rendszerh��v�asok.
Ezekkel lehet egy m�ar megnyitott f�ajlon valamilyen m}uveletet v�egezni: a f�ajlb�ol ada-
tokat olvasni, �es a f�ajlba adatokat ��rni. Mindk�et rendszerh��v�as els}o param�etere an-
nak a f�ajlnak a f�ajldeszkriptorja, amelyen az adott f�ajlm}uveletet el akarjuk v�egezni.
A m�asodik param�eter tartalmazza annak az adatter�uletnek a c��m�et, ahonnan az ada-
tokat a f�ajlba akarjuk ��rni (ill. read rendszerh��v�asn�al: ahov�a a f�ajlb�ol olvasni akarunk).
Az utols�o param�eter a fenti adatter�ulet hossz�at tartalmazza, vagyis a maxim�alisan be-
42 FEJEZET 3. RENDSZERH��V�ASOK
olvasand�o (ill. ki��rand�o) byteok sz�am�at. Ezeknek a rendszerh��v�asoknak eg�esz t��pus�u
a visszat�er�esi �ert�eke, �es a visszat�er�esi �ert�ek megadja a rendszerh��v�as sor�an t�enylegesen
ki��rt ill. beolvasott byteok sz�am�at. (P�eld�aul ha a read() rendszerh��v�as f�ajlv�eg�ehez �er, �es
nincs a f�ajlban m�ar annyi karakter, amennyit a rendszerh��v�as harmadik param�eter�eben
megadtunk, akkor csak annyi karaktert fog beolvasni, amennyi a f�ajlban van, �es ennek
megfelel}oen a visszat�er�esi �ert�eke kisebb lesz a harmadik param�eter �ert�ek�en�el).
A fenti rendszerh��v�asok haszn�alat�ara l�athatunk p�eld�at a k�ovetkez}o pro-
gramr�eszletben:
fggv()
{
int fd1,fd2;
char buf[512];
int rc;
fd1=open("/usr/csb/filenev",0); /* 0 = olvasasra nyitom meg */
fd2=creat("/usr/csb/ujfile",0644); /* rw-r--r-- biteket \'all\'\i t */
/*
Az fd1 filebol atmasoljuk az fd2 fileba maximum az elso 512
darab karaktert.
*/
rc=read(fd1,buf,512);
if (rc>0) write(fd2,buf,rc);
/*
...
*/
close(fd2);
close(fd1);
}
A lseek() rendszerh��v�assal lehet egy f�ajlban "poz��cion�alni" (ahol a poz��cion�al�as
�ertelmezett) �ugy, hogy pl. a k�ovetkez}o read() onnan kezdi el olvasni a f�ajlt, ahov�a
poz��cion�altunk. A lseek rendszerh��v�asnak h�arom param�etere van: az els}o �es a harmadik
eg�esz, a m�asodik pedig (C-ben) long t��pus�u (ezt a programban a konstansok megad�asakor
ne feledj�uk el!). Az els}o param�eter annak a f�ajlnak a deszkriptor�at tartalmazza, amely-
ben poz��cion�alni akarunk. A m�asodik param�eter tartalmaz egy "poz��ci�ot" (pl. lehet,
hogy azt tartalmazza, hogy a f�ajl h�anyadik karakter�ere akarunk poz��cion�alni). Ha a har-
madik param�eter SEEK_SET, akkor a f�ajlban arra a karakterre kell poz��cin�alni, amelynek a
poz��ci�oj�at a m�asodik param�eter tartalmazza. Ha a harmadik param�eter SEEK_CUR, akkor
a f�ajlban be�all��tand�o poz��ci�o egyenl}o az aktu�alis poz��ci�onak �es a m�asodik param�eternek
az �osszeg�evel. Ha pedig a harmadik param�eter �ert�eke SEEK_END, akkor az �uj f�ajlpoz��ci�o
egyenl}o lesz a f�ajl hossz�anak �es a m�asodik param�eternek az �osszeg�evel. A rendszerh��v�as
visszat�er�esi �ert�eke long t��pus�u, �es az �uj aktu�alis f�ajlpoz��ci�ot tartalmazza. Megjegyezz�uk,
hogy a SEEK_SET, SEEK_CUR, SEEK_END makr�ok (konstansok) az <unistd.h> header-
f�ajlban vannak de�ni�alva.
3.2. A F �AJLRENDSZER RENDSZERH��V �ASAI 43
3.2.2 A f�ajlrendszer �es a mem�oriakezel}o kapcsolata
A UNIX oper�aci�os rendszer �ujabb v�altozatai lehet}os�eget adnak a f�ajlok mem�ori�an
kereszt�ul t�ort�en}o el�er�es�ere a f�ajlnak a mem�ori�aba �agyaz�as�aval (ezzel lehet}os�eg ny��lik
a f�ajl tartalm�anak mem�oriam}uveletek seg��ts�eg�evel t�ort�en}o m�odos��t�as�ara, amely gyakran
hat�ekonyabb a hagyom�anyos read() illetve write() rendszerh��v�asokn�al.) Erre az mmap()
UNIX rendszerh��v�ast haszn�alhatjuk, melynek protot��pusa a k�ovetkez}o:
caddr_t mmap(caddr_t addr, size_t len, int prot, int flags,
int fd, off_t offset);
Az mmap() rendszerh��v�as els}o param�etere caddr_t t��pus�u (az ilyen t��pus�u v�altoz�ok egy
tetsz}oleges mem�oriac��met kaphatnak �ert�ek�ul, �altal�aban char * t��pussal implement�alj�ak).
Az els}o argumentumban azt a mem�oriac��met kell megadnunk, ahova be akarjuk �agyazni a
k�erd�eses f�ajlt (vagy annak egy r�esz�et). A programok hordozhat�os�aga �erdek�eben itt 0-t ad-
junk meg, ugyanis ekkor az oper�aci�os rendszer maga v�alaszt egy szabad mem�oriater�uletet,
ahova a f�ajlt be�agyazza. Sikeres v�egrehajt�as eset�en az mmap() rendszerh��v�as az fd
argumentumban kijel�olt f�ajldeszkriptor�u f�ajl offset argumentum�aban adott poz��ci�ot�ol
kezd}od}o len argumentumban b�ajtokban megadott hossz�u r�esz�et be�agyazza, �es a rend-
szerh��v�as visszat�er�esi �ert�eke a be�agyazott f�ajl-r�esz mem�oriabeli kezd}oc��me (a be�agyaz�as
kezd}oc��me).
A prot param�etert a PROT_READ, PROT_WRITE, PROT_EXEC szimb�olikus konstan-
sok bitenk�enti VAGY m}uvelettel k�epzett kapcsolat�aval �all��thatjuk el}o aszerint, hogy
a be�agyazott f�ajl-r�eszen milyen m}uveleteket akarunk megengedni (olvasni,��rni vagy
v�egrehajtani akarjuk a r�eszeit). Ha egy f�ajlra nincs ��r�asi enged�ely�unk a hozz�a t�arolt
rwx-bitek alapj�an, akkor a mem�ori�aba �agyaz�assal sem m�odos��thatjuk azt.
A flags argumentum �ert�eke vagy MAP_PRIVATE vagy pedig MAP_SHARED lehet
(�altal�aban). Ha itt MAP_PRIVATE-et adunk meg, akkor a f�ajlon v�egzett m�odos��t�asok
id}olegesek, azaz az eredeti f�ajlon nem jelennek meg, a f�ajl t�obbi felhaszn�al�oja nem l�atja
azokat.
#include <stdio.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <fcntl.h>
main()
{
int fd;
char *ra;
fd=creat("cmmap1t",0666);
write(fd,"alma",4);
close(fd);
fd=open("cmmap1t",O_RDWR);
ra=mmap(0,4,PROT_WRITE|PROT_READ,MAP_SHARED,fd,0);
if (ra == (caddr_t)(-1)) perror("mmap sikertelen");
*(ra+2)='f';
44 FEJEZET 3. RENDSZERH��V�ASOK
munmap(ra,4);
close(fd);
}
3.3 Egy�eb, f�ajlokkal kapcsolatos rendszerh��v�asok
A stat() �es fstat() rendszerh��v�assal f�ajloknak k�ul�onf�ele jellemz}oit lehet lek�erdezni.
Mindk�et rendszerh��v�as els}o param�etere azt tartalmazza, hogy melyik f�ajlr�ol akarunk
b}ovebb inform�aci�ot: az fstat() els}o param�etere egy megnyitott f�ajlra vonatkoz�o
f�ajldeszkriptor, m��g a stat() rendszerh��v�as els}o param�etere egy string, amely egy ab-
szol�ut vagy relat��v f�ajlnevet tartalmaz. Mindk�et rendszerh��v�as m�asodik param�etere egy
stat t��pus�u strukt�ur�ara mutat�o pointer. Ebben a struktur�aban adja vissza az oper�aci�os
rendszer a f�ajlr�ol a k�ovetkez}o inform�aci�okat:
struct stat {
short int st_dev; /* Melyik periferian van a filet tartalmazo
directorybejegyzes */
unsigned short st_ino; /* Hanyas a file inode-janak a sorszama*/
unsigned short st_mode; /* Egyeb dolgok, pl. rwx-bitek */
short int st_nlink; /* Hany link kapcsolodik a filehoz */
short int st_uid; /* A file tulajdonosanak uid-je */
short int st_gid; /* A file tulajdonosanak gid-je */
short int st_rdev; /* A blokk/karakter-specialis fileoknal ez
tartalmazza a hozza tartozo I/O egyseg
belso sorszamat */
long st_size; /* A file meretet tartalmazza */
long st_atime; /* A file legutolso hasznalatanak a
datumat tartalmazza */
long st_mtime; /* Az utolso modositas datuma */
long st_ctime; /* A file letrehozasanak a datuma */
};
A k�ovetkez}o p�elda bemutatja a stat() haszn�alat�at:
/*
* Megallapitja az egyetlen parametereben atadott file tipusat.
*/
#include <sys/types.h>
#include <sys/stat.h>
main(argc,argv)
int argc;
char **argv;
{
struct stat tmpstat;
3.3. EGY�EB, F �AJLOKKAL KAPCSOLATOS RENDSZERH��V �ASOK 45
if (argc != 2) {
printf("Usage: %s filename\n",argv[0]);
exit(-1);
}
if (stat(argv[1],&tmpstat) < 0) {
perror("stat");
exit(-1);
}
printf("%s: ",argv[1]); /* Filenevet kiirom */
switch (tmpstat.st_mode & S_IFMT) {
case S_IFDIR: printf("directory");
break;
case S_IFCHR: printf("karakter-specialis file");
break;
case S_IFBLK: printf("blokk-specialis file");
break;
case S_IFREG: printf("kozonseges file");
break;
default: printf(" ?");
break;
}
printf("\n");
}
A dup() rendszerh��v�as egyetlen param�etere egy megnyitott f�ajlra mutat�o
f�ajldeszkriptor. Visszat�er�esi �ert�eke egy m�asik f�ajldeszkriptor lesz, amely ugyanarra a
f�ajlra vonatkozik, mint amit a param�eter�eben megadtak (b�armelyik f�ajldeszkriptoron is
olvasunk, a f�ajlb�ol egy karaktert csak egyszer fogunk beolvasni, mivel a f�ajlbeli poz��ci�o a
k�et deszkriptorn�al mindig meg fog egyezni).
A pipe() rendszerh��v�as seg��ts�eg�evel a m�ar kor�abban is megeml��tett pipe-okat tudjuk
l�etrehozni. Ennek a param�etere egy olyan k�et-elem}u t�omb, amelynek mindk�et eleme
eg�esz t��pus�u, �es a rendszerh��v�as v�egrehajt�asa ut�an egy-egy f�ajldeszkriptort tartalmaz.
Amit az 1-es index}u t�ombelemben lev}o f�ajldeszkriptor�u �leba ��runk, azt a 0-�as index}u
t�ombelemben lev}o f�ajldeszkriptor�u f�ajlb�ol olvashatjuk ki. Ennek a haszn�alat�ara p�elda a
k�ovetkez}o programr�eszlet:
#include <stdio.h>
main()
{
int pfd[2]; /* A pipe filedeszkriptorjai ebbe a tombbe kerulnek*/
int szam;
/*
.
.
*/
pipe(pfd);
46 FEJEZET 3. RENDSZERH��V�ASOK
if (fork() == 0) {
close(pfd[0]);
close(1);
dup(pfd[1]); /* standard output:=pipe file */
close(pfd[1]);
printf("%d",23); /* Elkuldjuk a masik folyamatnak */
} else {
close(pfd[1]);
close(0);
dup(pfd[0]); /* Uj standard input: masik folyamattol */
close(pfd[0]);
scanf("%d",&szam); /* Fogadjuk a masik folyamat outputjat */
}
/*
.
.
*/
}
A link() rendszerh��v�assal lehet egy f�ajlra vonatkoz�o linket l�etrehozni, az unlink()
rendszerh��v�assal pedig egy link megsz�untethet}o (vagyis a felhaszn�al�o ezt �ugy l�atja, hogy
a f�ajl a directoryj�ab�ol t�orl}odik). A link-nek k�et string t��pus�u param�etere van, az els}o
annak a l�etez}o f�ajlnak neve, amelyre a l�etrehozand�o link mutasson; a m�asodik pedig az
�ujonnan l�etrehozand�o f�ajl nev�et tartalmazza. Ha egy m�as felhaszn�al�o f�ajljait (egyenk�ent
...) meglinkelj�uk megunknak, akkor a f�ajlhoz hozz�af�erhet�unk, de a v�edelmi bitjeit nem
v�altoztathatjuk meg! Az unlink() egyetlen param�etere a t�orlend}o f�ajl neve.
A mount() rendszerh��v�assal lehet egy f�ajlrendszert "beilleszteni" valamelyik direc-
tory al�a. Legyen p�eld�aul egy 286-os AT-n az els}o lemezegys�egnek a UNIX alatti neve:
/dev/fd0. Ha a benne lev}o lemez egy �erv�enyes directory-strukt�ur�at (f�ajlrendszert) tar-
talmaz, �es azt valamelyik winchesteren lev}o directory al�a be akarjuk rakni, akkor egy
ilyesmi rendszerh��v�ast kell kiadni:
mount("/dev/fd0","/usr/csb/aldir",0);
A mount rendszerh��v�as �altal beillesztett f�ajlrendszert az umount() rendszerh��v�assal
lehet a rendszerb}ol "kiilleszteni". Ennek alkalmaz�as�ara tekints�uk a k�ovetkez}o pro-
gramr�eszletet:
umount("/dev/fd0");
(A mount() �es az umount() rendszerh��v�asokat csak a rendszergazda adhatja ki!)
A sync() rendszerh��v�assal lehet a cache-mem�ori�aban t�arolt "aktualiz�alt"
lemezblokkokat a lemezre �zikailag kiiratni (a rendszerh��v�asnak nincsenek param�eterei).
A chdir() rendszerh��v�assal lehet az aktu�alis directoryt (munkadirectoryt) be�all��tani.
Egyetlen param�etere az �uj munkadirectory nev�et tartalmazza.
Az mkdir() ill. rmdir() rendszerh��v�asokkal lehet egy �uj directoryt l�etrehozni, ill. egy
meglev}o directoryt t�or�olni. Mindk�et rendszerh��v�as egyetlen param�etere a l�etrehozand�o
(ill. t�orlend}o) directorynak a neve.
3.4. F �AJLOK KONKURRENS EL�ER�ESE 47
3.4 F�ajlok konkurrens el�er�ese
Ebben a r�eszben arr�ol lesz sz�o, hogy a UNIX milyen szolg�altat�asokat ny�ujt p�arhuzamos
folyamatok f�ajlhozz�af�er�es�enek a szinkroniz�al�as�ara. A UNIX a f�ajlok konkurrens
kezel�esekor kialakult probl�em�as helyzeteket a kor�abban m�ar ismertetett rekord-lefoglal�as
lehet}os�eg�et biztos��tja. A rekord-lefoglal�as az fcntl() rendszerh��v�as seg��ts�eg�evel imple-
ment�alhat�o a k�ovetkez}okben le��rtak szerint (az fcntl() haszn�alat�ahoz sz�uks�eg van az
<fcntl.h> f�ajl include-ol�as�ara is).
A UNIX rekord-lefoglal�asa k�etf�ele lehet: ��r�asi vagy olvas�asi c�el�u. A kett}o k�oz�otti
l�enyeges k�ul�onbs�eg az, hogy egy rekordter�uletet (azaz a f�ajl egy bizonyos intervallum�at)
��r�as c�elj�ab�ol egyszerre legfeljebb csak egy folyamat foglalhatja le, �es csak akkor, ha azt
a r�eszt senki m�as nem foglalta m�eg le sem ��r�asi sem pedig olvas�asi sz�and�ekkal); tov�abb�a
meg kell eml��teni, hogy olvas�asi c�el�u rekordter�ulet lefoglal�ast egyidej}uleg t�obb folyamat is
k�erheti ak�ar ugyanarra a rekord-ter�uletre is. Fontos tudni, hogy a p�arhuzamos folyamatok
k�olcs�on�os kiz�ar�asa az fcntl() rendszerh��v�asn�al val�osul meg, �es nem a f�ajlm}uveletekn�el:
vagyis ha valamelyik folyamat nem tartja be a rekord-lefoglal�asi szab�alyokat, akkor az
oper�aci�os rendszer megengedi neki, hogy kedve szerinti m�odos��t�asokat illetve olvas�asokat
v�egezzen a f�ajlon, de az eredm�eny korrekts�eg�et ilyenkor nem lehet garant�alni.
Az fcntl() rendszerh��v�as a k�ovetkez}ok�eppen haszn�alhat�o:
struct flock lock_data;
int fd, cmd, rc;
...
rc=fcntl(fd,cmd,&lock_data);
A rendszerh��v�as hat�as�ara az fd f�ajldeszkriptorral azonos��tott f�ajl lock_data argu-
mentumban megadott r�esze a cmd argumentumban megadott m�odon lefoglal�asra ker�ul.
A rendszerh��v�as ��r�asi c�el�u rekord-lefoglal�as eset�en sikertelen lesz, ha a f�ajlra nincs ��r�asi
enged�ely�unk.
A rekordlefoglal�as m�odja (a cmd argumentum �ert�eke alapj�an) h�aromf�ele lehet:
� F_GETLK : ennek hat�as�ara a lock_data argumentumban kijel�olt r�eszre vonatkoz�o
rekord-lefoglal�asi inform�aci�okat kapphatjuk vissza (az oper�aci�os rendszer ekkor
kit�olti az aktu�alisan �erv�enyes rekord-lefoglal�asi inform�aci�oi alapj�an a lock_data
strukt�ura megfelel}o mez}oit { ld. k�es}obb).
� F_SETLK : ennek hat�as�ara az oper�aci�os rendszer m�odos��tja a f�ajlra vonatkoz�oan
t�arolt rekord-lefoglal�asi inform�aci�oit, vagyis ezzel lehet egy-egy rekordter�uletet
lefoglalni vagy egy kor�abban k�ert lefoglal�asi k�erelmet hat�astalaln��tani. A
lock_data strukt�ura ltype komponens�enek �ert�eke alapj�an a k�ovetkez}o rekordle-
foglal�ast v�egezhetj�uk el:
{ F_RDLCK : ha ezt az �ert�eket �all��tjuk be, akkor olvas�asi c�ellal foglalhatjuk le a
t�obbi strukturakomponensben speci�k�alt f�ajl-rekordot.
{ F_WRLCK : ha ezt az �ert�eket �all��tjuk be, akkor ��r�asi c�ellal foglalhatjuk le a t�obbi
strukturakomponensben speci�k�alt f�ajl-rekordot.
48 FEJEZET 3. RENDSZERH��V�ASOK
{ F_UNLCK : ha ezt az �ert�eket �all��tjuk be, akkor a t�obbi strukturakomponensben
speci�k�alt f�ajl-rekordra vonatkoz�oan a kor�abbiakban kiadott rekord-lefoglal�asi
k�erelmet vonhatjuk vissza, �erv�enytelen��thetj�uk.
Megjegyezz�uk, hogy ha a rekordlefoglal�asi ig�eny a rendszerh��v�as v�egrehajt�as�anak
pillanat�aban nem kiel�eg��thet}o, akkor a rendszerh��v�as sikertelen visszat�er�esi �ert�ekkel
t�er vissza a rekordlefoglal�asi ig�eny kiel�eg��t�ese n�elk�ul.
� F_SETLKW : ez ugyanazt teszi, mint az F_SETLK, de ez a folyamatotmegv�arakoztatja
olyan esetben, amikor a rekord-lefoglal�asi ig�enye nem kiel�eg��thet}o. A folyamat
eg�eszen addig v�ar, am��g a rekordlefoglal�asi ig�enyei ki nem el�eg��thet}ok, majd a
rendszerh��v�as visszat�er�esekor a megfelel}o rekordlefoglal�asi ig�enyeket az oper�aci�os
rendszer �erv�enyes��tette.
Most �attekintj�uk a lock_data argumentum egyes komponenseinek a szerep�et (vagyis
azt, hogy az flock strukt�ura egyes komponensei mit hogyan ��rhatnak le):
struct flock {
short l_type;
short l_whence;
off_t l_start;
off_t l_len;
pid_t l_pid;
};
� l_type : �ert�eke a kor�abbiakban ��rtak alapj�an F_RDLCK vagy F_WRLCK vagy pedig
F_UNLCK lehet.
� l_whence : �ert�eke SEEK_SET vagy SEEK_CUR vagy SEEK_END lehet aszerint, hogy az
l_start argumentum kezd}opoz��ci�ojak�ent a f�ajl elej�et vagy az aktu�alis f�ajlpoz��ci�ot
vagy pedig a f�ajl v�eg�et kell-e tekinteni.
� l_start : �ert�eke a lefoglaland�o rekordter�ulet kezd}opoz��ci�oj�at adja meg. Ez egy
byte-ban m�ert o�szet az l_whence-hez mind kezd}opoz��ci�ohoz k�epest.
� l_len : itt kell megadni a lefoglaland�o rekordter�ulet hossz�at byteokban m�erve. Ha
itt 0 �ert�eket adunk meg, akkor a f�ajl v�eg�eig az eg�esz f�ajl tartalm�at foglaljuk le, ak�ar
a k�es}obb hozz�af}uz�ott adatokkal egy�utt is.
� l_pid : az F_GETLK itt adja vissza a t�obbi komponensben speci�k�alt rekordter�uletet
lefoglaltan tart�o folyamat azonos��t�oj�at.
A rekordlefoglal�as haszn�alat�ara l�assuk a k�ovetkez}o p�eld�at:
#include <fcntl.h>
#include <stdio.h>
main(int argc, char **argv)
{
struct flock lock_data;
3.4. F �AJLOK KONKURRENS EL�ER�ESE 49
int fd, cmd, rc, rf;
fd=open("probafile",O_RDWR);
rf=fork();
lock_data.l_whence=SEEK_SET;
lock_data.l_start=0;
lock_data.l_len=10;
if (rf==0) {
lock_data.l_type=F_RDLCK;
rc=fcntl(fd,F_SETLK,&lock_data); /* gyermek */
fprintf(stderr,"Gyermek tovabbfutott!\n");
sleep(5);
lock_data.l_type=F_UNLCK;
rc=fcntl(fd,F_SETLK,&lock_data); /* gyermek */
} else {
sleep(1);
fprintf(stderr,"Szulo: elkezd futni a lock elott ...\n");
lock_data.l_type=F_WRLCK;
rc=(-1);
while (rc==(-1)) {
rc=fcntl(fd,F_SETLK,&lock_data); /* szulo */
if (rc==(-1)) fprintf(stderr,"Szulo: SETLK sikertelen ... ujraprobalom\n");
sleep(1);
}
fprintf(stderr,"Szulo lockolt es tovabbfutott!\n");
}
close(fd);
}
A program elindul�asa el}ott hozzunk l�etre egy probafile nev}u f�ajlt, amire van ��r�asi
jogunk (�en ezt �ugy tettem, hogy a g�epem jelsz�of�ajlj�at �atm�asoltam erre a n�evre abba a
directoryba, ahol a programot futtatni akartam).
A program elindul�asa ut�an kett�e�agazik: sz�ul egy gyermekfolyamatot. A gyermek
lefoglalja olvas�asi c�ellal a probafile f�ajl els}o 10 karakter�et, �es v�ar 5 m�asodpercig, mialatt
a lefoglal�ast fenntartja, majd 5 m�asodperc ut�an a lefoglal�ast megsz}unteti, majd lez�arja a
f�ajlt. A sz�ul}o v�ar 1 m�asodpercet, majd ciklusban m�asodpercenk�ent egyszer megpr�ob�alja
lefoglalni a f�ajl els}o 10 karakter�et ��r�asi c�ellal.
A program futtat�asakor a k�ovetkez}oket ��rja ki a szabv�anyos hibacsatorn�ara:
Gyermek tovabbfutott!
Szulo: elkezd futni a lock elott ...
Szulo: SETLK sikertelen ... ujraprobalom
Szulo: SETLK sikertelen ... ujraprobalom
Szulo: SETLK sikertelen ... ujraprobalom
Szulo: SETLK sikertelen ... ujraprobalom
Szulo lockolt es tovabbfutott!
Ez �erthet}o, mert a sz�ul}o folyamat 1 m�asodpercet v�ar, majd ut�ana pr�ob�alja meg
50 FEJEZET 3. RENDSZERH��V�ASOK
lefoglalni 1 m�asodpercenk�ent a f�ajlt, �es ez csak azut�an siker�ul, miut�an a gyermeke a f�ajlt
m�ar nem foglalja olvas�asi c�ellal.
3.5 Kiv�eteles esem�enyek kezel�es�enek rendszerh��v�asai
Ebbe a csoportba tartoznak a k�ovetkez}o rendszerh��v�asok: signal(), kill() �es az
alarm(), valamint a POSIX 1003.1-konform rendszerekben n�eh�any m�as rendszerh��v�as.
Ebben a r�eszben el}osz�or bemutatjuk a kiv�eteles esem�enyek kezel�es�ere bevezetett signal
absztrakci�ot, majd bemutatjuk a hagyom�anyos UNIX eszk�oz�oket e kiv�eteles esem�enyek
kezel�es�ere, v�eg�ul megmutatjuk a POSIX 1003.1 szabv�any ide vonatkoz�o m�odos��t�asait,
amelyek a hagyom�anyos UNIX eszk�oz�ok tervez�ese sor�an elk�ovetett hib�ak elker�ul�ese
�erdek�eben k�esz�ultek.
3.5.1 A signalok feladata
A signalok l�enyeg�eben a megszak��t�asoknak a magasabb szint}u megfelel}oi (nevezhetj�uk
}oket szoftver-megszak��t�asoknak is). Egy signalt egy program vagy az oper�aci�os rend-
szert}ol, vagy egy m�asik programt�ol (folyamatt�ol ...) kaphat (��gy ez is tekinthet}o
p�arhuzamos programok kommunik�aci�os eszk�oz�enek). T�obbfajta signal is van (pl. a
BREAK billenty}u lenyom�asakor egy �un. SIGINT nev}u signal gener�al�odik a program-
nak).
3.5.2 Hagyom�anyos signalkezel�esi technik�ak
A programok szabadon rendelkezhetnek arr�ol, hogy egy adott fajt�aj�u signallal mit akar-
nak csin�alni. Erre val�o a signal rendszerh��v�as. Ennek els}o param�etere a signal-fajt�at
adja meg, m�asodik pedig megmondja, hogy mit kell az olyan fajta signalokkal csin�alni
(lehets�eges �ert�ekei: SIG IGN = a signalt nem kell �gyelembe venni; SIG DFL = a rendszer-
ben alap�ertelmez�esnek sz�am��t�o dolgot kell csin�alni; ezenk��v�ul megadhatjuk a program egy
elj�ar�as�anak a c��m�et is, amely az adott t��pus�u signalok eset�en lesznek megh��vva). P�elda:
signal(SIGINT, SIG_IGN); /* Nem fogadom ezutan a SIGINT-et */
A UNIX rendszerben a fontosabb signalok a k�ovetkez}ok:
� SIGHUP : Megszakadt a felhaszn�al�oi termin�al �es a g�ep k�oz�otti kapcsolat
� SIGINT : "DEL" billenty}ut megnyomt�ak
� SIGQUIT : Ctrl- billenty}ut megnyomt�ak
� SIGILL : A processzor "illegal instruction"-t tal�alt
� SIGIO : Egy aszinkron I/O esem�eny bek�ovetkez�es�er}ol kapunk ezzel �ertes��t�est.
� SIGFPE : A lebeg}opontos sz�am��t�asokat v�egz}o egys�eg valami kiv�eteles esetet jelez.
� SIGKILL : A folyamatot meg akarj�ak �all��tani (ezt a signalt nem lehet ignor�alni
vagy elkapni!)
3.5. KIV�ETELES ESEM�ENYEK KEZEL�ES�ENEK RENDSZERH��V �ASAI 51
� SIGSEGV : A program megszegte a szegment�al�asi szab�alyokat
� SIGPIPE : Olyan pipe-ra akarunk ��rni, amit senki sem olvas
� SIGPWR : �Aramkimarad�as van (a rendszer ilyenkor �altal�aban sz�unetmentes
t�apegys�egr}ol megy, �es hamarosan le�all�asa v�arhat�o).
� SIGALRM : Kor�abban alarm() rendszerh��v�assal k�ert signal meg�erkez�ese
� SIGCLD : A folyamat egy gyermek-folyamata befejez}odott.
� SIGURG : A folyamat s�urg}osnek min}os��tett adatokat kap (ld. k�es}obb a h�al�ozatokr�ol
sz�ol�o r�eszt).
� SIGUSR1 : A signal jelent�es�et a felhaszn�al�o (programoz�o) szabadon de�ni�alhatja.
� SIGUSR2 : A signal jelent�es�et a felhaszn�al�o (programoz�o) szabadon de�ni�alhatja.
� SIGSYS : A folyamat egy ismeretlen rendszerh��v�ast hajtott v�egre.
� (Ezeken k��v�ul m�as signal-ok is vannak, de ez most nem �erdekes.)
A kill() rendszerh��v�assal lehet egy signalt k�uldeni egy folyamatnak. A rendszerh��v�as
els}o param�etere az elk�uldend}o signal t��pusa, a m�asodik aram�eter pedig annak a folya-
matnak az azonos��t�oja, akinek a signalt sz�antuk. (Ha a pid negat��v, akkor a signal min-
den olyan folyamatnak el lesz k�uldve, amelynek a folyamat-csoport azonos��t�oja egyenl}o
pid argumentum�anak abszolut�ert�ek�evel.) Van egy speci�alis t��pus�u signal, a SIGALRM.
Ezt lehet az alarm() rendszerh��v�assal gener�alni. Az alarm() egyetlen param�etere egy
eg�esz sz�am. Abban az eg�esz sz�amban kell megadni az oper�aci�os rendszernek, hogy h�any
m�asodperc m�ulva k�uldj�on a folyamatunknak egy SIGALRM signalt.
3.5.3 POSIX signal-szemantika
A POSIX signal-feldolgoz�ast ir�any��t�o rutinjait �ugy tervezt�ek, hogy azok alapvet}oen
signal-halmazokkal foglalkozzanak: ehhez bevezett�ek a sigset t adatt��pust, mely
adatt��pushoz de�ni�alt�ak a manipul�aci�oj�ara haszn�alhat�o m}uveleteket is. Ezek a m}uveletek
a k�ovetkez}ok1 :
int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigaddset(sigset_t *set,int sig);
int sigdelset(sigset_t *set,int sig);
int sigismember(sigset_t *set,int sig);
A sigemptyset() f�uggv�eny az argumentum�aban megadott signal-halmazt �uresre
�all��tja, azaz olyan �allapot�ura, hogy egyetlen signal sem ker�ul bele. A sigfillset()
f�uggv�eny az argumentum�aban megadott signal-halmazt olyan �ert�ek}ure �all��tja be, hogy a
rendszerben az �osszes de�ni�alt signal-t��pus benne legyen. A sigaddset() f�uggv�ennyel
1Ezekre a m}uveletekre az�ert van sz�uks�eg, mert a signalok implement�aci�of�ugg}o { esetleg t�uls�agosan nagy{ sz�ama miatt nem lehet minden architektur�an egyform�an implement�alni { mondjuk eg�eszekkel, �es az ilyenadatt��pusok kezel�ese esetleg nem lenne hordozhat�o, ez�ert e le��r�as keret�eben ezt ker�ulni fogom.
52 FEJEZET 3. RENDSZERH��V�ASOK
lehet az els}o argumentum�aban megadott signal-halmazba a m�asodik argumentumban
megadott signal-t��pust betenni; a sigdelset() f�uggv�ennyel pedig az els}o argumen-
tum�aban lev}o signal-halmazb�ol a m�asodik argumentum�aban megadott signalt kivenni.
A sigismember() f�uggv�eny visszat�er�esi �ert�eke 1 (igaz), ha az els}o argumentum�aban
megadott signal-halmaz tartalmazza a m�asodik argumentum�aban megadott signalt.
A POSIX szabv�any de�ni�alja amaszkolt signalok fogalm�at: ez egy folyamatonk�ent
(processzenk�ent) nyilv�antartott attributum, mely tartalmazza az �osszes olyan signalt,
amelyeket a folyamat blokkolt, vagyis azokat a signalokat, amelyeknek a kiv�alt�as�at
a folyamat megtiltotta (az oper�aci�os rendszernek). Term�eszetesen egy folyamatnak
k�uldhetnek olyan signalokat, amiket az �eppen blokkolt, de azoknak a kiv�alt�as�aval az
oper�aci�os rendszerv�arni fog a blokkol�as befejez�es�eig. Az ilyen signalokat, amiket egy
folyamat blokkol, de k�uld�ott m�ar neki valaki: v�arakoz�o signaloknak is nevezik.
Az egyes signalok kezel�es�enek mik�entj�et a sigaction() rendszerh��v�assal jel�olhetj�uk
ki. Ennek param�eterez�ese a k�ovetkez}o:
int sigaction(int sig, const struct sigaction *newact,
struct sigaction *oldact);
A sigaction() rendszerh��v�as els}o argumentuma azt hat�arozza meg, hogy melyik
signal kezel�es�et akarjuk megv�altoztatni vagy lek�erdezni2 A m�asodik argumentumban
lehet kijel�olni az els}o argumentumban megadott signal-t��pus �uj (mostant�ol �erv�enyes)
kezel�esm�odj�at, illetve ott NULL pointert megadva a rendszerh��v�as nem m�odos��tja a signal
�eppen �erv�enyes kezel�esm�odj�at. A harmadik argumentumban (ha ott nem NULL �ert�eket
adunk �at) az oper�aci�os rendszer visszaadja a signal eddigi kezel�es�enek m�odj�ara vonatkoz�o
inform�aci�okat.
A signal-kezel�es m�odj�at le��r�o struct sigaction strukt�ura fel�ep��t�ese a k�ovetkez}o:
struct sigaction {
void (*sa_handler)();
sigset_t sa_mask;
int sa_flags;
};
Az sa handler komponense �ert�eke vagy a SIG IGN vagy SIG DFL szimbolikus kon-
stansok valamelyike (l�asd r�eszletesebben a 3.5.2 pontot), vagy pedig a signal-kezel}o
f�uggv�eny c��me lehet. Ha egy signal-kezel}o f�uggv�eny van az sa handler kompo-
nensben, akkor az sa mask komponens a signal-kezel}o f�uggv�eny fut�asa alatt a m�eg
maszkoland�o signalok halmaz�at kell, hogy tartalmazza (vagyis a signal-kezel}o fut�asakor
a maszkolt signalok halmaza ki fog b}ov�ulni az sa mask halmazban megadott sig-
nalokkal, a signal-kezel}o lefut�as�anak v�eg�eig). Az �eppen kiv�altott signal automatikusan
beleker�ul az sa mask halmazba, ��gy azt nem kell belerakni abba. Az sa flags a signal-
kezel�es folyamat�at befoly�asolja, �es a POSIX az egyetlen SA NOCLDSTOP lehets�eges aget
de�ni�alja a k�ovetkez}ok�eppen: ha ez be van �all��tva, akkor az oper�aci�os rendszer nem fog
SIGCHLD3 signalt gener�alni olyankor, amikot a folyamat valamely gyermek-folyamat�anak
felf�uggeszt}odik vagy tov�abb folytat�odik a fut�asa.
Lehet}os�eg van az �eppen maszkolt signalok halmaz�anak lek�erdez�es�ere �es m�odos��t�as�ara
is: erre haszn�alhat�o a sigprocmask() rendszerh��v�as. Ennek protot��pusa a k�ovetkez}o:
2A sigaction() rendszerh��v�as haszn�alhat�o a signal �eppen �erv�enyes kezel�esm�odj�anak lek�erdez�es�ere is.3A SIGCHLD a Berkeley UNIX SIGCLD signalj�anak a megfelel}oje az AT&T System V UNIX rendszer�eben.
3.6. M�EG EGY KICSIT A FOLYAMATOKR�OL 53
int sigprocmask(int hogyan, const sigset_t *newset, sigset_t *oldset);
Az els}o argumentum �ert�eke h�aromf�ele lehet: vagy SIG BLOCK vagy SIG UNBLOCK vagy
pedig SIG SETMASK. SIG BLOCK �ert�ek eset�en a m�asodik (newset) argumentumban lev}o
signalok hozz�aad�odnak a maszkolt signalok halmaz�ahoz. SIG UNBLOCK eset�en a m�asodik
argumentumban lev}o signalok ki lesznek v�eve a maszkolt signalok halmaz�ab�ol, m��g a
SIG SETMASK eset�en a maszkolt signalok halmaz�at newset-re �all��tja az oper�aci�os rend-
szer, az addigi tartalm�at�ol f�uggetlen�ul. Ha a newset argumentum �ert�eke NULL, akkor a
maszkolt signalok halmaza nem m�odosul. Ha az oldset argumentum �ert�eke nem NULL,
akkor az �altala kijel�olt helyre az oper�aci�os rendszer elt�arolja az �eppen maszkolt signalok
halmaz�at.
A POSIX de�n�alja m�eg a sigpending() illetve a sigsuspend() rendszerh��v�asokat is:
ez el}obbivel egy folyamat lek�erdezheti a sz�am�ara k�uld�ott, de v�arakoz�o signalok halmaz�at;
m��g a sigsuspend() f�uggv�ennyel a maszkolt signalok halmaza m�odos��that�o, majd az
oper�aci�os rendszer a folyamat fut�as�at felf�uggeszti addig, am��g legk�ozelebb egy signalt
nem kap.
3.6 M�eg egy kicsit a folyamatokr�ol
A k�es}obbiekben bemutatott p�eldaprogramok (pl. majd a TCP alap�u konkurrens szerver)
m}uk�od�es�enek meg�ert�es�ehez fontos tiszt�aban lenni azzal, hogy mi t�ort�enik miut�an egy
folyamatmeghal (v�egrehajtja az exit() rendszerh��v�ast vagy kill signalt k�uld �onmag�anak,
stb ...), hogy szerezhet err}ol tudom�ast a sz�ul}o folyamat.
Egy sz�ul}o-folyamat egy gyermek-folyamat befejez}od�es�ere a wait() rendszerh��v�assal
v�arakozhat. Egyetlen param�etere egy int t��pus�u objektumra mutat�o pointer, ahova (a
magasabb helyi�ert�ek}u byteba) a meghalt gyermek exit-st�atusza ker�ul (ami 0 szokott lenni,
ha nem volt hiba; egy�ebk�ent nem 0, de ez ink�abb egy konvenci�o, aminek a betart�asa nem
k�otelez}o) - ha a pointer nem NULL-pointer. Visszat�er�esi �ert�eke egyenl}o a befejez}odott
gyermek-folyamat azonos��t�oj�aval (ha van ilyen). Ha a folyamatnak nincs egyetlen (fut�o
vagy befejez}od�ott) gyermeke, akkor a visszat�er�esi �ert�eke -1.
A k�ovetkez}o esetek lehets�egesek miut�an egy gyermek-folyamat v�egrehajtotta az
exit() rendszerh��v�ast, ami ut�an nincs vissza�ut:
� A sz�ul}o folyamat m�ar v�egrehajtott egy wait() rendszerh��v�ast, �es ekkor a rendsz-
erh��v�as a fent eml��tett m�odon visszat�er.
� A sz�ul}o folyamat (m�eg) nem hajtott v�egre wait()-et. Ekkor a gyermek-folyamatb�ol
zombie-processz lesz (err}ol kor�abban m�ar volt sz�o). Ez azt jelenti, hogy minden
�altala lefoglalt er}oforr�as fel lesz szabad��tva, kiv�eve a processz-t�ablabeli bejegyz�es,
amiben az exit-statusz van t�arolva (ennek az az oka, hogy nem lehet tudni azt,
hogy a sz�ul}o v�egrehajt-e majd valamikor egy wait rendszerh��v�ast ...)
� Ha a folyamat azonos��t�oja �es folyamat-csoport azonos��t�oja megegyezik, �es a folya-
mat "login"-shell folyamat volt (azaz a terminal group azonos��t�o 2.1 is egyenl}o
a folyamat azonos��t�oj�aval), akkor akkor a folyamat-csoport minden tagja megkap
egy SIGHUP signalt. (Ez�ert halhatnak meg a h�att�erben fut�o folyamataink, ha
kijelentkez�unk - �es ezt a signalt ignor�altatja a nohup UNIX parancs a folyamattal.)
54 FEJEZET 3. RENDSZERH��V�ASOK
� A UNIX m�asik lehet}os�ege, hogy miut�an egy folyamat egy exit() rendszerh��v�ast
v�egrehajtott, azut�an egy SIGCLD (Signal the Death of a Child) signalt k�uld
a sz�ul}onek. Ez az�ert j�o, mert a signal-handlerben le lehet k�erdezni a meghalt
gyermek-folyamat exit-st�atusz�at egy wait h��v�assal, ��gy elker�ulhet}o a zombie-
folyamatok v�eletlen elszaporod�asa. (Csak az AT&T System V UNIX ad arra
lehet}os�eget, hogy a programnak ne is kelljen t�or}odni a zombie-processzekkel. Ehhez
v�egre kell hajtani a
signal(SIGCLD, SIG_IGN);
rendszerh��v�ast. Ez azt eredm�enyezi, hogy ezut�an ha egy gyermek meghal, a UNIX
mag nem gener�al a sz�ul}onek SIGCLD signalt, a gyermek a zombie �allapot ki-
hagy�as�aval �or�okre feled�esbe mer�ul.)
M�eg egy fontos dolog van, amin a UNIX k�esz��t}oinek el kellett gondolkodniuk: mi
legyen akkor, ha a sz�ul}o-folyamat hal meg el}obb?
Ekkor a gyermekhez t�arolt sz�ul}o-folyamat azonos��t�o mez}o �erv�enytelen folyamat-
azonos��t�ot tartalmaz! Ezt �ugy oldott�ak meg, hogy bevezettek egy speci�alis (1-es
azonos��t�oj�u) folyamatot, az init folyamatot (ez ind��tja el a termin�alokon a login: folyam-
atokat). Az "�arva" gyermek-folyamatoknak ez lesz sz�ul}o-folyamatukk�ent t�arolva. Ez
majd id}onk�ent �gyeli, �es megtiszt��tja a "halott �arva zombie" folyamatok �altal lefoglalt
processzt�abala-bejegyz�esekt}ol a processz-t�abl�at. (Az init folyamat sosem hajt v�egre
exit() rendszerh��v�ast.)
3.7 INPUT/OUTPUT eszk�oz�oket vez�erl}o rendsz-
erh��v�as
A UNIX rendszerben egyetlen I/O-vez�erl}o rendszerh��v�as van: az ioctl(), de ez a
k�ul�onb�oz}o perif�eri�akon (karakteres speci�alis f�ajlokon) m�as-m�as dolgokat v�egezhet (a
param�etereit az adott perif�eri�ahoz tartoz�o device driver kapja meg �es �ugy �ertelmezi,
ahogyan akarja). A PC-ken p�eld�aul ez a rendszerh��v�as kapcsolhatja a k�eperny}ot gra�kus
megjelen��t�esi m�odba.
Egyetlen haszn�alat�at �erdemes megn�ezni ennek a rendszerh��v�asnak: a termin�al-m�odok
be�all��t�as�at.
A UNIX rendszerekben a termin�al device driverje h�arom k�ul�onf�ele m�odon m}uk�odhet:
raw, cbreak illetve cooked m�odban. A raw �uzemm�odban a termin�alon (bilenty}uzeten,
RS-232 vonalon, ...) beadott karakterek egyenk�ent �at lesznek adva a felhaszn�al�oi pro-
gramnak, ekkor minden billenty}u "egyenrang�u", a speci�alis billenty}uknek (pl. backspace,
CTRL-S, CTRL-Q stb.) ekkor nincs semmi hat�asuk a programra. A cbreak m�odban a
karakterek szint�en egyenk�ent lesznek a felhaszn�al�oi programnak �atadva, de a speci�alis bil-
lenty}uket ekkor az oper�aci�os rendszer "elkapja", feldolgozza, �es ezeket nem adja tov�abb
a felhaszn�al�oi programnak. A speci�alis billenty}uket �es hat�asukak a k�ovetkez}o t�abl�azat
foglalja �ossze (a lista nem teljes):
� CTRL-S : A k�eperny}ore��r�ast fel kell f�uggeszteni
� CTRL-Q : A k�eperny}ore��r�ast folytatni kell (mivel CTRL-S-sel valamikor meg lett
�all��tva).
3.7. INPUT/OUTPUT ESZK �OZ �OKET VEZ�ERL }O RENDSZERH��V �AS 55
� CTRL-D : F�ajlv�ege gener�al�asa
� DEL : SIGINT signal k�uld�ese a fut�o programjainknak (ezt a program letilthatja).
� CTRL-\ : SIGQUIT signal k�uld�ese a fut�o programnak, hogy �alljon le, �es a mem�oria
tartalm�at az oper�aci�os rendszer egy core nev}u f�ajlba kimenti az aktu�alis directo-
ryba. (Azaz egy core-dumpot k�esz��t r�ola az oper�aci�os rendszer, amit k�es}obb egy
debuggerrel elemezni lehet ...).
A cooked m�odban az oper�aci�os rendszer sorv�ege- (vagy f�ajlv�ege-)jellel lez�art eg�esz
sorokat olvas be a billenty}uzetr}ol, �es a beolvasott sort egyben adja �a a felhaszn�al�oi
programnak. A felhaszn�al�o a backspace billenty}ut haszn�alhatja a beadott karakterek
t�orl�es�ere, �es a fent eml��tett speci�alis funkci�oj�u billenty}uk is hat�asosak.
A termin�al-param�eterek egy termio strukt�ura t��pus�u v�altoz�oba lek�erdezhet}ok az
oper�aci�os rendszert}ol4, �es ha akarjuk, akkor ezt megv�altoztathatjuk, majd visszaad-
hatjuk az oper�aci�os rendszernek, hogy �all��tsa be a bels}o struktur�ait ennek megfelel}oen.
A strukt�ura szerkezete a k�ovetkez}o (itt is a teljess�eg ig�enye n�elk�ul):
#define NCC ....
struct termio {
short c_iflag;
short c_oflag;
short c_cflag;
short c_lflag;
char c_line;
short c_cc[NCC];
};
Az egyes mez}okben a fent eml��tett m�odokat, RS-232 termin�aln�al a baudrate �ert�ek�et,
a karaktert�orl}o billenty}u �es m�as speci�alis billenty}uk k�odj�at lehet megadni, �es m�eg sok-sok
m�as dolgot (pl. az oper�aci�os rendszer v�egezzen-e a beadott karaktereken CR-->LF kon-
verzi�ot vagy sem, : : :{ ez hasznos lehet p�eld�aul termin�al-emul�ator programok k�esz��t�es�en�el,
de err}ol most nem ��rok r�eszletesebben).
A termin�alparam�etereket a
ioctl(tfd, TCGETA, &tpars);
rendszerh��v�assal lehet lek�erdezni egy tpars (struct termio t��pus�u) v�altoz�oba (tfd a
termin�alhoz kapcsolt f�ajl, lehet p�eld�aul 0 is, ha a szabv�anyos bemenet a termin�alhoz van
k�otve). A param�etereket �at�all��tani ��gy lehet:
ioctl(tfd, TCPUTA, &tpars);
RAW m�odba kapcsol�ashoz a k�ovetkez}o param�etereket kell �at�all��tani:
4A POSIX szabv�anyban kicsit m�odosult a strukt�ura szerkezete, �es �atnevezt�ek termios n�evre, de l�enyegesv�altoz�asok nem t�ort�entek { k�enyelmi f�uggv�enyek bevezet�es�en �es egy-k�et �uj termin�alparam�eter bevezet�es�en k��v�ul.
56 FEJEZET 3. RENDSZERH��V�ASOK
/* ioctl ... */
oldlflag=lflag; /* Elozo modot elmentem */
lflag=(lflag & ~(ECHO | ISIG | ICANON); /* Karaktervisszairast
(ECHO-t) is kikapcsolom */
Vissza az "el}oz}o" m�odba:
lflag=oldlflag;
/* ioctl ... */
(Megjegyz�es: ezek a m}uveletek egyes UNIX rendszerekben lehet, hogy m�ashogy men-
nek, esetleg m�as mez}onevek vannak a termio strukt�ur�aban, ... ennek �erdemes ut�anan�ezni
mondjuk a "man termio" paranccsal. Ezeknek a be�all��t�as�ara egy�ebk�ent l�etezik egy curses
nev}u standard k�onyvt�ar is benne a raw(), cooked(), cbreak() f�uggv�enyekkel, amit ha
kell haszn�alhatunk.)
A UNIX kernelnek azt a r�esz�et nevezik line discipline modulnak, amely a ter-
imin�alinterfaceen bej�ov}o karakterek feldolgoz�as�at v�egzi a fenti szempontok szerint.
3.8 Egy�eb rendszerh��v�asok
Ebbe a csoportba azok a rendszerh��v�asok ker�ultek, amelyeket �erdemes megismerni, de
a fent eml��tett csoportok k�oz�ul egyikbe sem tartoznak olyan szorosan. Az itt ismerte-
tend}o rendszerh��v�asok a k�ovetkez}ok: chmod(), chown(), chgrp(), getuid(), getgid(),
geteuid(), getegid(), setuid(), setgid() �es a time().
A chmod() rendszerh��v�assal lehet be�all��tani (ill. �at�all��tani) egy f�ajl v�edelmi bitjeit.
Az els}o param�etere a f�ajl neve, a m�asodik param�eter pedig a v�edelmi bitek �uj �ert�eke. A
chown() rendszerh��v�assal lehet egy f�ajl tulajdonos�anak az azonos��t�oj�at megv�altoztatni.
A rendszerh��v�as els}o param�etere a f�ajl neve, m�asodik param�eter pedig az �uj tulajdonos
felhaszn�al�oi azonos��t�oja. A harmadik param�eter az �uj tulajdonos csoport-azonos��t�oja.
(Ezt a rendszerh��v�ast csak a f�ajl "jelenlegi" tulajdonosa vagy a root (a szuperfelhaszn�al�o)
hajthatja v�egre.)
A getuid(), getgid() rendszerh��v�as a programot futtat�o felhaszn�al�o azonos��t�oj�at
illetve csoport-azonos��t�oj�at adja vissza eredm�eny�ul. A geteuid() ill. getegid() rend-
szerh��v�as hasonl�oan m}uk�odik, kiv�eve ha egy setuid bittel ell�atott programban hajtj�ak
v�egre. Ekkor annak az uid-j�et ill. gid-j�et adja vissza eredm�eny�ul, aki�e a futtathat�o pro-
gram volt (pontosabban: az e�ektiv felhaszn�al�oi azonos��t�ot �es csoport-azonos��t�ot adja
vissza).
A setuid() �es setgid() rendszerh��v�asokkal a folyamathoz t�arolt felhaszn�al�oi
azonos��t�ot �es csoport-azonos��t�ot lehet �at�all��tani. A szuperfelhaszn�al�o (illetve az a
folyamat, amely setuid root m�odon lett elind��tva) b�armilyen felhaszn�al�oi- �es csoport-
azonos��t�ora be�all��thatja a folyamathoz t�arolt felhaszn�al�oi- �es csoport-azonos��t�o �ert�ekeket,
de ez visszafele nem megy. Egy "mezei" felhaszn�al�oi folyamat nem tudja a t�arolt
azonos��t�okat megv�altoztatni.
A time() rendszerh��v�asnak egy param�etere van (de annak �ert�eke NULL-pointer is
lehet). A rendszerh��v�as eredm�eny�ul visszaadja az 1970 janu�ar 1-e �ota eltelt m�asodpercek
sz�am�at. Ha a param�eter nem NULL- pointer, akkor ezt az �ert�eket be��rja a param�etere
�altal mutatott mem�oriac��mt}ol.
3.9. EGY �OSSZETETTEBB P�ELDA: A SHELL 57
3.9 Egy �osszetettebb p�elda: a shell
Ebben a r�eszben egy minim�alis k�epess�eg}u shell (parancs�ertelmez}o) funkci�oit ell�at�o pro-
gram forr�aslist�aja van. A programon kereszt�ul a UNIX alapvet}obb rendszerh��v�asait is-
merhetj�uk meg (ez�ert ker�ultem a szabv�anyos I/O k�onyvt�ar haszn�alat�at, a printf()-et
�es egyebeket).
A shell f}oprogramja { a main() f�uggv�enyn�el ciklusban ki��r egy prompti ($) karaktert
{ ezzel jelezve a felhaszn�al�onak, hogy parancsra v�ar { majd beolvas egy sort a szabv�anyos
bemenetr}ol (ami ugye leggyakrabban a billenty}uzetr}oli olvas�ast jelenti interakt��v shell-
ekn�el).
Ezut�an a beadott parancsot a darabol() nev}u elj�ar�assal sz�etszedi r�eszeire, az argstrs
nev}u param�eter�eben megadott t�omb�ot (a benne lev}o mutat�okat) a beadott parancs egyes
komponenseire �all��tja: az els}o (azaz a nulla index}u) elemet a v�egrehajtand�o parancs
nev�ere �all��tja, a k�ovetkez}o elemet a v�egrehajtand�o parancs els}o argumentum�ara �all��tja,
stb. Az egyes parancsneveket/argumentumokat termin�alja a \0 karakterrel.
A sz�etdarabol�as ut�an a f}oprogramban sz�ul egy gyermek-folyamatot, ami el}osz�or
ellen}orzi, hogy az utols�o argumentumban a szabv�anyos kimenetet akart�ak-e �atir�any��tani,
�es ha �ugy tal�alja, hogy azt akart�ak (vagyis egy > karakterrel kezd}odik), akkor lez�arja az
addig �erv�enyes szabv�anyos kimenetet, �es megnyit egy �uj f�ajlt (ami a szabv�anyos kimenet
hely�en, az 1-es f�ajldeszkriptorral j�on l�etre, mivel az a legels}o szabad f�ajldeszkriptor { ne
felejts�uk el, hogy a 0-�as f�ajldeszkriptoron a szabv�anyos bemenetet nem b�antottuk, nem
z�artuk le, ez�ert a program ilyen szempontb�ol helyesen m}uk�odik). A gyermek-folyamat
ezut�an v�egrehajtja az execvp() rendszerh��v�assal a k��v�ant programot.
A sz�ul}o-folyamat v�arakozik, am��g a gyermeke befejez}odik, majd �uj parancsot k�er.
Megjegyezz�uk, hogy a folyamatok h�att�erbeli elind��that�os�aga azt jelenti, hogy ezt a
v�arakoz�ast (a wait() rendszerh��v�ast) ki kellene hagyni, �es a gyermek-folyamat hal�al�at
jelz}o signalt kellene kezelnie a shell�unknek.
/* minsh.c
*
* Egy minimalis shell
* A szabvanyos bemenet (standard input) csatornarol olvas programneveket es
* program-argumentumokat, es vegrehajtja a megadott programokat a megadott
* argumentumokkal.
* A szabvanyos kimenet atiranyithato - elegge primitiven: >fajlnev
* metakarakterekkel ... mint az igazi shellekben, DE itt ez csak es
* kizarolag az utolso argumentumban fordulhat elo, vagyis a parancssor
* vegen.
*/
#include <fcntl.h>
#define CBUFSIZE 1024 /* Parancsbuffer merete */
#define NR_ARGSTRS 32 /* Maximalis argumentumszam */
#ifndef NULL
#define NULL ((void *)0)
#endif
58 FEJEZET 3. RENDSZERH��V�ASOK
void darabol(pbuf,argstrs,argn)
char *pbuf;
char **argstrs;
int *argn;
{
int pozicioszamlalo=0,pbufhossz;
int local_argn;
local_argn=0;
pbufhossz=strlen(pbuf);
while (isspace(pbuf[pozicioszamlalo]) && pozicioszamlalo<pbufhossz) {
pbuf[pozicioszamlalo]='\0';
pozicioszamlalo++;
}
while (pozicioszamlalo < pbufhossz) {
argstrs[local_argn]= &pbuf[pozicioszamlalo];
local_argn++;
while (!(isspace(pbuf[pozicioszamlalo])) && pozicioszamlalo<pbufhossz)
pozicioszamlalo++;
while (isspace(pbuf[pozicioszamlalo]) && pozicioszamlalo<pbufhossz) {
pbuf[pozicioszamlalo]='\0';
pozicioszamlalo++;
};
};
argstrs[local_argn]=NULL;
local_argn++;
*argn=local_argn;
}
void main(argc,argv,envp)
int argc;
char **argv, **envp;
{
int gy_status; /* A befejezodott gyermekfolyamat allapotarol ad informaciot */
char parancsbuf[CBUFSIZE];
char *argstrings[NR_ARGSTRS];
int argnum,fn,nchars;
char *stdoutfnev;
do {
write(1,"$ ",2);
if ((nchars=read(0,parancsbuf,CBUFSIZE)) > 0) { /* -1 hiba, 0 fajlvege */
darabol(parancsbuf,argstrings,&argnum);
if (argnum > 1) { /* Ha megadtak valami (vegrehajtando-) fajlnevet */
if (fork() == 0) {
fn=1;
if ((argnum > 2) && (argstrings[argnum-2][0]=='>')) {
3.10. DAEMON FOLYAMATOK 59
stdoutfnev=&(argstrings[argnum-2][1]); /* Ronda, de vilagos ... */
close(1); /* lezarja az ezelotti szabvanyos kimenet fajlt */
fn=creat(stdoutfnev,0744);
argstrings[argnum-2]=NULL; argnum=argnum-1;
}
if (fn == 1)
execvp(argstrings[0],argstrings);
else
perror("Standard kimenet atiranyitasa sikertelen ");
perror("execvp nem sikerult ");
exit(-1); /* Hiba - execvp sikertelen */
} else {
wait(&gy_status); /* szulo var */
}
}
}
} while (nchars != 0);
if (nchars == (-1)) perror(" hiba a standard input olvasasakor ");
}
3.10 Daemon folyamatok
A UNIX oper�aci�os rendszerben vannak olyan feladatok, amiket a h�att�erben (gyakran
"�eszrev�etlen�ul") fut�o folyamatok v�egeznek el. Ilyen p�eld�aul a rendszeres feladatok fut-
tat�as�at v�egz}o cron program. Ezeket a programokat daemon folyamatoknak is nevezik.
Mivel ezeket a folyamatokat nem a termin�alr�ol ind��tj�ak, �altal�aban a rendszerind��t�askor
automatikusan indulnak el, ez�ert nem illik a k�eperny}ore ��rniuk (esetleg nagyon nagy
rendszerhib�ak eset�en ezt az�ert megtehetik), �es nem illik olyan er}ofor�asokat fenntartaniuk,
amikre nincs sz�uks�eg�uk. Ahhoz, hogy egy daemon folyamat a feladat�anak ell�at�as�ahoz
sz�uks�eges er}oforr�asokon k��v�ul min�el kevesebb m�as er}oforr�ast foglaljon le, kialak��tottak
olyan konvenci�okat, amiket a daemon folyamatokat��rva k�ovetni �erdemes. Ebben a pont-
ban ezekr}ol a konvenci�okr�ol lesz sz�o, majd bemutatunk egy C k�odr�eszletet, amely e kon-
venci�ok alapj�an lett meg��rva, �es felhaszn�alhatjuk saj�at daemon folyamataink k�esz��t�esekor.
� Egy daemon folyamatnek el}osz�oris v�egre kell hajtania egy fork() rendszerh��v�ast,
majd a sz�ul}o r�esz�enek egy exit()-et. Ezzel egyr�eszt a gyermek { a leend}o daemon
{ nem lesz processz-csoport vezet}oje, m�asr�eszt pedig mivel a sz�ul}o v�egrehajt egy
exit() rendszerh��v�ast, ez�ert a shell �ugy tekintheti, hogy a daemont elind��t�o parancs
befejez}od�ott (vagyis eredm�eny�ul a daemon fut, de a shell promptot is visszakapjuk).
� V�egre kell hajtani a setsid() rendszerh��v�ast. Ezzel a folyamat egy �uj processz-
csoportot k�epez, aminek }o lesz a vezet}oje, �es a vez�er}o termin�alt sem k�oti le a
tov�abbiakban (vagyis a kijelentkez�es�unk ut�an �ujabb bejelentkez�es is t�ort�enhet ra-
jta).
� A munka-directoryt �all��tsuk a gy�ok�erre (/) vagy a /tmp-re. Ezzel a daemonunk
nem akad�alyozza annak a f�ajlrendszernek az esetleges kiileszt�es�et umount() rend-
szerh��v�assal, amely az elind��t�asakor aktu�alis munkadirectoryt tartalmazta.
60 FEJEZET 3. RENDSZERH��V�ASOK
��All��tsuk a folyamat umask �ert�ek�et null�ara.
� Z�arjuk le a felesleges f�ajlokat.
A fenti l�ep�eseket a k�ovetkez}o elj�ar�as megteszi:
int daemon_init(void)
{
int pid;
close(0);
close(1);
close(2);
pid=fork();
if (pid < 0) return (-1);
if (pid != 0) exit(0); /* a szulo folyamat befejezi a futasat */
setsid();
chdir("/");
umask(0);
return(0);
}
3.11 POSIX-threadek
Igaz ugyan, hogy a "hagyom�anyos" UNIX rendszerek (egy-k�et kiv�etellel) nem biz-
tos��tanak lehet}os�eget t�obb sz�alon fut�o (multi-threaded) alkalmaz�asok k�esz��t�es�ere rendsz-
erszolg�altat�as szinten, de manaps�ag egyre t�obbf�ele olyan C k�onyvt�ar kaphat�o (mind a
kommersz, mind pedig a szabad szoftver szf�er�aban), amely lehet}ov�e teszi a UNIX folyam-
atok tov�abboszt�as�at, t�obbsz�al�u futtat�as�at. Ebben a pontban err}ol fogok r�eszletesebben
��rni. Mivel a legt�obb ilyen kieg�esz��t}o k�onyvt�ar a POSIX thread szabv�any�at k�oveti (ez
a POSIX 1003.4a), ez�ert �en is ezt a szabv�anyt fogom bemutatni. Megjegyzem, hogy a
POSIX thread-szabv�any�anak csak egy r�esz�et fogom ismertetni; nem c�elom a szabv�any
teljes k�or}o bemutat�asa.
3.11.1 POSIX threadek l�etrehoz�asa �es megsz}untet�ese
Egy �uj POSIX threadet (a tov�abbiakban P-thread) a pthread create() f�uggv�ennyel
hozhatunk l�etre. Ennek protot��pusa a k�ovetkez}o:
int pthread_create (pthread_t *thread,
pthread_attr_t *attr,
pthread_func_t func,
any_t arg);
A pthread create() f�uggv�eny l�etrehoz egy �uj threadet az attr argumentum�aban
megadott attributumokkal5 . A thread fut�asa a func argumentumban megadott
5Thread attributum p�eld�aul a thread sz�am�ara rendelkez�esre �all�o v�egrehajt�asi verem m�erete.
3.11. POSIX-THREADEK 61
f�uggv�enynek, az arg argumentumban �atadott �ert�ekkel mint f�uggv�enyargumentummal
t�ort�en}o v�egrehajt�as�ab�ol �all (vagyis ez �ugy viselkedik, mintha v�egrehajtan�ank
p�arhuzamosan a func(attr); C nyelv}u f�uggv�enyt : : : ). Az els}o argumentumban azt
a helyet kell megadni, ahova a thread-k�onyvt�ar az elind��tott thread azonos��t�oj�at teheti.
Ha az elind��tand�o thread attributumaival kapcsolatban nincsenek k�ul�on�osebb ig�enyeink,
akkor megadhatjuk az attr argumentumk�ent a pthread attr default �ert�eket.
Miut�an a thread befejezte a feladat�at, v�egre kell hajtania a pthread exit()
f�uggv�enyt. Ennek a f�uggv�enynek egyetlen argumentuma van, a befejez}od�ott thread
kil�ep�esi k�odja, amit a thread elind��t�oja a thread befejez�ese ut�an megkap. Ennek a
f�uggv�enynek a protot��pusa a k�ovetkez}o:
void pthread_exit(any_t status);
P-threadek v�arhatnak m�as P-threadek befejez}od�es�ere a pthread join() f�uggv�ennyel.
Ennek protot��pusa a k�ovetkez}o:
int pthread_join(pthread_t thread, any_t *exit_status);
A pthread join() f�uggv�enyt v�egrehajt�o thread megv�arja az els}o argumentum�aban
megadott thread befejez}od�es�et, majd a m�asodik argumentum�aban visszaadja a befe-
jez}od�ott thread kil�ep�esi k�odj�at (amit a pthread exit() v�egrehajt�asakor a befejez}od}o
thread megadott).
Mivel a pthread join() f�uggv�enyt a m�ar befejez}od�ott P-threadekre vonatkoz�oan
is v�egrehajthatjuk (�es ez m}uk�odik is!), ez�ert a P-thread k�onyvt�ar k�enytelen az �osszes
elind��tott threadr}ol inform�aci�okat nyilv�antartani (p�eld�aul a thread kil�ep�esi k�odj�at). Ah-
hoz, hogy a nyilv�antartott inform�aci�ok ne foglalj�ak le a mem�ori�at, a programoz�onak
lehet}os�ege van a pthread detach() f�uggv�ennyel azt tan�acsolnia a P-thread k�onyvt�arnak,
hogy a f�uggv�eny egyetlen argumentum�aban speci�k�alt threadre vonatkoz�oan nem fogja
t�obb�e v�egrehajtani a pthread join() f�uggv�enyt, ez�ert a megadott threadre vonatkoz�oan
nyilv�antartott inform�aci�okat a tov�abbiakban nem kell t�arolni. A protot��pusa a k�ovetkez}o:
int pthread_detach(pthread_t *thread);
3.11.2 POSIX threadek identit�asa
A pthread self() f�uggv�eny haszn�alhat�o a thread identit�as�anak meghat�aroz�as�ara. E
f�uggv�eny visszat�er�esi �ert�ekek�ent megadja az }ot v�egrehajt�o thread thread-azonos��t�oj�at. A
f�uggv�eny protot��pusa a k�ovetkez}o:
pthread_t pthread_self(void);
A pthread t t��pus�u
adatelemek egyenl}os�egvizsg�alat�ara haszn�alhat�o a pthread equal() f�uggv�eny. K�et ar-
gumentuma egy-egy P-threadet azonos��tson, visszat�er�esi �ert�eke pedig csak akkor igaz,
ha az argumentumaiban megadott thread-azonos��t�ok ugyanazt a threadet azonos��tj�ak.
Ennak a f�uggv�enynek a protot��pusa a k�ovetkez}o:
int pthread_equal(pthread_t thread1, pthread_t thread2);
62 FEJEZET 3. RENDSZERH��V�ASOK
3.11.3 POSIX threadek szinkroniz�aci�oja
A POSIX szabv�any a threadek szinkroniz�aci�oj�ara k�et alapvet}o eszk�ozt biztos��t: a mu-
texeket �es az }orfelt�etel-v�altoz�okat.
Miel}ott e k�et szinkroniz�aci�os eszk�ozt megismern�enk, megjegyezz�uk, hogy mind a mu-
texeket, mind pedig az }orfelt�etel-v�altoz�okat haszn�alatuk el}ott inicializ�alni kell, amire a
k�ovetkez}o f�uggv�enyeket haszn�alhatjuk:
int pthread_mutex_init(pthread_mutex_t *mutex,
pthread_mutexattr_t *mattr);
int pthread_cond_init(pthread_cond_t *cond,
pthread_condattr_t *cattr);
Mindk�et f�uggv�eny m�asodik argumentuma az adott szinkroniz�aci�os eszk�oz jellemz}oit
kell, hogy r�ogz��tse (err}ol r�eszletesebben a 3.11.4 pontban fogok ��rni).
Egy mutex �altal�aban a szabad �es a foglalt �allapotok valamelyik�eben van, �es a mu-
texeket k�et m}uvelettel lehet manipul�alni: a LOCK �es az UNLOCK. A LOCK m}uvelet a szabad
mutexet foglaltra �all��tja, a foglalt mutexn�el pedig addig v�arakozik a program, am��g a
mutex szabadd�a nem v�alik, �es azut�an �all��tja foglaltra a mutexet. Az UNLOCK m}uvelet
a mutexet szabadra �all��tja. Megjegyezz�uk, hogy mind a LOCK mind pedig az UNLOCK
m}uveletn�el le��rtak atomi, oszthatatlan m�odon t�ort�ennek, ez�ert egy szabad mutexet k�et
egym�ast�ol f�uggetlen LOCK semmik�eppen nem �all��that foglaltt�a: ilyenkor el}osz�or csak az
egyik LOCK lesz sikeres, majd miut�an a sikeres LOCK-ot v�egrehajt�o kiadja az UNLOCK-ot,
azut�an fogja a m�asik (LOCK-ra v�arakoz�o) a mutex �allapot�at foglaltt�a m�odos��tani. (A mu-
tex l�enyeg�eben egy bin�aris szemafor funkci�oj�at val�os��tja meg; a LOCK �es az UNLOCK pedig
a Dijkstra-f�ele P/V szemaform}uveleteket implement�alj�ak.)
A LOCKm}uvelet a pthread mutex lock() f�uggv�ennyel van implement�alva,m��g az UNLOCK
a pthread mutex unlock() f�uggv�ennyel implement�alhat�o. Ezeknek a protot��pusa a
k�ovetkez}o:
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
A pthread mutex trylock() f�uggv�eny lefoglalt (LOCK-olt �allapotban lev}o) mutex
megad�asa eset�en nem v�arakozik, mint a pthread mutex lock(), hanem -1 visszat�er�esi
�ert�ekkel azonnal visszat�er, �es az errno v�altoz�oban az EBUSY hibak�od-konstanst helyezi
el. Ha szabad a mutex, akkor pedig v�egrehajt rajta egy LOCK lefoglal�asi m}uveletet, �es
�ugy t�er vissza.
Az }orfelt�etel-v�altoz�okat hosszabb v�arakoz�asok eset�en �erdemes haszn�alni. A mutex-
eket csak r�ovid ideig tart�o, threadek k�ozti k�olcs�on�os kiz�ar�as megszervez�es�ere haszn�aljuk,
�es egy mutexet foglal�o threadet soha ne v�arakoztassuk meg hosszabb ideig (a gyakorlat-
ban �altal�aban a mutexekkel egy-egy (konstans) �ert�ekad�as oszthatatlans�ag�at szokt�ak biz-
tos��tani �ugy, hogy az �ert�ekad�as el�e beraknak egy LOCK, m�og�e pedig egy UNLOCK m}uveletet
egy, az �ert�ekad�as bal oldal�an �all�o v�altoz�ot "v�ed}o" mutexszel). Az }orfelt�etel-v�altoz�okat
�altal�aban a hosszabb idej}u v�arakoztat�asokra haszn�alj�ak, amikor eg�eszen addig kell v�arni,
am��g egy er}oforr�as fel nem szabadul. �Altal�aban minden }orfelt�etel-v�altoz�ohoz tartozik
egy mutex objektum is, aminek a haszn�alat�at az }orfelt�etel-v�altoz�on �ertelmezett k�et
3.11. POSIX-THREADEK 63
alapm}uvelet bemutat�asakor ismertetek. Az }orfelt�etel-v�altoz�okon k�et alapvet}o m}uvelet
van de�ni�alva: a v�arakoz�as �es a "szabad" jelz�es k�uld�ese az }orfelt�etel-v�altoz�on v�arakoz�o
folyamat(ok) r�esz�ere.
Egy }orfelt�etel-v�altoz�on val�o v�arakoz�as �ugy van de�ni�alva (�es megval�os��tva), hogy
UNLOCK-olja a hozz�a tartoz�o mutexet, �es v�arakozik, am��g az }orfelt�etel-v�altoz�on egy m�asik
thread nem jelez "szabad" jelz�est (�es e k�et m}uvelet "atomi", oszthatatlan m�odon hajt�odik
v�egre). Term�eszetesen a v�arakoz�o m}uvelet h��v�asa el}ott a mutexet LOCK m}uvelettel �at kell
�all��tani. Az }orfelt�etel-v�altoz�on�al v�arakoz�asi m}uvelet protot��pusa a k�ovetkez}o:
int pthread_cond_wait(pthread_cond_t *cond,
pthread_mutex_t *mutex);
A m}uvelet els}o argumentum annak az }orfelt�etel-v�altoz�onak a neve, amelyre
vonatkoz�oan k�es}obb a "szabad" jelz�est v�arjuk; a m�asodik argumentum pedig a { h��v�as
el}ott { LOCK-olt mutexet adja meg. Ennek a f�uggv�enynek a haszn�alatakor el}ofordulhat
{ ha kis val�osz��n}us�eggel is {, hogy a visszat�er�esekor az }orfelt�etel-v�altoz�o nincs "szabad"
�allapotban, vagyis tov�abb kell v�arni (ez akkor fordulhat el}o, ha egy }orfelt�etel-v�altoz�on�al
egyidej}uleg t�obb thread v�arakozott, �es a "szabad" jelz�es ut�an el}osz�or �utemezett thread
lefoglalja az er}oforr�ast, a t�obbi threadnek pedig �ujra v�arakoznia kell). A f�uggv�eny vis-
szat�er�esekor az garant�alva van, hogy a mutex LOCK-olt �allapotban van a visszat�er�es
ut�an, ��gy az el}obb eml��tett { "hamis szabad jelz�es" { probl�em�ara megold�ast jelenthet
e f�uggv�enynek a ciklusban val�o v�egrehajt�asa addig, am��g t�enylegesen megszerezt�uk az
er}oforr�ast.
A v�arakoz�asra vonatkoz�oan id}okorl�atot is lehet adni a pthread cond timedwait()
f�uggv�ennyel (ilyenkor nincs garant�alva, hogy az er}oforr�as a megadott id}on bel�ul felsz-
abadul, csak az, hogy ez a f�uggv�eny legk�es}obb az adott id}o m�ulva visszat�er).
Egy }orfelt�etel-v�altoz�ora "szabad" jelz�es k�uld�ese a pthread cond signal() illetve a
pthread cond broadcast() f�uggv�ennyel lehets�eges. Ezek k�oz�ul az els}o csak egy threadet
enged tov�abbfutni, a m�asodik pedig az }orfelt�etel-v�altoz�on v�arakoz�o �osszes threadet
tov�abbengedi6. E k�et f�uggv�eny protot��pusa a k�ovetkez}o:
int pthread_cond_signal(pthread_cond_t *cond);
int pthread_cond_broadcast(pthread_cond_t *cond);
Mindk�et f�uggv�eny egyetlen argumentuma az az }orfelt�etel-v�altoz�o, amelyn�el v�arakoz�o
folyamatok fut�as�at tov�abb akarjuk engedni. Az }orfelt�etel-v�altoz�ok haszn�alat�ara tek-
ints�uk a k�ovetkez}o p�eld�at { az els}o programr�eszlet egy er}oforr�ast lefoglalni sz�and�ekoz�o
threadb}ol sz�armazik, m��g a m�asodik egy, az er}oforr�ast eddig birtokl�o, de a haszn�alati
jog�ar�ol lemondani sz�and�ekoz�o thread �altal lesz v�egrehajtva.
pthread_mutex_lock(&mutex);
...
while (!szabad)
6Vagyis ez okozhatja a fent eml��tett "hamis szabad jelz�es" probl�em�at { ugyanakkor gondoljuk meg, hogyegyes probl�em�ak megold�asa sor�an erre sz�uks�eg lehet, mivel p�eld�aul egy adatb�azis olvas�as�at egyszerre t�obbfolyamat is v�egezheti, ��r�as�at pedig legfeljebb egy, ez�ert ha egy, az adatb�azist egyed�ul haszn�al�o ��r�o folya-
mat munk�aj�anak befejez�ese ut�an az �osszes olvas�ot egyszerre akarjuk tov�abbind��tani (hiszen k�ozt�uk nem kellk�olcs�on�os kiz�ar�ast biztos��tani), akkor az �osszes v�arakoz�o folyamatot tov�abb kell engedni, �es az egy m�asikmegoldand�o probl�ema lesz, hogy ��r�o folyamatokat ne engedj�unk tov�abb, csak az olvas�okat (ha van olvas�o).
64 FEJEZET 3. RENDSZERH��V�ASOK
pthread_cond_wait(&cond, &mutex);
szabad=FALSE;
pthread_mutex_unlock(&mutex);
Tekints�uk az er}oforr�as haszn�alati jogr�ol lemondani sz�and�ekoz�o threadb}ol sz�armaz�o
r�eszletet:
pthread_mutex_lock(&mutex);
szabad=TRUE;
pthread_mutex_unlock(&mutex);
pthread_cond_signal(&cond);
Mind a mutexeknek mind pedig az }orfelt�etel-v�altoz�oknak megvannak a megsz�untet}o
m}uveletei (destruktor m}uveletek). Ezeknek a protot��pusa a k�ovetkez}o:
int pthread_mutex_destroy(pthread_mutex_t *mutex);
int pthread_cond_destroy(pthread_cond_t *cond);
3.11.4 Mutexek illetve }orfelt�etel-v�altoz�ok attributu-
mai
Mind a mutexek, mind
pedig az }orfelt�etel-v�altoz�ok egyes jellemz}oit l�etrehoz�asukkor r�ogz��teni kell. Erre val�o
a l�etrehoz�o pthread mutex init() illetve a pthread cond init() f�uggv�enyek m�asodik
argumentum�aban megadhat�o (pontosabban megadand�o) attributum objektum { vannak
mutex attributum objektumok illetve }orfelt�etel-v�altoz�o attributum objektumok is (ezek
nem azonosak!).
Egy mutex attributum v�altoz�ot (t��pusa pthread mutexattr t a C nyelven) a
pthread mutexattr init() f�uggv�ennyel inicializ�alhatunk, amelynek egyetlen argumen-
tuma az inicializ�aland�o mutex attributum objektum (mem�oriabeli c��me). A f�uggv�eny
protot��pusa a k�ovetkez}o:
int pthread_mutexattr_init(pthread_mutexattr_t *mattr);
Egy mutex attributum v�altoz�ot megsz�untetni a pthread mutexattr destroy()
m}uvelettel lehet. Ennek protot��pusa a k�ovetkez}o:
int pthread_mutexattr_destroy(pthread_mutexattr_t *mattr);
Az }orfelt�etel-v�altoz�o attributum objektumok l�etrehoz�as�at illetve megsz�untet�es�et a
fentiekhez hasonl�o funkci�oj�u f�uggv�enyekkel v�egezhetj�uk el, melyeknek protot��pusa a
k�ovetkez}o:
int pthread_condattr_init(pthread_condattr_t *cattr);
int pthread_condattr_destroy(pthread_condattr_t *cattr);
3.11. POSIX-THREADEK 65
3.11.5 K�onyvt�arak thread-biztoss�aga
Az oper�aci�os rendszer fejleszt}oi k�ornyezet�ehez tartoz�o k�onyvt�arak gyakran haszn�alnak
glob�alis v�altoz�okat �ugy, hogy a m�odos��t�asuk (illetve kiolvas�asuk) nincs mutexekkel v�edve
(a v�altoz�o��r�oi valamint olvas�oi k�ozt nincs megval�os��tva a megfelel}o k�olcs�on�os kiz�ar�as). Ez
sok probl�em�at okozhat, aminek az a k�ovetkezm�enye, hogy ezek a k�onyvt�arak m�odos��t�as
n�elk�ul nem haszn�alhat�oak t�obb threadet alkalmaz�o programokban. Ezen lehet seg��teni
�un. thread-k�openyekkel, amik egy egyszer}u szinkroniz�aci�os mechanizmust t�amogatnak:
egyetlen k�oz�os glob�alis mutexszel v�edik a k�onyvt�ar f�uggv�enyeit �ugy, hogy egyszerre legfel-
jebb egy f�uggv�eny lehet akt��v. Ezt a szinkroniz�aci�os mechanizmust �ugy meg lehet
val�os��tani, hogy minden f�uggv�eny t�orzse el�e el kell helyezni egy, a glob�alis mutexre
vonatkoz�o LOCK m}uveletet, valamint a t�orzs v�eg�ere egy ugyanarra a mutexre vonatkoz�o
UNLOCK m}uveletet.
Gondoskodni kell m�eg a mutex inicializ�al�as�ar�ol, amit egy, a program elej�en
megh��vand�o seg�edf�uggv�ennyel oldhatunk meg.
Vagyis az eredeti k�onyvt�ar egy f�uggv�enye a k�ovetkez}ok�eppen m�odosul (ha "tiszt-
ess�eges" programot akarunk ��rni, akkor gondoskodni kell ennek a mutexnek a deal-
lok�al�as�ar�ol is { ehhez meg kell ��rni ugyanitt egy elj�ar�ast, amit p�eld�aul a f}oprogramunk
v�eg�en megh��vhatunk):
...
static int kell_inic=TRUE;
static pthread_mutex_t mutex;
static pthread_mutexattr_t mattr;
...
fv_nevxxx(...)
{
pthread_mutex_lock(&mutex);
fv_nevxxx_EREDETI_TORZSE; /* Ide jon a fuggveny eredeti torzse */
pthread_mutex_unlock(&mutex);
}
...
fv_init()
{
pthread_mutexattr_init(&mattr);
pthread_mutex_init(&mutex);
}
A thread-ekkel kapcsolatban probl�em�at okozhat az, ha egy rendszerh��v�as blokkol
(p�eld�aul egy read() m}uvelet addig blokkol, am��g nincs meg a sz�uks�eges mennyis�eg}u
input adat. Ezt a megfelel}o f�ajldeszkriptor nem-blokkol�ora �all��t�as�aval lehet kik�usz�ob�olni
(persze ezzel a programunkat kicsit bonyolultabb lesz meg��rni, de lehet}ov�e v�alik az I/O
p�arhuzamoss�a t�etele, ami miatt a thread-eket gyakran haszn�alj�ak).
Egy fd f�ajldeszkriptorra vonatkoz�o m}uveleteket egy folyamaton bel�ul a k�ovetkez}o
f�uggv�enyh��v�assal tehetj�uk nem-blokkol�ov�a:
fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NONBLOCK);
66 FEJEZET 3. RENDSZERH��V�ASOK
Vagyis ezut�an az fd f�ajldeszkriptorra vonatkoz�o I/O m}uveletek csak annyi adatot
��rnak olvasnak be/��rnak ki, amennyinek "hely van", vagyis amennyit v�arakoz�as n�elk�ul ki
tudnak ��rni, majd visszat�ernek (�altal�aban visszaadva azt, hogy mennyi adatot siker�ult
ki��rni). Egy f�ajldeszkriptorra vonatkoz�o m}uveletek blokkol�ora vissza�all��t�asa a k�ovetkez}o
f�uggv�enyh��v�assal v�egezhet}o el:
fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) & ~O_NONBLOCK);
3.11.6 Folyamatok kommunik�aci�oja a UNIX-ban
A UNIX oper�aci�os rendszernek t�obb elterjedt v�altozata is van: egyik v�altozata az AT&T
ill. Novell UNIX v�altozata (a System V Release 4), a m�asik l�enyeges v�altozata a Berkeley
UNIX (p�eld�aul a 4.3BSD). Vannak m�as UNIX-szer}u rendszerek is, mint p�eld�aul a Linux,
amelyr}ol itt nem��rok r�eszletesebben, mert { legal�abbis sz�amunkra { nincs l�enyeges elt�er�es
az "igazi" UNIX rendszerek �es a Linux k�oz�ott.
A UNIX rendszerek nem tekinthet}ok osztott rendszereknek, b�ar a UNIX h�al�ozati
lehet}os�egei nagyon sokr�et}uek. A transzparencia (p�eld�aul a kommunik�aci�o transz-
parenci�aj�anak) hi�anya tal�an a legf}obb oka annak, hogy a UNIX rendszert �altal�aban nem
tekintik osztott oper�aci�os rendszernek. A UNIX sokf�ele kommunik�aci�os eszk�ozzel ren-
delkezik:
� Az SVR4 UNIX tartalmazza a szemaforokat, �uzenetcsatorn�akat, osztott
mem�ori�at mint kommunik�aci�os eszk�oz�oket, amelyek a Columbus UNIX-ban let-
tek kifejlesztve (a UNIX egy kutat�asi v�altozat�aban), �es a System V UNIX-nak sz-
abv�anyos r�esze; a BSD UNIX-nak ezek az eszk�oz�ok sok�aig nem voltak r�eszei, vagyis
az ezeket az eszk�oz�oket alkalmaz�o programokat nehezebb volt �atvinni a nem System
V sz�armaz�ek UNIX rendszerekre. Ezeknek az eszk�oz�oknek fontos jellemz}oje, hogy
b�arki hozz�af�erhet, aki a hozz�ajuk tartoz�o �un. glob�alis egyedi kulcsot (unique
key) ismerik. L�etezik olyan rendszerszolg�altat�as, amely l�etrehoz egy �uj kommu-
nik�aci�os eszk�ozt (b�armelyiket a h�arom k�oz�ul) egy megadott egyedi kulccsal { ha
az adott egyedi kulcshoz m�eg nem hozt�ak l�etre a kommunik�aci�os eszk�ozt, akkor a
rendszer azt l�etrehozza, egy�ebk�ent pedig a rendszer hiba�uzenetet ad. Tov�abb�a van
olyan m}uvelet, amely egy m�ar l�etrehozott kommunik�aci�os eszk�ozh�oz (egyedi kulcsa
alapj�an) hozz�af�er�esi lehet}os�eget ad a folyamatnak. Term�eszetesen vannak olyan
m}uveletek, amelyekkel a kommunik�aci�os eszk�oz�on a kommunik�aci�ot v�egzhetj�uk.
� A Berkeley UNIX kommunik�aci�os eszk�oze a socket rendszer. A socket l�enyeg�eben
egy kommunik�aci�os v�egpont absztrakci�oja, a kommunik�aci�o pedig ezeknek az
�osszekapcsol�as�an kerezzt�ul folyhat. Minden socket r�esze valamelykommunik�aci�os
domain-nek: �altal�aban annak, hogy programok kommunik�alhassanak, sz�uks�eges
felt�etele, hogy a kommunik�aci�ot l�etes��t}o (�osszekapcsolt) socketok azonos domainbe
tartozzanak. Minden sockethoz tartozik egy c��m (ez a c��m lehet egy Internetbeli IP
c��m vagy egy DECnet c��m { vagy ak�ar egy f�ajln�ev { att�ol f�ugg}oen, hogy a socket
Internet, DECnet, vagy UNIX domainben lett l�etrehozva). Tov�abb�a minden sock-
ethoz tartozik egy karakter-sorozat, amely a kommunik�aci�o sor�an elk�uld�ott, de m�eg
nem feldolgozott (beolvasott) adatokat t�arolja. A socket rendszerben lehet}os�eg van
socketok l�etrehoz�as�ara, sockethoz c��m hozz�arendel�es�ere, k�et azonos domainben lev}o
socket �osszekapcsol�as�ara, �es lehet}os�eg van �osszekapcsolt socketok k�ozt adat�atvitelre.
3.11. POSIX-THREADEK 67
A 4.4BSD UNIX kernelje jeleneg tartalmazza a TCP/IP, az X.25, a Xerox Network
System �es az OSI TP4 �es az OSI CLNP protokollcsal�adok implement�aci�oj�at, �es az
ezekhez val�o hozz�af�er�est a socket interf�eszen kereszt�ul teszi lehet}ov�e.
A Berkeley socket rendszer az AT&T TLI-j�ehez k�epest (ld. ezt lejjebb) egyszer}ubb,
kiss�e hi�anyos programoz�oi interf�esz a h�al�ozati szolg�altat�asokhoz, ugyanis ter-
vez�esekor m�eg nem voltak kikrist�alyosodva a transzport szolg�altat�okt�ol sz�elesebb
k�orben elv�art szolg�altat�asok �es egyes szolg�altat�asok absztrakci�oja sem volt igaz�an
sikeres (ezzel kapcsolatban gyakran eml��tik a s�urg}os adattal kapcsolatban biz-
tos��tott szolg�altat�asok k�ul�onb�oz}os�egeit is, amit azonban a transzport-protokollok
s�urg}os adat fogalm�anak de�n��ci�oj�anak k�ul�onb�oz}os�egei okozz�ak). A Berkeley socket
rendszer n�eh�any hi�anyoss�ag�ara a TLI-r}ol sz�ol�o pont v�eg�en fogok utalni.
� Az AT&T UNIX System V Release 3.0 r�eszek�ent lett ismert a TLI (Trans-
port Layer Interface) mint egy interf�esz r�eteg az OSI referenciamodell tran-
szport r�eteg�enek szolg�altat�asaihoz (a szerkezete, fel�ep��t�ese sokmindenben az
ISO Transzport Szolg�altat�as�anak De�n��ci�oj�an alapszik). Terminol�ogi�aj�aban a
TLI a kommunik�aci�os v�egpontot (ami �altal�aban egy processz) transzport
v�egpontnak nevezi, az oper�aci�os rendszer �altal a felhaszn�al�oi programoknak
ny�ujtott h�al�ozati transzport-protokoll szolg�altat�asok implement�aci�oj�at pedig tran-
szport szolg�altat�onak nevezi. M��g a Berkeley socket rendszer a BSD UNIX-
ban rendszerh��v�asokk�ent �erhet}o el, addig a TLI egy k�onyvt�ar, amely kapcsola-
tot teremt a transzport szolg�altat�o �es a transzportv�egpont k�oz�ott (a transzport
szolg�altat�o �altal�aban STREAMS device driverek �es a r�ajuk �ep�ul}o STREAMS
modulok form�aj�aban van a kernelben implement�alva), teh�at a TLI nem egy
transzport-protokoll implement�aci�o. Az AT&T UNIX System V Release 4.0-
ig (SVR4) a UNIX AT&T v�altozata nem tartalmazott transzport szolg�altat�ot, majd
a SVR4-ben megjelent a DARPA Internet TCP/IP protokollcsal�adj�anak egy im-
plement�aci�oja transzport szolg�altat�ok�ent.
A Berkeley socket interf�esz az ISO Transzport Szolg�altat�as�anak De�n��ci�oj�an�al
kor�abban sz�uletett, ��gy az ISO Transzport Szolg�altat�asainak egyes r�eszei a Berkeley
socket rendszeren kereszt�ul nem el�erhet}ok:
{ A Berkeley socket rendszer nem teszi lehet}ov�e az ISO Transzport Protokoll
De�n��ci�oban szerepl}o kapcsolatfelv�etel elutas��t�ast: egy kapcsolat automatiku-
san fel�ep�ul miel}ott a felhaszn�al�oi program b�armit is megtudhatna a kommu-
nik�aci�os partnerr}ol, �es csak ezut�an van lehet}os�eg a kapcsolat lebont�as�ara,
amir}ol azonban a kommunik�aci�os partner tudom�ast szerezhet (de egyes
szolg�altat�asokn�al ezt illene "titkosan" kezelni).
{ A Berkeley socket rendszerben nincs lehet}os�eg alkalmaz�asoknak transzport-
protokollt�ol f�uggetlen elk�esz��t�es�ere: �altal�aban nincs lehet}os�eg a haszn�aland�o
transzport-protokoll fut�asid}obeni (hordozhat�o m�odon t�ort�en}o) kiv�alaszt�as�ara,
vagy legal�abbis a rendelkez�esre �all�o lehet}os�egek sokkal rugalmatlanabbak a
TLI-ny�ujtotta lehet}os�egekn�el.
{ A Berkeley socket rendszer nem teszi lehet}ov�e kapcsolatfelv�etelkori illetve
kapcsolatlez�ar�askori adatok �atvitel�et, m��g a TLI erre lehet}os�eget ny�ujt.
A TLI ezen k��v�ul biztos��tja a Network Selection Facility n�ev alatt �osszefoglalt
lehet}os�egeivel azt, hogy a programokat transzport-protokoll f�uggetlen m�odon
68 FEJEZET 3. RENDSZERH��V�ASOK
lehessen elk�esz��teni, leford��tani, �es a haszn�aland�o transzport-protokollt csak a pro-
gram futtat�asakor kell speci�k�alni bizonyos UNIX k�ornyezetv�altoz�okban. A pro-
gramok a transzport szolg�altat�o egyes param�etereit a fut�asid}oben lek�erdezhetik
�es ezzel lehet}os�eg�uk van7 alkalmazkodni a helyi transzport szolg�altat�ohoz (azaz a
transzport-protokoll egyes jellemz}oit, p�eld�aul azt, hogy biztos��tja-e a s�urg}os adat
tov�abb��t�as�at vagy sem, biztos��t-e lehet}os�eget kapcsolatfelv�etelkori adatcser�ere vagy
sem, : : : )
A UNIX a fenti alapvet}o kommunik�aci�os eszk�oz�oket ny�ujtja az alkalmaz�asoknak. Erre
sz�amos alkalmaz�ast �ep��tettek, mint p�eld�aul a folyamatok t�avoli elind��t�as�at lehet}ov�e tev}o
rsh alkalmaz�ast (ez az �un. t�avoli shell szolg�altat�as), a t�avoli termin�al szolg�altat�ast
ny�ujt�o rlogin illetve telnet alkalmaz�ast, a h�al�ozati f�ajlrendszert: az NFS-t. Lehet}os�eg
van t�avoli elj�ar�ash��v�as v�egz�es�ere is (p�eld�aul a Sun Microsystems �altal ingyen b�arkinek a
rendelkez�es�ere bocs�atott RPC �es XDR szoftver-csomagokkal), amelynek a l�enyege az,
hogy a h�al�ozati interf�eszhez (p�eld�aul a socket rendszerhez) a karakter-sorozat �atvitelre
�ep�ul}o kapcsolati modell helyett egy elj�ar�as-h��v�asi kapcsolati modellt biztos��t a pro-
gramoz�onak: azaz a programoz�o a h�al�ozatban elosztott8 alkalmaz�as-komponensek k�ozti
kommunik�aci�ot nem a komponensek k�ozt l�etrehozott adatcsatornak�ent l�atja, hanem a
t�avoli elj�ar�ash��v�asi szoftver a szok�asos elj�ar�ash��v�asok form�aj�aban teszi lehet}ov�e az alka-
lmaz�as-komponensek kommunik�aci�oj�anak megszervez�es�et, �es ezzel leveszi a programoz�o
v�all�ar�ol az alacsonyszint}u kommunik�aci�os adatcsatorna kezel�es�enek gondjait (�altal�aban
az RPC-szoftverek az elj�ar�as-fejek speci�k�aci�oja alapj�an legener�alj�ak az alacsonyszint}u
kommunik�aci�os adatcsatorna kezel�es�et v�egz}o elj�ar�asokat).
A UNIX oper�aci�os rendszerben sz�amos m�as eszk�ozt megtal�alhatunk egy�uttm}uk�od}o
folyamatok kommunik�aci�oj�anak megold�as�ara: minden UNIX rendszerben megtal�alhat�o
kommunik�aci�os eszk�oz a pipe. Ez l�enyeg�eben egy egyir�any�u adatcsatorna, mely
kiz�ar�olag k�oz�os }ost}ol sz�armaz�o folyamatok k�ozt j�ohet l�etre (egy pipe v�eg�en nem kell
felt�etlen�ul k�ul�onb�oz}o folyamatoknak lenni { egy pipenak ak�ar mindk�et v�eg�et is kezelheti
egy folyamat (ezzel p�eld�aul megoldhat�o adatok �atment�ese egy exec() rendszerh��v�ast
k�ovet}oen az �ujonnan elind��tott alkalmaz�as r�esz�ere). Megjegyezz�uk, hogy a UNIX mai
v�altozataiban (pl. System V Release 4, 4.4BSD) a pipe m�ar k�etir�any�u (full-duplex)
kapcsolatot biztos��that a folyamatok k�ozt, de m�eg tov�abbra is l�enyeges korl�atoz�as az
alkalmazhat�os�ag�aval kapcsolatban az, hogy a kommunik�alni sz�and�ekoz�o folyamatok-
nak egy k�oz�os }ost}ol kell sz�armazniuk. Erre a probl�em�ara a n�evvel ell�atott pipe-ok
ny�ujthatnak megold�ast: ekkor ugyanis a hagyom�anyos pipe-okt�ol elt�er}oen a kommu-
nik�aci�os csatorna v�egeihez a kommunik�alni k��v�an�o felek nem egy, a processzre n�ezve
lok�alis, csak lesz�armazottak fel�e �or�ok�olhet}o f�ajldeszkriptoron kereszt�ul f�erhetnek hozz�a,
hanem a kommunik�aci�os csatorna v�egpontjaihoz hozz�a lehet rendelni egy f�ajlrendszerbeli
nevet, amit az �osszes folyamat el�erhet f�uggetlen�ul att�ol, hogy van-e k�oz�os }osuk vagy nincs
(itt a f�ajlrendszerben haszn�alatos rwx-bitek seg��ts�eg�evel korl�atozhat�o a kommunik�al�o
partnerek k�ore). Fontos megeml��teni, hogy mind a pipe mind pedig a n�evvel ell�atott
pipe a UNIX f�ajlrendszer szok�asos m}uveleteivel kezelhet}o (t�obbek k�ozt read() illetve
write() rendszerh��v�asok seg��ts�eg�evel).
7Ez alatt azt kell �erteni, hogy akkor van lehet}os�eg a helyi transzport szolg�altat�ohoz val�o alkalmazkod�asra,ha a programot olyanra ��rt�ak, hogy alkalmazkodni tudjon a helyi transzport szolg�altat�ohoz.
8Az elosztott fogalmat itt nem a kor�abban m�ar bemutatott osztott rendszer osztotts�ag�anak �ertelm�ebenhaszn�alom, hanem egyszer}uen az alkalmaz�as sz�etdarabol�as�at �ertem ezalatt.
3.12. K�ERD�ESEK 69
3.12 K�erd�esek
1. Pr�ob�aljuk ki, hogy mit ��r ki a k�ovetkez}o program! (Mi�ert �erdekes ez?)
#include <stdio.h>
main()
{
int fd1,fd2;
char c;
fd1=creat("/tmp/tfil1",0770);
write(fd1,"alma",4);
close(fd1);
fd1=open("/tmp/tfil1",0);
fd2=dup(fd1);
read(fd1,&c,1);
printf("%c",c);
read(fd2,&c,1);
printf("%c",c);
close(fd2);
close(fd1);
}
2. Az fstat rendszerh��v�as nem f�ol�osleges? Minden esetben lehet a stat rendsz-
erh��v�assal "helyettes��teni"?
3. Mit csin�al a k�ovetkez}o program? (Tegy�uk fel, hogy a C ford��t�onk nem v�egez opti-
maliz�aci�ot.)
#include <signal.h>
int i;
elj1()
{
i=23;
}
main()
{
printf("START!\n");
signal(SIGINT,elj1);
i=0;
while (i==0) {
kill(getpid(),SIGINT);
}
printf("STOP!\n");
70 FEJEZET 3. RENDSZERH��V�ASOK
}
4. B}ov��ts�uk a shell�unket tov�abbi UNIX shell metakarakterekkel! (P�eld�aul a >>, &, <,
stb...)
5. B}ov��ts�uk a shell�unket shell-v�altoz�ok kezel�es�enek lehet}os�eg�evel.
6. B}ov��ts�uk a shell�unket egyszer}ubb vez�erl�esi szerkezetekkel.
7. B}ov��ts�uk a shell�unket a pipe lehet}os�eggel. Gondoljuk meg, hogy a pipe-ba kapcsolt
folyamatokat milyen sorrendben kell/�erdemes elind��tani ahhoz, hogy a szok�asos
UNIX shellekben megismert m�odon m}uk�odjenek.
8. Jellemezz�uk �es hasonl��tsuk �ossze egym�assal a threadek szinkroniz�aci�oj�ara
haszn�alatos eszk�oz�oket!
9. K�esz��ts�unk el egy thread-biztos B-fa k�onyvt�arat: egy olyan B-fa adatszerkezetet
kezel}o k�onyvt�arat, amelynek az elj�ar�asai egyszerre t�obb threadb}ol h��vhat�oak, �es
pr�ob�aljunk meg min�el �nomabb szinkroniz�aci�os mechanizmust be�ep��teni, azaz
pr�ob�aljunk meg min�el magasabb fok�u p�arhuzamoss�agot megengedni.
10. A thread-ekr}ol sz�ol�o r�eszben ismertetett thread-k�openy mechanizmus illetve imple-
ment�aci�o milyen esetekben nem megfelel}o (milyen esetben okozhat holtpontot)?
Fejezet 4
H�al�ozatok
A h�al�ozat �altal�aban t�obb egym�ashoz kapcsolt sz�am��t�og�epb}ol �all, amelyek k�oz�ott lehet}os�eg
van inform�aci�ocser�ere �es er}oforr�asmegoszt�asra. A h�al�ozatba kapcsolt g�epeket hostoknak
nevezik, �es minden ilyen hostnak van egy egyedi azonos��t�oja (�es ezzel egy�utt egy egyedi
c��me). Szok�as megk�ul�onb�oztetni a helyi h�al�ozatokat (LAN- okat), �es a nagyt�avols�ag�u
h�al�ozatokat (WAN-okat). A LAN-ok �atviteli sebess�ege t�obb megabit/sec., m��g a
WAN-ok�e gyakran csak 9600 bit/sec. Az internet (vagy internetwork) t�obb ilyen
egym�assal �osszekapcsolt LAN-b�ol illetve WAN-b�ol �all (�es ez nemcsak az INTERNETre
vonatkozik).
A sz�am��t�og�epek k�oz�otti kommunik�aci�o szigor�u szab�alyok (protokollok) szerint zaj-
lik, �es mivel ezek a protokollok nagyon �osszetettek, ez�ert �un. logikai szintekre osztott�ak
}oket az�ert, hogy k�onnyebben lehessen }oket kezelni �es implement�alni. Egy lehets�eges sz-
intfeloszt�as a k�ovetkez}o: �zikai kapcsolat szintje, adatkapcsolati szint, h�al�ozati
szint �es a transzport szint.
A �zikai szint speci�k�alja a �zikai adat�atviteli k�ozeg param�etereit: p�eld�aul azt, hogy
mekkora lehet az �osszekapcsolt g�epek k�ozt kifesz��tett dr�ot maxim�alis hossza, mekkora
fesz�ults�eg jelenti a logikai 1-et illetve a logikai 0-�at, stb.
Az adatkapcsolati szint speci�k�alja p�eld�aul az ellen}orz}o�oszeg kisz�am��t�asi m�odj�at, az
�atviend}o bitfolyam feldarabol�as�anak (az �un. keretk�epz�es) szab�alyait �es m�eg sok m�as
dolgot. Ez �es a �zikai szint egy�ertelm}uen meghat�arozz�ak az egym�assal �zikailag (p�eld�aul
dr�ottal) �osszekapcsolt sz�am��t�og�epek k�oz�ott lezajl�o kommunik�aci�o szab�alyait.
A h�al�ozati szint feladata annak a megold�asa, hogy a kommunik�aci�o ne csak az
egym�assal k�ozvetlen kapcsolatban lev}o g�epek k�oz�ott folyhasson, hanem k�et tetsz}oleges
h�al�ozatba kapcsolt host k�oz�ott is, ez�ert a h�al�ozati r�eteg (illetve a h�al�ozati protokoll) fe-
ladata a csomagoknak a forr�ashostt�ol a c�elhostig t�ort�en}o elir�any��t�asa, az �utvonalkijel�ol�es
(routing).
A transzport szint feladata az, hogy adatokat fogadjon a felette lev}o szoftver-
r�etegt}ol, kisebb darabokra v�agja sz�et azokat �es tov�abb��tsa a h�al�ozati r�eteg fel�e. Majd
a c�el�allom�ason az ottani transzport szint feladata lesz az egyes csomagoknak az eredeti
sorrendbe rendez�ese. A legt�obb hoston egyszerre t�obb folyamat is futhat, ez�ert sz�uks�eg
lehet t�obb transzport-kapcsolatnak a h�al�ozati r�etegre t�ort�en}o amultiplexel�es�ere (illetve
demultiplexel�es�ere). Ennek a megold�asa is a transzport szintre tartozik.
Egyes szabv�anyok ezeken k��v�ul m�as szinteket is de�ni�alnak, az OSI p�eld�aul a
viszonyszintet, amely a t�obb f�el k�oz�ott kialakult kapcsolat szinkroniz�al�as�ara szolg�al;
az adat�abr�azol�asi szintet, amely p�eld�aul a h�al�ozaton kereszt�ulhalad�o adatok bels}o
71
72 FEJEZET 4. H �AL �OZATOK
�abr�azol�as�anak, titkos��t�as�anak �es t�om�or��t�es�enek m�odj�aval foglalkozik. Ez az�ert is fontos,
mert az �un. host byte order gyakran elt�er a network byte ordert}ol. (A network
byte order { a h�al�ozati bytesorrendre vonatkoz�o szabv�any { a Motorola proceszorok bels}o
�abr�azol�asi form�aj�aval egyezik meg, �es nem az Intel�evel! A reprezent�aci�os probl�em�ak
azokn�al a g�epekn�el is el}oj�onnek, ahol egy byte nem 8, hanem esetleg 9 vagy 10 bitet
tartalmaz (ilyen is van ...). Ez�ert a legt�obb h�al�ozati terminol�ogi�aban a bitn�el "sz�elesebb"
adategys�egk�ent nem a byteot, hanem az oktettet haszn�alj�ak, amimindenk�eppen 8 bitb}ol
�all, �es az egyes hostok feladata a "helyi" byte<-->oktett transzform�aci�o megold�asa.)
Fontos, hogy ezek a protokollok azt nem speci�k�alj�ak, hogy a programok ezeket a
szolg�altat�asokat hogyan, milyen programoz�oi interf�eszen kereszt�ul vehetik ig�enybe.
Ez �altal�aban nagyon oper�aci�os rendszert}ol f�ugg}o dolog: a UNIX rendszerekben ilyen
interf�eszek a Berkeley socket interface �es a TLI (Transport Layer Interface, sz-
abv�anyos��tott v�altozat�anak neve XTI). A BSD UNIX nagy elterjedts�ege miatt tal�an a
socket interf�esz az elterjedtebb. Az AT&T UNIX alatt is l�etezik socket interf�eszt biztos��t�o
rendszerk�onyvt�ar.
A kommunik�aci�o �altal�aban �ugy megy, hogy a felhaszn�al�oi program �atadja az �atviend}o
adatokat a transzport-szintnek, az feldarabolja az adatokat kisebb csomagokra, kieg�esz��ti
egy transzport-fejl�eccel, �es ezt �atadja a h�al�ozati szintnek. A h�al�ozati szint tov�abbi
sz�uks�eges fejl�ecekkel eg�esz��ti ki azt, �es tov�abbadja az alatta lev}o szintnek, s.��.t. Az
adatok rendeltet�esi hely�en pedig ugyanez t�ort�enik, csak ford��tott ir�anyban.
4.1 A h�al�ozati kapcsolat modellje
A h�al�ozati kapcsolat k�etf�ele lehet: �osszak�ottet�es-alap�u vagy �osszek�ottet�es-mentes.
sszek�ottet�es-alap�u kapcsolat eset�en egy "virtu�alis csatorna" keletkezik a kommunik�al�o
felek k�oz�ott, amely v�ed az adatism�etl�est}ol illetve adatveszt�est}ol. �Osszek�ottet�es-mentes
kapcsolat eset�en a kommunik�aci�o �un. datagramok k�ozvet��t�es�evel zajlik, senki sem
garant�alja azt, hogy egy elk�uld�ott datagrammeg�erkezik a c�elj�aba, sem pedig azt, hogy ha
az elk�uld�ott datagramok meg�erkeznek, akkor csak egy p�eld�anyban illetve csak az elk�uld�es
sorrendj�eben �erkezhetnek meg.
A kommunik�aci�o �altal�aban nem szimmetrikus: az egyik, a kezdem�enyez}o f�el (a kliens)
a m�asik f�elt}ol (szervert}ol) valamilyen szolg�altat�ast k�er. A h�al�ozati kommunik�aci�o leg-
gyakrabban erre az �un. kliens-szerver modellre �ep�ul.
Egy szerver szerkezete �altal�aban k�etf�ele lehet: iterativ vagy p�arhuzamos (ezt
nevezik konkurrensnek is). Az iterativ szerver �ugy m}uk�odik, hogy ciklusban fogadja,
�es kiel�eg��ti a hozz�akapcsol�odott kliensek ig�enyeit. A konkurrens szerver minden egyes
kliens�evel val�o kapcsolattart�ashoz sz�ul egy gyermek-folyamatot, ami a kliens �altal ig�enyelt
szolg�altat�asokat elv�egzi - majd �altal�aban le�all.
4.2 A TCP/IP protokollcsal�ad
A mai egyik legnagyobb h�al�ozat a DARPA Internet, amely a 70-es �evek v�eg�en ill. a
80-as �evek elej�en k�esz�ult el. A DARPA Internetbe kapcsolt g�epek egy �un. TCP/IP
protokollcsal�ad seg��ts�eg�evel kommunik�alnak egym�assal.
4.2. A TCP/IP PROTOKOLLCSAL�AD 73
4.2.1 A �zikai �es az adatkapcsolati szint
Ebben a protokollcsal�adban a �zikai �es az adatkapcsolati szintet egy �un. Ethernet
h�al�ozati csatlakoz�o biztos��tja. A hostok k�oz�ott v�egigmegy egy k�abel, �es ez az Ether-
net egy �un. CSMA/CD (Carrier Sense Multipla Access with Collision Detect) tech-
nik�aval biztos��tja azt, hogy egyszerre csak egyvalaki haszn�alja ezt a k�abelt, illetve ha
ezt nem siker�ul el�ernie, akkor az egym�assal "�utk�oz}o" ad�okat v�eletlen ideig v�arakoztatja,
majd megpr�ob�alhatnak �ujraadni. Minden egyes Ethernet csatlakoz�o-nak van egy 48-
bites egyedi c��me, �es minden egyes Ethernet csatlakoz�o csak azokat az csomagokat veszi
le a k�abelr}ol, amelynek }o a c��mzettje (vagy az �uzenet egy �un. broadcast �uzenet volt,
amit mindenkinek meg kell kapnia). Egy host ak�ar t�obb Ethernet csatlakoz�oval is ren-
delkezhet, amelyek m�as-m�as LAN-okon vannak (multihomed host). Ekkor ez a host
k�epes lesz routing-feladatokat is ell�atni: p�eld�aul az egyik h�al�ozatr�ol �uzeneteket �atk�uldeni
a m�asikra, ha sz�uks�eges (az ilyen hostokat gateway g�epeknek is nevezik).
Megjegyz�es: A TCP/IP protokollok fels}obb szintjei nagym�ert�ekben kihaszn�alj�ak azt,
hogy alattuk egy "�uzenetsz�or�asos" (azaz broadcast-re is k�epes tud�o) h�al�ozati csatlakoz�o
van, de megoldottnak tekinthet}o a TCP/IP protokolloknak soros (mondjuk egy sz-
abv�anyos RS-232) vonalon kereszt�uli haszn�alata (az IBM PC-ken a TCP/IP megy Arc-
NET h�al�ozati interface felett is).
Tov�abbi megjegyz�es: r�oviden ismertetem n�eh�any h�al�ozati csatlakoz�o eszk�oz
adat�atviteli sebess�eg�et (mivel nincs mindegyikr}ol r�eszletes inform�aci�om, ez�ert a
r�eszletesebb ismertet�est}ol ink�abb eltekintek). Ethernet k�abelk�ent (az �ep�uletet beh�al�oz�o
gerincvezet�ekk�ent) napjainkban k�etf�ele technol�ogi�at haszn�alnak: egyr�eszt a v�ekony Eth-
ernet k�abelt, m�asr�eszt a vastag Ethernet k�abelt. Mind a v�ekony mind pedig a vastag
Ethernet k�abeleken megval�os��that�o egy 10 Mbit/sec sebess�eg}u adat�atvitel (a ma (1996-
ban ...) legelterjedtebb h�al�ozati k�abelek �ugy tudom, hogy m�eg ink�abb a v�ekony Ethernet
k�abelek). A vastag Ethernet k�abeleket alkalmazvamegfelel}o (nagy sorozatban is el�erhet}o)
Ethernet k�arty�aval 100 Mbit/sec sebess�eg}u adat�atvitelt lehet megval�os��tani. Helyi
h�al�ozatok �osszekapcsol�as�ara egy k�ezenfekv}o �zikai r�etegbeli �atviteli k�ozeg a telefonvonal
(modemeken kereszt�ul). Ezeken ma a digit�alis telefonk�ozpontokon j�ol haszn�alhat�oak a
14400 bit/sec sebess�eg}u �atvitel megval�os��t�as�ara k�epes modemek, esetleg a 28800 bit/sec
sebess�eg}u modemek (m��g a gyenge nem digit�alis telefonk�ozpontokon { �ugy tudom {, hogy
a 2800-9600 bit/sec �atviteli sebess�eg az igaz�an elterjedt). Magyarorsz�agon �ugy tudom
nem haszn�alj�ak, de Amerik�aban egyre ink�abb terjednek az �un. T1-es telefonvonalak; a
transzkontinent�alis T1 vonalakon j�oval nagyobb adat�atviteli sebess�egek �erhet}ok el: kb.
1.5 Mbit/sec.
4.2.2 A h�al�ozati szint (IP)
A TCP/IP h�al�ozati szint}u protokollja az Internet Protocol (ez az IP), ez v�egzi az
csomagoknak a forr�ashostt�ol c�elhostig ir�any��t�as�at. Minden egyes hostnak (pontosabban
minden egyes Ethernet vagym�as h�al�ozati csatlakoz�onak) van egy �un. Internet c��me (IP-
c��me), ami l�enyeg�eben egy 4-byteos sz�am, �es a 4 byteot pontokkal elv�alasztva decim�alisan
szok�as megadni. Ez a c��m teljesen f�uggetlen az Ethernet-c��mekt}ol, �es �ugy lett kialak��tva,
hogy az �utvonalkijel�ol}o algoritmust a lehet}o legegyszer}ubben lehessen megoldani. Az IP-
c��m k�et r�eszb}ol �all: egy net-idb}ol �es egy host-idb}ol. A net-id azonos��tja az Internetben
az eg�esz LAN-t, m��g a host-id a LAN-on bel�ul a hostot azonos��tja. Aszerint, hogy a 4
74 FEJEZET 4. H �AL �OZATOK
byteb�ol mekkora r�esz a host-id �es mekkora a net-id szok�as megk�ul�onb�oztetni A, B �es C
oszt�aly�u IP- c��meket a k�ovetkez}ok�eppen:
0 2 4 6 8 -adik bit
........|........|........|........
Class:A 0 net-id| host-id
Class:B 10 net-id | host-id
Class:C 11 net-id | host-id
Mivel a csupa 0 �es a csupa 1 host-id broadcast m}uveletek sz�am�ara van fenntartva,
ez�ert egy C oszt�aly�u helyi h�al�ozatban maximum254 host lehet bek�otve. (A hostokat nem-
csak a fenti 4-byteos c��mekkel lehet azonos��tani, hanem szoktak nekik m�as - k�onnyebben
megjegyezhet}o - neveket is adni (p�eld�aul kutya vagy macska vagy teh�en vagy valami m�as
emberibbnek nevezett nevet). Ekkor a h�al�ozatban kell lennie egy (vagy t�obb) �ugynevezett
nameserver g�epnek, amely az "emberibb" hostnevet 4-byteos Internet c��mm�e alak��tja
(mivel az oper�aci�os rendszer bel�ul csak ezt a form�at haszn�alja). Ezt a hostn�ev --> IP-
c��m transzform�aci�ot b�armelyik programunkban elv�egeztethetj�uk az oper�aci�os rendszerrel
- erre a k�es}obbiekben m�eg visszat�er�unk. (A fent eml��tett neveket domain neveknek is
szokt�ak nevezni.)
Megjegyezz�uk, hogy a h�al�ozatba kapcsolt komponensek nevekkel val�o ell�at�asa
az Internetben sz�epen meg van oldva host szinten (vagyis az egyes hostokat,
azok h�al�ozati interf�eszeit el tudjuk l�atni egy-egy n�evvel), de a meglev}o n�ev-
s�em�aba nem igaz�an illeszthet}ok be m�as h�al�ozati er}oforr�asok, �es nincs lehet}os�eg
absztrakt h�al�ozati objektumok l�etrehoz�as�ara (ilyen objektum lehetnek p�eld�aul a
felhaszn�al�oi csoportok, vagy ak�ar felmer�ulhet az egyes g�epeken fut�o folyamatok
c��mezhet}os�eg�enek a k�erd�ese is). Ezeknek a probl�em�aknak { �ugy t}unik { egy jobb
megold�as�at k��n�alja a CCITT X.500 szabv�anya: itt abb�ol indulnak ki, hogy min-
den objektumnak vannak bizonyos attributumai, �es az objektum azonos��t�asakor
az attributumait kell megadni (p�eld�aul ilyen tekintetben az ullman.inf.elte.hu
sz�am��t�og�ep csb �es c nev}u felhaszn�al�oi �altal alkotott admin nev}u csoportj�ara az
/ORSZ�AG=hu/INT�EZM�ENY=elte/SZERVEGYS�EG=informatika/SZERVER=ullman/CSOPORT=admin
m�odon hivatkozhatn�ank, mag�ara a sz�am��t�og�epre
pedig az /ORSZ�AG=hu/INT�EZM�ENY=elte/SZERVEGYS�EG=informatika/SZERVER=ullman
m�odon hivatkozhatn�ank. Ennek a m�odszernek az a sz�eps�ege, hogy mindenfajta objektu-
mot be tudunk illeszteni ebbe a jel�ol�esrendszerbe (pontosabban: le��r�asrendszerbe).
Az IP-routing kiss�e leegyszer}us��tve a k�ovetkez}ok�eppen megy: adott egy forr�as-IP-
c��m �es egy c�el-IP-c��m. Ha a k�et c��m net-id r�esze megegyezik, akkor a k�et �allom�as egy
h�al�ozaton van (ha nincsenek �un. subnetek ... mert ha vannak, akkor a host-idb}ol m�eg
n�eh�any bit a net-idhez lesz kapcsolva, �es �ugy lesz az egyenl}os�eg vizsg�alva), �es ekkor az
�un. ARP protokollal a k�uld}o �allom�as meghat�arozza a c�el�allom�as IP- c��me alapj�an an-
nak az Ethernet-k�artya c��m�et, �es oda k�uldi a csomagot. Ha a k�et net-id k�ul�onb�ozik,
akkor a forr�ashostb�ol a h�al�ozatba kapcsolt �un. default gatewaynek lesz elk�uldve a
csomag, aki majd biztosan tov�abb��tani tudja a rendeltet�esi c��mre. Az ARP-s routingot
direkt, m��g az ut�obbi default gatewayeset indirekt routingnak nevezik. (Az INTER-
NET h�al�ozat k�ozpontj�aban van egy �ugynevezett Core Gateway System, amely nagyobb
4.2. A TCP/IP PROTOKOLLCSAL�AD 75
kapacit�as�u gateway g�epekb}ol �all, amelyekben a routingot m�as gatewayek k�oz�otti pro-
tokollokkal �es algoritmusokkal kieg�esz��tve is v�egzhetik.) Az IP-routing egy speci�alis
lehet}os�ege az �un. source routing, az IP-csomag k�uld}oje �altal t�ort�en}o �utvonalkijel�ol�es:
ilyenkor az IP-csomagot kieg�esz��tik olyan opci�okkal, amiben fel van sorolva az, hogy
az IP-csomagot milyen routereken kereszt�ul milyen sorrendben merre kell a c�el-c��m�ehez
tov�abb��tani (vagyis ekkor az �utvonalkijel�ol�es nem a default gateway ismeretei alapj�an
t�ort�enik).
Az IP-routingot kiss�e megnehez��tik a mobil sz�am��t�og�epek elterjed�ese. Ennek a
probl�em�anak a megold�as�ara fejlesztett�ek ki az MIP (Mobile IP Extension) protokollt.
Eszerint minden egyes mobil sz�am��t�og�epnek van egy �alland�o IP-c��me, ez alapj�an egy
"anya-h�al�ozata" (ez az �alland�o IP-c��m�enek a net-id r�esze alapj�an meghat�arozhat�o); de
egy mobil sz�am��t�og�ep nem csak az "anya-h�al�ozaton" kereszt�ul kapcsol�odhat az Internetre,
hanem b�armelyik �un. IAP-n (Internet Access Point, Internet Hozz�af�er�esi Pont) kereszt�ul
(egy mobil sz�am��t�og�ep t�erbeli mozg�as�aval { "v�andorl�as�aval" { term�eszetesen v�altozhat az
az IAP, amelyen kereszt�ul bel�ep az Internetbe). A MIP protokoll l�enyeg�eben arra �ep�ul,
hogy az "anya-h�al�ozat" routerei ismerik a mobil g�epek aktu�alis IAP-jeit, ��gy a mobil
g�epeknek k�uld�ott IP-csomagokat tudj�ak tov�abb��tani nekik az IAP-n kereszt�ul az IP pro-
tokoll source-routing lehet}os�eg�enek seg��ts�eg�evel. Term�eszetesen a mobil g�epekr}ol k�uld�ott
csomagok tov�abb��that�ok az IAP-fel�e mint default router fel�e, �es onnan a "hagyom�anyos"
IP-routing seg��ts�eg�evel eljuttathat�oak a rendeltet�esi hely�ukre.
Az ARP protokoll a k�ovetkez}o: k��v�ancsiak vagyunk egy adott IP- c��m}u g�ep Ether-
net c��m�ere. Ehhez �ugy kell egy ARP-csomagot kik�uldeni, hogy azt miden egyes rendszer
megkapja (broadcast seg��ts�eg�evel). Minden egyes host, amely egy ARP csomagot be-
olvas a h�al�ozatr�ol beolvas, ellen}orzi, hogy nem az }o IP-c��me van-e benne, arra k��v�ancsi-
e az ARP csomag k�uld}oje. Ha az van benne, akkor kik�uld egy v�alasz-csomagot a
k�erdez}onek, amely tartalmazza az Ethernet-c��m�et - ez megoldhat�o, mivel nyilv�an a saj�at
Ethernet c��m�et minden egyes host le tudja valahogyan k�erdezni.
Soros vonalon az Internet Protokoll egy speci�alis v�altozat�at, az SLIP-t (Serial Line In-
ternet Protocol) haszn�alj�ak. Az ilyen jelleg}u hardver eszk�oz�ok nem t�amogatj�ak az ARP-t
(nem is lenne sok �ertelme, mert egy dr�otnak csak k�et v�ege van), ez�ert az oper�aci�os rend-
szerbe az SLIP-kapcsolatok v�egpontjair�ol az inform�aci�okat "k�ezzel" kell bekon�gur�alni
(vagyis azt, hogy melyik soros vonalon milyen IP-c��m}u host �erhet}o el).
Nyilv�anos h�al�ozatokban gyakran haszn�alt h�al�ozati protokoll az X25.
4.2.3 A transzport szint
A TCP/IP protokollcsal�ad k�et transzport-szint}u protokollja a TCP (Transmission Con-
trol Protocol) �es az UDP (User Datagram Protocol). A TCP �oszek�ottet�es-alap�u, m��g
az UDP nem az.
Az UDP protokoll
Az UDP �altal ny�ujtott szolg�altat�asok l�enyeg�eben megegyeznek az IP �altal biztos��tott
szolg�altat�asokkal. Egy l�enyeges b}ov��t�es az IP-hez k�epest az, hogy az UDP t�obb kom-
munik�aci�os portot (TSAP-ot, Transport Service Access Point-ot) biztos��t, ahonnan ill.
ahova csomagokat lehet k�uldeni, �es ha egy program UDP-n kereszt�ul akar kommunik�alni
76 FEJEZET 4. H �AL �OZATOK
m�asokkal, akkor az UDP csomagok elk�uld�esekor meg kell adni a c�el-host IP-c��me mel-
lett annak az ottani UDP-portnak a sorsz�am�at, ahova a csomagot k�uldeni akarja (az
UDP fejl�ec tartalmazza annak a helyi UDP-portnak a sorsz�am�at is, ahonnan a csomagot
k�uldt�ek, ��gy a c�el�allom�as azt kiolvasva tudja, hogy honnan k�uldt�ek a csomagot, �es ez
alapj�an tudhatja, hogy hova k�uldj�on egy esetleges v�alaszt). Ezzel { m�armint az UDP
portokkal { lehet}os�eg van egy hoston egyszerre t�obb UDP-kapcsolat l�etrehoz�as�ara is, �es
nincsenek olyan megk�ot�esek, hogy egy folyamat egyszerre csak egy darab UDP kapcso-
latot l�etes��thet (mert az UDP-portok azonos��t�oi �es a folyamatok azonos��t�oi egym�ast�ol
teljesen f�uggetlenek).
Az UDP fejr�esz a k�ovetkez}o mez}okb}ol �all:
|------------------------------------------------------|
| Forras-port | Cel-port |
|------------------------------------------------------|
| Csomaghossz | Ellenorzo-osszeg |
|------------------------------------------------------|
| |
| Felhasznaloi adatok |
| |
. ... .
| |
|------------------------------------------------------|
Az ellen}orz}o �osszeg sz�am��t�asa a k�ovetkez}ok�eppen t�ort�enik: 2-byteos szavank�ent kell
�osszeadni az UDP fejr�eszt, az IP pszeudo-fejr�eszt, �es az elk�uldend}o adatokat, majd az
�osszeg 1-es komplemens�et kell k�epezni. Az eml��tett IP pszeudo-fejr�esz itt a forr�as ill.
c�el-hoszt IP c��m�eb}ol, valamint a forr�as/c�el UDP-port sorsz�amb�ol �all.
A TCP protokoll
A TCP a protokollcsal�adnak tal�an a leggyakrabban haszn�alt kommunik�aci�os tran-
szportprotokollja. (FONTOS: A TCP egy protokoll, �es nem a kommunik�aci�ot
megval�os��t�o program!) Ha TCP protokollal k�uld�unk egy byte-folyamot (tetsz}oleges
adatokat), akkor a TCP azt maximum64 byteos darabokra bontja, �es ezeket a darabokat
egyenk�ent �atadja az IP-nek (term�eszetesen a TCP fejl�eccel ell�atva), hogy k�uldje el a ren-
deltet�esi hely�ere. Az IP nem garant�alja azt, hogy a csomagok a c�el�allom�asn�al meg is
�erkeznek, ez�ert a TCP feladata az, hogy adott esetben (pl. egy bizonyos id}o lej�art�aval)
az egyes csomagokat �ujra elk�uldje, mivel lehet, hogy az el}oz}o p�eld�any elveszett vala-
hol. A c�el�allom�ason a meg�erkezett csomagok sorrendje nem biztos, hogy az elk�uld�es
sorrendj�evel megegyezik, ez�ert a TCP feladata ennek a rendez�ese is (ha sz�uks�eges). A
TCP term�eszetesen a csomagdupl�az�as ellen is v�edelmet ny�ujt.
A TCP protokoll a megb��zhat�os�agot az �un. PAR (Positive Acknowledgement with
Retransmission) technik�aval biztos��tja. Ez azt jelenti, hogy a c�el�allom�as TCP-t meg-
val�os��t�o szoftvere nyugt�azza a csomag k�ezbes��t�es�et, miut�an a h�al�ozati szintt}ol (az IP-t}ol)
megkapta.
4.2. A TCP/IP PROTOKOLLCSAL�AD 77
Egy hoston egyszerre t�obb TCP kapcsolat is �elhet, �es itt is, mint az UDP-n�el az egyes
kapcsolatok k�ul�on-k�ul�on TCP-porton (TSAP-on) vannak. A TCP-kapcsolatok full-
duplexek, vagyis k�etir�any�uak, �es az elk�uld�ott adatokat a TCP struktur�alatlan byte-
folyamnak tekinti. A TCP-vel ezen k��v�ul lehet}os�eg van s�urg}os adatok tov�abb��t�as�ara
is. A protokoll el}o��rja, hogy ha s�urg}os adatot k�uldt�unk, akkor az adat fogad�oj�at a c�el-
hoston err}ol �ertes��teni kell, �es meg kell adni a lehet}os�eget a s�urg}os adat soron k��v�uli
feldolgoz�as�ara is. Az �ertes��t�es m�odja (mivel oprendszer-f�ugg}o) nincs a protokoll �altal
speci�k�alva.
A TCP fejr�esz a k�ovetkez}o mez}okb}ol �all:
|------------------------------------------------------|
| Forras-port | Cel-port |
|------------------------------------------------------|
| Byte-sorszam |
|------------------------------------------------------|
| Nyugta |
|------------------------------------------------------|
| TCP fejreszhossz| |URG|ACK|EOM|RST|SYN|FIN| Ablak |
|------------------------------------------------------|
| Ellenorzo osszeg | Surgos adatok offsetje |
|------------------------------------------------------|
| |
| |
. Felhasznaloi adatok .
. .
| |
|------------------------------------------------------|
(A rajzon a TCP fejr�esz v��zszintes m�erete 32 bit.)
A TCP portok 0-t�ol 1023-ig �un. foglalt portok. Ezeknek a kioszt�asi jog�at a DARPA
fenntartja mag�anak. P�eld�aul a t�avoli bejelentkez�es (TELNET) protokoll szervere mindig
a 23-as TCP porton v�ar arra, hogy valaki r�akapcsol�odjon �es bejelentkezzen rajta az adott
hostra. Az �altal�aban jellemz}o, hogy a fontosabb, sz�elesebb k�orben haszn�alt protokollok
egy "mindenki �altal ismert" (well-known) sorsz�am�u port-on v�arnak kapcsolatokra.
A TCP fejr�esz bitjei a k�ovetkez}ok:
� URG: Ennek a bitnek 1 az �ert�eke, ha a s�urg}os adatok o�setje fejr�eszmez}o ki van
t�oltve (�es �erv�enyes ...). Ez az o�set azt mutatja majd meg, hogy az aktu�alisan
�atvitt byte ut�an h�anyadik byte ut�an k�ovetkezik a s�urg}os adat.
� SYN: �Oszek�ottet�es-fel�ep��t�eskor fontos
� ACK: "Nyugta" mez}o �erv�enyes adattal van-e kit�oltve
� FIN: A k�uld}onek nincs t�obb elk�uldend}o adata (ezzel z�arul le az egyik ir�anyban a
kapcsolat).
78 FEJEZET 4. H �AL �OZATOK
� RST: Inkonzisztens �allapotba ker�ult �osszek�ottet�es megsz�untet�es�ere vonatkoz�o
k�erelem.
� EOM: End Of Message ag (nem kell a TCP kapcsolat haszn�al�oj�at�ol adatokra
v�arni (am��g a 64 byteos szok�asos TCP �uzenethossz �osszej�onne), mert r�ovid id}on
bel�ul lehet, hogy nem lesz �uj elk�uldend}o adat). Ez p�eld�aul a TELNET protokolln�al
hasznos. Milyen ciki lenne, ha a termin�alon beadott karaktereket a termin�alunk
csak 64 byte bead�asa ut�an k�ulden�e el a t�avoli hosztra, ahova bejelentkezt�unk.
Az ellen}orz}o �osszeg sz�am��t�asa a k�ovetkez}ok�eppen megy: 2-byteos szavank�ent kell
�osszeadni a TCP fejr�eszt, az IP pszeudo-fejr�eszt, �es az elk�uldend}o adatokat, majd az
�osszeg 1-es komplemens�et kell k�epezni. A byte sorsz�am megmondja, hogy az eg�esz
�atk�uldend}o adatfolyamb�ol most �epp h�anyadik byteot k�uldj�uk �at (a TCP �uzenet els}o
bytej�anak az adatfolyamon bel�uli sorsz�ama). A nyugta mez}o megmondja, hogy a kom-
munik�aci�os partner az elk�uldend}o adatfolyamunknak h�anyadik bytej�at v�arja (�es ez nem
lehet �es nem is lesz monoton cs�okken}o!). A TCP ellen}orz}o �osszegn�el eml��tett IP pszeudo-
fejr�esz a forr�as ill. c�el-hoszt IP c��m�eb}ol, valamint egy�eb protokoll-inform�aci�okb�ol �es az
aktu�alis TCP �uzenet hossz�ab�ol �all. (A byte sorsz�am kezd}o�ert�eke nem minden kapcsolat
eset�en nulla - a kezdeti �ert�eket a kapcsolat l�etrehoz�asakor a k�et partner egyezteti.)
4.3 TCP/IP kon�gur�aci�o
Minden egyes sz�am��t�og�ep oper�aci�os rendszere biztos��t valamilyen lehet}os�eget a TCP/IP
h�al�ozati r�eteg alapvet}o param�etereinek (pl. a host IP c��me, neve, : : : ) a be�all��t�as�ara.
A legt�obb rendszerben a Berkeley UNIX-b�ol sz�armaz�o seg�edprogramok haszn�alhat�oak
ilyen c�elra, de sok helyen k�esz��tettek olyan interaktiv seg�edprogramokat is, ame-
lyek interaktivan megk�erdezik a felhaszn�al�ot/rendszergazd�at a sz�uks�eges inform�aci�or�ol,
majd v�egrehajtj�ak a Berkeley UNIX-b�ol sz�armaz�o seg�edrutinokat a megfelel}o fel-
param�eterez�essel.
Megjegyezz�uk, hogy az al�abb l�athat�o p�eld�ak egyes sz�am��t�og�epeken m�ask�ent
m}uk�odhetnek; lehet, hogy m�as sz�am��t�og�epen m�as form�aban adj�ak ki az eredm�eny�uket.
Ennek oka az egyes oper�aci�os rendszerek seg�edprogramjainak a minim�alis k�ul�onb�oz}os�ege
lehet. Ha ilyen jelleg}u probl�em�akkal tal�alkozunk, akkor n�ezz�uk meg a megfelel}o paranc-
sok referencia k�ezik�onyvbeli le��r�asukat a parancs pontos m}uk�od�es�er}ol: �altal�aban a ki��rt
angol sz�ovegek megfogalmaz�asa m�as- �es m�as lehet, de a l�enyeges inform�aci�ok (pl. a g�ep
IP-c��me, Ethernet c��me) minden esetben ki��r�asra ker�ul.
4.3.1 H�al�ozati csatlakoz�ok
Egy sz�am��t�og�ep { mint m�ar eml��tett�uk { egyszerre t�obb h�al�ozati csatlakoz�oval is el lehet
l�atva. Ezeknek a csatlakoz�oknak a neveit a netstat parancs -i argumentummal t�ort�en}o
v�egrehajt�as�aval tudhatjuk meg. Erre tekints�uk a k�ovetkez}o p�eld�at:
Name MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flags
lo 2000 0 0 0 0 886 2 0 0 BLRU
eth0 1500 0 0 0 0 0 1 0 0 BRU
4.3. TCP/IP KONFIGUR�ACI �O 79
A h�al�ozati csatlakoz�ok neveit az els}o oszlopb�ol tudhatjuk meg; a t�obbi oszlop a
k�ovetkez}o inform�aci�okkal szolg�al:
� MTU : A csatlakoz�on elk�uldhet}o adat maxim�alis m�erete (a csatlakoz�o miatt
haszn�aland�o Ethernet vagy m�as fejl�ecek n�elk�ul).
� RX-OK : A csatlakoz�on fogadott hib�atlan csomagok sz�ama.
� RX-ERR : A csatlakoz�on fogadott hib�as csomagok sz�ama.
� RX-DRP : A csatlakoz�on �erkezett, de valamilyen okn�al fogva nem feldolgozott
csomagok sz�ama.
� RX-OVR : A csatlakoz�on �erkezett, de a TCP/IP szoftver lass�us�aga miatt nem
fogadott szoftver.
� TX-OK : A csatlakoz�on elk�uld�ott hib�atlan csomagok sz�ama.
� TX-ERR : A csatlakoz�on elk�uld�ott hib�as csomagok sz�ama.
� TX-DRP : A csatlakoz�ora k�uld�ott , de valamilyen okn�al fogva eldobott csomagok
sz�ama.
� TX-OVR : A csatlakoz�on valamilyen okn�al fogva nem elk�uld�optt csoamgok sz�ama.
� Flags : A csatlakoz�o �allapot�at, jellemz}oi ��rja le.
4.3.2 IP c��m be�all��t�asa
Egy h�al�ozati csatlakoz�o IP-c��m�enek a be�all��t�as�at az ifconfig UNIX paranccsal
v�egezhetj�uk. Ha a sz�am��t�og�ep�unk k�et h�al�ozati csatlakoz�oval van felszerelve: az egyik
a loopback (neve: lo) csatlakoz�o, amely a r�a k�uld�ott csomagokat egyszer}uen visszajut-
tatja a helyi sz�am��t�og�epre (ezzel a helyi hostot c��mzi meg), a m�asik pedig egy Ethernet
h�al�ozati k�artya (neve: eth0), akkor azok IP-c��meit a k�ovetkez}o parancsokkal �all��thatjuk
be:
$ /etc/ifconfig lo 127.0.0.1
$ /etc/ifconfig eth0 157.181.52.1
A p�eld�aban a loopback csatlakoz�ohoz a 127.0.0.1, az Ethernet csatlakoz�ohoz pedig
a 157.181.52.1 c��met rendelt�uk.
A sz�am��t�og�ep�unk egyes h�al�ozati csatlakoz�oihoz rendelt IP-c��meket szint�en az
ifconfig paranccsal k�erdezhetj�uk le. Erre tekints�uk a k�ovetkez}o p�eld�at:
$ ifconfig
lo Link encap Local Loopback
inet addr 127.0.0.1 Bcast 127.255.255.255 Mask 255.0.0.0
UP BROADCAST LOOPBACK RUNNING MTU 2000 Metric 1
eth0 Link encap 10Mbps Ethernet HWaddr 00:43:23:76:34:47
inet addr 157.181.53.43 Bcast 157.181.33.255 Mask 255.255.255.0
UP BROADCAST RUNNING MTU 1500 Metric 1
80 FEJEZET 4. H �AL �OZATOK
Itt l�athat�o a sz�am��t�og�epmindk�et h�al�ozati csatlakoz�oj�anak a r�ovid jellemz�ese: IP-c��me,
a r�eszh�al�ozaton broadcast c�elokra haszn�alhat�o IP-c��m, valamint a network mask konstans
�ert�eke, amely a h�al�ozati interf�esz IP-c��m�eb}ol kijel�oli azt, hogy mely bitek tartoznak a
kor�abban m�ar eml��tett net-id-hez (h�al�ozat azonos��t�o). A net-id-et az IP-c��m megfelel}o
bytejainak a mask megfelel}o bytejaival bitenk�enti VAGY kapcsolatba hoz�assal kaphatjuk
meg. Az eth0 csatlakoz�onk net-id-je teh�at a k�ovetkez}o: 157.181.53.0.
4.3.3 ARP �es RARP protokollok
A csomagok Internetbeli �utvonalkijel�ol�es�ehez haszn�alt ARP protokoll imple-
ment�aci�oj�ahoz az arp parancs seg��ts�eg�evel f�erhet�unk hozz�a. Az arp -a parancs ki��rja
a rendszer ARP protokoll t�abl�azat�anak a tartal�at (ez a t�abl�azat szolg�al az ARP-vel sz-
erzett inform�aci�ok id}oleges cache-el�es�ere). Haszn�alat�ara tekints�uk a k�ovetkez}o p�eld�at:
$ arp -a
Address HW type HW address
157.181.52.1 10Mbps Ethernet 00:80:73:41:65:56
157.181.52.2 10Mbps Ethernet 00:80:73:41:65:57
A fentiekb}ol leolvashat�o, hogy annak a g�epnek, amelyen az arp -a parancsot
v�egrehajtott�ak, k�et m�asik sz�am��t�og�eppel van { �alland�o jelleg}u { kapcsolata, leolvashat�o
ezek IP c��me, h�al�ozati csatlakoz�ojuk t��pusa, Ethernet k�artya c��mei.
Az arp paranccsal megtudhatjuk ak�ar egy-egy host Ethernet c��m�et is az IP-
c��me alapj�an a host nev�et mint argumentumot megadva. Az ullman.inf.elte.hu
sz�am��t�og�epen kiadva a k�ovetkez}o parancsot, megkaphatjuk a tomx.inf.elte.hu
sz�am��t�og�ep Ethernet c��m�et:
$ arp tomx.inf.elte.hu
tomx.inf.elte.hu (157.181.52.2) is on 10Mbps Ethernet 00:80:73:41:65:57
Ebb}ol megtudhattuk, hogy a tomx.inf.elte.hu sz�am��t�og�ep Ethernet k�arty�aj�anak a
c��me 00:80:73:41:65:57.
A ford��tott ir�any�u (Ethernet c��m --> IP c��m) c��mtranszform�aci�ot az RARP protokollal
v�egezhetj�uk (ezt p�eld�aul X-termin�alok haszn�alj�ak IP c��m�uk meghat�aroz�as�ara, ha csak
az Ethernet c��m�uket ismerik: az Ethernet c��m�uket a h�al�ozaton egy RARP csomagban
broadcast-elik (mindenkinek elk�uldik), �es minden egyes hoston az ott fut�o rarpd d�emon
kikeresi az Ethernet c��m alapj�an a host IP-c��m�et, �es visszak�uldi az inform�aci�ot az RARP-t
kezdem�enyez}o X-termin�alnak).
Az rarpd program a /etc/ethers f�ajlt haszn�alja az IP-c��mek meghat�aroz�as�ara,
melynek form�atuma a k�ovetkez}o: soronk�ent tartalmaz egy Ethernet c��met �es egy IP-
c��met (hostnevet is tartalmazhat, amely esetben a nameserver seg��ts�eg�evel lesz az adott
hostn�ev IP-c��mm�e transzform�alva). Tekints�uk a k�ovetkez}o p�eld�at a /etc/ethers f�ajlra:
00:80:73:41:34:34 ncd92.inf.elte.hu
00:81:7b:1e:65:23 ncd93.inf.elte.hu
00:80:73:41:8a:44 157.181.52.99
4.4. K�ERD�ESEK, FELADATOK 81
4.3.4 Routing t�abl�ak
4.4 K�erd�esek, feladatok
1. Mi a h�al�ozatok �zikai, adatkapcsolati, h�al�ozati �es transzport szintj�enek a feladata?
2. Mit �ert�unk �osszek�ottet�es-alap�u kapcsolaton?
3. Milyen szerkezet}u szervereket ismer?
4. Mi a k�ul�onbs�eg a TCP �es az UDP k�oz�ott?
5. Mi az ARP protokoll szerepe? Hogyan m}uk�odik?
6. Hogyan t�ort�enik az IP-routing?
7. Mi az oktett?
82 FEJEZET 4. H �AL �OZATOK
Fejezet 5
A Berkeley socketok
A socketok a UNIX-ban a h�al�ozati (�es helyi ...) kommunik�aci�o v�egpontjai, ezeken
kereszt�ul lehet a helyi transzport- �es m�as h�al�ozati r�etegekhez hozz�af�erni. L�enyeg�eben
postal�adak�ent viselkednek: hozz�ajuk rendelhet�unk bizonyos c��meket, �es fogadhatjuk r�oluk
az oda �erkezett adatokat, illetve adatokat k�uldhet�unk el onnan m�asoknak. A socketokat
eredetileg a BSD UNIX-ban k�esz��tett�ek el, �es az }oket manipul�al�o elj�ar�asok ott rend-
szerh��v�asokk�ent �erhet}oek el, de k�es}obb az AT&T UNIX-hoz is k�esz��tettek egy socket-
emul�aci�os k�onyvt�arat, amely az AT&T kernel m�as lehet}os�egeire �ep�ul.
A socket k�onyvt�arak lehet}ov�e teszi h�al�ozati szoftverek k�esz��t�es�et �ugy, hogy a pro-
gram k�esz��t�ese sor�an nem a program alatt lev}o protokoll lehet}os�egeire kell a �gyelmet
�osszpontos��tani. A socketok l�etrehoz�asakor meg kell adni azt, hogy a socket milyen kom-
munik�aci�os domainbe tartozik (p�eld�aul TCP/IP Internet vagy X25). K�es}obb ha majd a
sockethoz "c��met" rendel�unk, akkor a c��met az adott domain-nek megfelel}o form�atumban
kell az oper�aci�os rendszerrel k�oz�olni. Ezen k��v�ul meg kell adni a kommunik�aci�o m�odj�at
is (pl. �osszek�ottet�es alap�u byte-folyam jelleg}u vagy datagram jelleg}u ...). Ez alapj�an a
rendszer kiv�alasztja az adott domain-en bel�ul azt a kommunik�aci�os protokollt, amely az
adott m�od�u kommunik�aci�o megval�os��t�as�ara k�epes. Ha t�obb protokollt is ismer a rend-
szer, amely a (domain,m�od) p�arnak megfelel, akkor explicit m�odon meg lehet adni azt,
hogy azok k�oz�ul melyiket akarom haszn�alni (ha ez elt�er a rendszerben ismert default
�ert�ekt}ol). P�eld�aul ha az Internet domain-en bel�ul byte-folyam jelleg}u kommunik�aci�ot
akarok v�egezni, akkor a rendszer automatikusan a TCP protokollt v�alasztja ki, mert
az Internet domain-en bel�ul ez az alap�ertelmez�es szerinti (bytefolyam-jelleg}u kommu-
nik�aci�o eset�en). Ha az Internet domain-en bel�ul datagram jelleg}u kommunik�aci�ot akarok,
akkor a rendszer az UDP-t v�alasztja ki, mert az Internet domain-en bel�ul mindig az
az alap�ertelmez�es szerinti protokoll datagram jelleg}u kommunik�aci�o eset�en (arr}ol m�eg
lesz sz�o r�eszletesebben, hogy mikor mi az alap�ertelmez�es szerinti protokoll ...). Ezut�an
a program visszakap egy eg�esz t��pus�u �un. socket-le��r�ot, amivel a socketra hivatkozhat.
Amennyire ez lehets�eges, a socketok �ugy viselkednek, mint a f�ajlok, teh�at ha van �ertelme,
akkor meg vannak r�ajuk engedve a szok�asos read, write, close, ... f�ajlm}uveletek.
83
84 FEJEZET 5. A BERKELEY SOCKETOK
5.1 Egy �osszek�ottet�es-alap�u kliens-szerver kapcsolat
menete
Az jellemz}o, hogy egy kliens illetve szerver �osszek�ottet�es-alap�u kommunik�aci�o
l�etrehoz�asakor milyen rendszerh��v�asokat haszn�al. Ezt foglalja �ossze a k�ovetkez}o k�et
t�abl�azat:
Egy kliens a k�ovetkez}o rendszerh��v�asokkal kommunik�alhat a szerverrel:
Socket l�etrehoz�asa socket()
Socket c��m�enek kijel�ol�ese bind()
Kapcsolatfelv�etel a szerverrel connect()
Adat�atvitel write(), read()
send(), recv()
Adat�atvitel befejez�ese (EOF) shutdown()
Socket lez�ar�asa close()
Egy szerver a k�ovetkez}o rendszerh��v�asokkal kommunik�alhat a kliensekkel:
Socket l�etrehoz�asa socket()
Socket c��m�enek kijel�ol�ese bind()
Kliensekre v�ar�as �allapotba ker�ul�es listen()
Kliens kapcsolatk�erelm�enek elfogad�asa accept()
Adat�atvitel write(), read()
send(), recv()
Adat�atvitel befejez�ese (EOF) shutdown()
Socket lez�ar�asa close()
5.2 Egy nem �osszek�ottet�es-alap�u kliens-szerver kapc-
solat menete
Az jellemz}o, hogy egy kliens illetve szerver nem �osszek�ottet�esalap�u (: : :�osszek�ottet�es-
mentes) kommunik�aci�o l�etrehoz�asakor milyen rendszerh��v�asokat haszn�al. Ezt foglalja
�ossze a k�ovetkez}o t�abl�azat:
Egy kliens �es szerver k�ozti kommunik�aci�o a k�ovetkez}o rendszerh��v�asokkal folyhat le:
Socket l�etrehoz�asa socket()
Socket c��m�enek kijel�ol�ese bind()
Adat�atvitel sendto(), recvfrom()
Adat�atvitel befejez�ese (EOF) shutdown()
Socket lez�ar�asa close()
5.3. SOCKETOK C��MZ�ESE AZ INTERNET DOMAINBEN 85
5.3 Socketok c��mz�ese az Internet domainben
Az Internet domain socketjaihoz tartoz�o c��mek form�atum�at a k�ovetkez}o strukt�ura szerint
kell megadni az oper�aci�os rendszernek (deklar�alva a <netinet/in.h> header �leban van):
struct in_addr {
unsigned long s_addr; /* 4 byteos IP cim */
};
struct sockaddr_in {
short sin_family; /* =AF_INET */
unsigned short sin_port; /* 16 bites port-sorszam */
struct in_addr sin_addr; /* IP cim */
char sin_zero[8]; /* Kihasznalatlan */
};
A sin family mez}o tartalmazza a c��m t��pus�at (AF INET = Address Family in the
Internet Domain). A sin port tartalmazza a TCP vagy az UDP port sorsz�amot (asz-
erint, hogy a socket milyen t��pus�u: TCP vagy UDP). A sin addr mez}o tartalmazza a
megc��mzett objektum IP c��m�et. Ez ut�obbi k�et mez}ot az �un. h�al�ozati �abr�azol�asi form�aban
kell megadni (ld. k�es}obb a htons, ill. htonl f�uggv�enyeket).
5.4 Konverzi�o a h�al�ozati- �es host byte-�abr�azol�asm�od
k�oz�ott
A h�al�ozatba kapcsolt hostok k�oz�ott van olyan, amelyik a k�etbyteos eg�eszeket �ugy
t�arolja a mem�ori�aban (ez a host byte order, vagyis a mem�oriabeli t�arol�as form�atuma),
hogy az alacsonyabb helyi�ert�ek}u byteot a kisebb sorsz�am�u mem�oriac��men, a magasabb
helyi�ert�ek}u byteot pedig a nagyobbik sorsz�am�u mem�oriac��men. Vannak olyan hostok is,
amelyekn�el ez pont ford��tva van, �es ez�ert de�ni�altak egy �un. network byte ordert, amely
a Motorola bels}o t�arol�asi form�atum�anak felel meg, �es a h�al�ozati portokat, �es c��meket
ilyen network byte orderben kell megadni a rendszernek. Ehhez azonban a host byte
orderr}ol konvert�alni kell az adatokat a network byte orderre.
N�egy konverzi�os rutin van, amelyet haszn�alhatunk:
� htons : host byte order --> network byte order (16 bites adat)
� ntohs : network byte order --> host byte order (16 bites adat)
� htonl : host byte order --> network byte order (32 bites adat)
� ntohl : network byte order --> host byte order (32 bites adat)
(Ha numerikus (eg�esz) adatokat visz�unk �at k�et host k�oz�ott, akkor is hasznos (�es
sz�uks�eges) ez a konverzi�o, ha hordozhat�o programot akarunk k�esz��teni.)
86 FEJEZET 5. A BERKELEY SOCKETOK
5.5 Kommunik�aci�os v�egpont (socket) l�etrehoz�asa
Egy socketot a socket() rendszerh��v�assal lehet l�etrehozni. Ennek a rendszerh��v�asnak
h�arom param�etere van: a c��mform�atum (domain neve), a socket t��pusa �es a haszn�aland�o
kommunik�aci�os protokoll. A socket rendszerh��v�as form�atuma a k�ovetkez}o:
sd=socket(address_family,socket_type,socket_protocol);
A k�ovetkez}o t�abl�azatban n�eh�any domain-nevet lehet l�atni (a UNIX C header-�leokban
ezek mint numerikus �ert�ek}u makr�ok vannak deklar�alva):
Address family Le��r�as
AF INET Internet domain
AF DECNET DecNET domain
AF NS Xerox Network System domain
AF UNIX Lok�alis hoszton bel�uli IPC
A socket t��pus�an a socket "min}os�eg�et" kell megadni. Ennek �ert�ekei a k�ovetkez}ok
lehetnek:
Socket type Le��r�as
SOCK DGRAM Datagrammok tov�abb��t�as�at t�amogat�o socket.
�osszek�ottet�esmentes kapcsolat kialak��t�as�ara alkalmas
nem garant�al megb��zhat�os�agot.
SOCK STREAM Megb��zhat�o, �osszek�ottet�es-alap�u, byte-folyam jelleg}u adat�atvitelt t�amogat.
Az elk�uld�ott csomagok "egybefolynak".
SOCK SEQPACKET Megb��zhat�o, �osszek�ottet�es-alap�u, byte-folyam jelleg}u adat�atvitelt biztos��t,
de megtartja a csomaghat�arokat.
SOCK RAW Alacsonyszint}u kommunik�aci�os protokollok
el�er�es�et teszi lehet}ov�e (ld. k�es}obb).
A sockethoz a fenti t��pusok alapj�an ki lesz v�alasztva egy alap�ertelmez�es szerinti
h�al�ozati protokoll, de ha az nem felel meg az ig�enyeknek, akkor a harmadik param�eterben
ezt fel�ulb��r�alhatjuk. Ha megfelel, akkor ott 0-t adjunk meg.
Az alap�ertelmez�es szerinti h�al�ozati protokollok (socket type �es domain alapj�an) a
k�ovetkez}ok:
AF INET AF NS
SOCK STREAM TCP SPP
SOCK DGRAM UDP IDP
SOCK SEQPACKET { SPP
SOCK RAW IP IDP
A rendszerh��v�as visszat�er�esi �ert�eke hiba eset�en -1, egy�ebk�ent pedig egy socket-
descriptor, amivel k�es}obb a socketra hivatkozhatunk.
Megjegyezz�uk, hogy az IP protokoll el�er�es�er}ol e fejezet v�eg�en m�eg r�eszletesebben
is lesz sz�o, de addig a leggyakrabban haszn�alt transzportprotokollokat: a TCP-t �es az
UDP-t fogjuk �attekinteni.
5.6. SOCKET C��M�ENEK KIJEL �OL�ESE 87
5.6 Socket c��m�enek kijel�ol�ese
Egy sockethoz a l�etrehoz�asa ut�an m�eg nincs semmif�ele c��m hozz�arendelve (egyes do-
mainekben, ilyen p�eld�aul az Internet, hozz�arendel}odik egy "m�eg nem foglalt" c��m, de az
nem mindig "a megfelel}o c��m", ez�ert gyakran sz�uks�eges annak a fel�ulb��r�alata - p�eld�aul
az�ert, hogy a szerver "well-known" portj�anak a c��m�et be�all��tsuk a szerver socket-j�an).
Az �altal�aban igaz, hogy az oper�aci�os rendszer "nem oszt ki" alap�ertelmez�esk�ent
be�alll��tott c��mk�ent 5000-n�el nagyobb port-sz�amot, ez�ert a saj�at szervereinknek (ame-
lyeknek egy szabad "well known" portot kell kiosztani) 5000-n�el nagyobb sorsz�am�u portot
nyugodtan kijel�olhet�unk.
A bind() rendszerh��v�assal lehet egy sockethoz egy c��met rendelni. Ennek form�aja a
k�ovetkez}o:
bind(sd, name, namelength);
Itt sd a socket-le��r�o, a name param�eter tartalmazza a pointert a sockethoz rende-
lend}o c��mre (Internet domainben pointer egy sockaddr in struktur�ara), �es mivel a c��mek
hossza domainenk�ent m�as �es m�as, ez�ert a namelength param�eter tartalmazza a name
param�eterben lev}o c��m hossz�at byteban m�erve.
(Fontos, hogy az Internet domainben egy szerver (mondjuk TCP) sockethoz a
hozz�abind-olt IP-c��m (sin addr) azt adja meg, hogy a socket melyik h�al�ozati csatlakoz�on
hajland�o elfogadni r�akapcsol�od�asi k�erelmet. Ott a h�al�ozati csatlakoz�onak az IP c��m�et
network byte orderben kell megadni, �es van egy speci�alis konstans, az INADDR ANY,
amely azt jelenti ha sockethoz bind-oljuk, hogy a socket b�armelyik h�al�ozati csatlakoz�on(!)
elfogad r�akapcsol�od�asi k�erelmet. "Haszn�alat el}ott" term�eszetesen ezt is network byte or-
der}ure kell konvert�alni.)
5.7 Kapcsolat l�etrehoz�asa
Erre az �osszek�ottet�es-alap�u kliensekn�el �es szerverekn�el van sz�uks�eg. A kapcsolatfelv�etel
a szerver r�esz�er}ol �ugy t�ort�enik, hogy a szerver a socketj�an v�egrehajtja a listen() rend-
szerh��v�ast, �es ezzel bejelenti az oper�aci�os rendszernek, hogy a socketja k�esz a kliensek
r�akapcsol�od�asi k�erelmeinek fogad�as�ara. Az els}o param�eter itt is a socket-descriptor, m��g
a m�asodik param�eter egy eg�esz sz�am, �es azt mondja meg, hogy ha egyszerre t�obb kliens
is r�a akarna kapcsol�odni a szerver socketra, akkor h�any r�akapcsol�od�asi k�erelmet rakjon
bele egy v�arakoz�asi sorba (a t�obbit "eldobja", visszautas��tja). Ennek �ert�eke �altal�aban
(alap�ertelmez�es szerint) 5. Ezut�an a szerver az accept() rendszerh��v�assal vehet le a fenti
v�arakoz�asi sorb�ol (ciklusban ...) egy-egy k�erelmet �es kapcsol�odhat a klienshez. (Ha nincs
ilyen k�erelem, akkor a rendszerh��v�as v�ar, am��g lesz egy.) Az accept rendszerh��v�as els}o
param�etere egy socket-descriptor, m�asodik ill. harmadik param�etere pedig egy socket-c��m
strukt�ura (c��m szerint �atadva ...) ill. egy c��m-hosszat tartalmaz�o eg�esz sz�amra mutat�o
pointer, ahova a t�avoli kommunik�aci�os partner c��m�enek a hossz�at adja vissza a rendszer.
A m�asodik param�eterben megadott c��mre visszat�er�eskor a r�akapcsolt kliens c��m�et ��rja
vissza. A rendszerh��v�as visszat�er�esi �ert�eke egy �uj socket-descriptor, amivel a kapcsolatra
hivatkozni lehet.
A kapcsolat l�etrehoz�asa a kliensekn�el a connect() rendszerh��v�assal zajlik. Ennek
els}o param�etere a socket-descriptor, amin kereszt�ul r�a akarunk valahova kapcsol�odni.
88 FEJEZET 5. A BERKELEY SOCKETOK
M�asodik param�eter egy socket-c��m strukt�ura, ami a szerver c��m�et tartalmazza. Harmadik
param�etere pedig az el}obbi strukt�ura hossz�at adja meg. Visszat�er�esi �ert�eke -1, ha a
rendszerh��v�as sikertelen volt.
A rendszerh��v�asok alakja teh�at a k�ovetkez}o:
listen(sd, nrofreq);
newsd=accept(sd, name, namelength);
connect(sd, name, namelength);
Ezut�an megkezd}odhet az adat�atvitel.
5.8 Adat�atvitel �osszek�ottet�es-alap�u kapcsolatok eset�en
Az adat�atvitel t�obbf�elek�eppen is mehet: mehet a read() ill. write() vagy a send() �es
recv() rendszerh��v�asokkal.
A write() rendszerh��v�as param�eterez�ese a k�ovetkez}o:
write(sd, buff, size);
Ez a buff bu�erb}ol size darab byteot elk�uld az sd socket-descriptorhoz tartoz�o
(h�al�ozati vagy m�as) kapcsolatra.
A read() rendszerh��v�as param�eterez�ese a k�ovetkez}o:
read(sd, buff, size);
Ez a buff bu�erbe size darab byteot beolvas az sd socket-descriptorhoz tartoz�o
(h�al�ozati vagy m�as) kapcsolatr�ol.
Mindkett}o rendszerh��v�as visszat�er�esi �ert�eke hiba eset�en -1, egy�ebk�ent pedig az �atvitt
byteok mennyis�ege (vigy�azni kell! lehet, hogy size-n�el kisebb!). Ha a t�avoli g�ep a
h�al�ozati kapcsolatot lez�arta, akkor a read rendszerh��v�as visszat�er�esi �ert�eke 0.
A send() rendszerh��v�as param�eterez�ese a k�ovetkez}o:
send(sd, buff, size, flags);
Ez a buff bu�erb}ol size darab byteot elk�uld az sd socket-descriptorhoz tartoz�o
(h�al�ozati vagy m�as) kapcsolatra.
A recv() rendszerh��v�as param�eterez�ese a k�ovetkez}o:
recv(sd, buff, size, flags);
Ez a buff bu�erbe size byteot beolvas az sd socket-descriptorhoz tartoz�o (h�al�ozati
vagy m�as) kapcsolatr�ol.
A fenti k�et rendszerh��v�asn�al ha a flags param�eter 0, akkor ugyan�ugy viselkednek,
mint a read illetve write rendszerh��v�asok. Ezen k��v�ul m�as �ert�ekekeit is felvehet, mint
p�eld�aul az MSG OOB-t, ami azt jelenti, hogy a protokoll �altal de�ni�alt s�urg}os adatk�ent
kell az elk�uld�ott byteokat kezelni. M�asik speci�alis flag az MSG PEEK, amely a recv
rendszerh��v�asn�al adhat�o �at, �es az eredm�enye az, hogy az adatokat bem�asolja a rendszer
a megadott bu�erbe, de az eredeti hely�uk�on is meghagyja. Mindegyik rendszerh��v�as az
�atvitt (beolvasott ill. ki��rt) adatbyteok sz�am�at adja vissza.
5.9. ADAT�ATVITEL NEM �OSZEK �OTTET�ES-ALAP �U KAPCSOLATOK ESET�EN89
5.9 Adat�atvitel nem �oszek�ottet�es-alap�u kapcsolatok
eset�en
Erre a k�ovetkez}o k�et rendszerh��v�ast haszn�alhatjuk:
sendto(sd, buff, size, flags, to, addrlen);
/*
* struct sockaddr *to;
* int addrlen;
*/
recvfrom(sd, buff, size, flags, from, addrlen);
/*
* struct sockaddr *from;
* int *addrlen;
*/
Ezekn�el a rendszerh��v�asokn�al az els}o n�egy param�eter nem szorul magyar�azatra. Az
�ot�odik param�eter a sendto rendszerh��v�as eset�en az adat rendeltet�esi hely�enek a c��me,
m��g a recvfrom rendszerh��v�as eset�en ott adja vissza az oper�aci�os rendszer, hogy honnan
�erkezett az adat. Az addrlen param�eter a from ill. a to param�eterben megadott c��m
m�eret�et tartalmazza!
5.10 Kapcsolat (socket) lez�ar�asa
Ha egy socketot nem akarjuk tov�abb haszn�alni (nincs sz�uks�eg az onan j�ov}o adatokra),
akkor le kell z�arni. Erre a szok�asos close rendszerh��v�ast haszn�alhatjuk. Alakja:
close(sd);
�Oszek�ottet�es-alap�u socketokn�al lehet}os�eg van arra is, hogy csak az egyikir�any�u
adat�aramot z�arjuk le (ekkor a socket nem sz}unik meg!). Ez a shutdown rendszerh��v�assal
megy.
Ennek alakja:
shutdown(sd, mode);
Itt sd a socket-descriptor, mode pedig 0, ha nem akarunk t�obb adatot beolvasni a
socketr�ol, 1 pedig akkor, ha nem akarunk t�obb adatot ��rni a socketra.
5.11 T�obb socket p�arhuzamos �gyel�ese (select)
A select rendszerh��v�assal lehet}os�eg van p�arhuzamosan t�obb socket �allapot�anak a �-
gyel�es�ere is (hogy �erkezett-e r�a adat vagy sem stb.). A rendszerh��v�as alakja:
nrofsdsfound=select(nsds, readsds, writesds, exceptsds, tmout);
90 FEJEZET 5. A BERKELEY SOCKETOK
Az nsds param�eter megmondja, hogy a 0-t�ol nsds-1 -ig terjed}o socket- (ill. f�ajl-
)descriptorokat kell �gyelnie a programnak. A readsds egy pointer, �es azok a bitek van-
nak be�all��tva az �altala mutatott helyen, amelyeket a 0..nsds-1 descriptor-intervallumb�ol
olyan szempontb�ol kell �gyelni, hogy adat �erkezett r�a valahonnan. A writesds ehhez
hasonl�o, de a rendszer enn�el azt �gyeli, hogy k�esz van-e a socket adat k�uld�es�ere.
Az exceptsds hasonl�oan adja meg, hogy mely descriptorokat kell �gyelni "kiv�eteles
esem�enyek" szempontj�ab�ol (pl. s�urg}os adat �erkez�ese). A tmout param�eter egy pointer,
�es ha NULL, akkor a rendszer addig v�ar, am��g valamely k��v�ant esem�eny bek�ovetkezik;
egy�ebk�ent pedig a pointer �altal mutatott c��men lev}o tmout struktur�aban megadott
m�asodperc ill. microsec. ideig v�ar valamely esem�enyre, �es ha semmi sem t�ort�enik
addig, akkor TIMEOUT hib�aval t�er vissza. Megjegyzee�uk, hogy az, hogy egy socket
k�esz az adatk�uld�esre csak annyit jelent, hogy a r�a vonatkoz�o write/send rendszerh��v�asok
v�egrehajt�asukkor nem blokkolnak, �es nem jelenti { p�eld�aul egy esetleges h�al�ozati hiba
bek�ovetkezte ut�an { azt, hogy a h�al�ozati kapcsolat m�ar helyesen m}uk�odik, �es az adat a
kommunik�aci�os kapcsolat egyik v�eg�er}ol a m�asikra �atk�uldhet}o.
A C k�onyvt�ar szabv�anyos makrokat bocs�at a felhaszn�al�o rendelkez�es�ere, amelyekkel a
readsds/writesds/exceptsds mez}oket a socket-descriptorok alapj�an k�onny}u kit�olteni
(ezeket a makrokat haszn�aljuk, mert lehet, hogy k�es}obb a bels}o reprezent�aci�o meg fog
v�altozni).
Ezzel a rendszerh��v�assal lehet microsec. pontoss�ag�u �or�at a programba �ep��teni.
5.12 A kommunik�aci�os partner c��m�enek megszerz�ese
A folyamatok a sz�ul}oj�ukt}ol gyakran �or�ok�olnek megnyitott socketokat. Ha egy folya-
matnak sz�uks�ege van annak meghat�aroz�as�ara, hogy ki van a socket-kapcsolat m�asik
v�eg�en (�oszek�ottet�es-alap�u kapcsolatok eset�en), akkor azt megteheti a getpeername rend-
szerh��v�assal (ez egyes rendszerekben nem rendszerh��v�as, hanem k�onyvt�ari f�uggv�eny, amit
valamilyen m�as rendszerh��v�assal val�os��tanak meg, de ez most sz�amunkra nem �erdekes).
Ennek alakja a k�ovetkez}o:
getpeername(sd, name, namelength);
A name param�eter egy socket-c��m strukt�ura, itt kapom vissza a partner c��m�et. A
strukt�ura harmadik eleme egy pointer egy eg�esz t��pus�u �ert�ekre, amely a c��m hossz�at
tartalmazza (visszat�er�eskor, �es ez term�eszetesen a visszaadott c��m hossz�ara vonatkozik).
A sockethoz (explicit m�odon vagy defaultk�ent) rendelt helyi c��met a getsock-
name rendszerh��v�assal lehet lek�erdezni. Param�eterez�ese ugyanaz, mint a getpeername
f�uggv�eny�e.
5.13 H�al�ozatokkal kapcsolatos k�onyvt�ari
seg�edf�uggv�enyek
Ebben a r�eszben olyan hasznos k�onyvt�ari rutinok lesznek ismertetve, amelyre bony-
olultabb, felhaszn�al�obar�atabb programok ��r�as�an�al sz�uks�eg lehet.
5.13. H �AL �OZATOKKAL KAPCSOLATOS K �ONYVT �ARI SEG�EDF�UGGV�ENYEK91
5.13.1 Hostn�evr}ol IP-c��mre transzform�aci�o
Sok programban sz�uks�eg van a fent eml��tett transzform�aci�ora. Ez a gethostbyname()
k�onyvt�ari rutinnal megy. Param�etere a k�erd�eses host neve, �es visszaad egy pointert, ami
a k�ovetkez}o struktur�ara mutat (egy gethostbyname sz�am�ara statikus adatter�uleten!) :
struct hostent {
char *h_name; /* A host hivatalos neve */
char **aliases; /* Alias-nevek tombje */
int h_addrtype; /* Pl. AF_INET ... */
int h_length; /* A host cimenek a hossza */
char *h_addr_list; /* A host cime(i), NULL-pointerrel
jelezve a lista veget. */
};
A rutin haszn�alat�ara majd l�athatunk p�eld�akat a k�es}obbiekben.
5.13.2 H�al�ozati szolg�altat�asok adatb�azisa
A szabv�anyos szerverek (mint p�eld�aul az FTP vagy a TELNET) a h�al�ozatban min-
den hoston a megfelel}o "j�ol ismert" porton v�arakoznak a kliensek r�akapcsol�od�as�ara. A
"j�ol ismert" port sorsz�am�at �altal�aban nem �egetik bele a szerverbe, hanem egy k�uls}o
adatb�azisban t�arolj�ak (a /etc/services �leban), a programok onnan k�erdezhetik le. Az
adatb�azis lek�erdez�es�et egy getservbyname() k�onyvt�ari f�uggv�ennyel lehet elv�egezni. Ez
egy servent struktur�ara mutat�o pointerrel t�er vissza. A struktura szerkezete a k�ovetkez}o:
struct servent {
char *s_name; /* A szolgaltatas hivatalos neve */
char **s_aliases; /* A szolgaltatas egyeb hasznalt nevei */
int s_port; /* A port sorszama, ahol a szervernek a
a kliensekre kell varnia. Network byte
orderben */
char *s_proto; /* A hasznalando protokoll */
};
Ha p�eld�aul a TCP alap�u FTP protokollt akarjuk haszn�alni, akkor a k�ovetkez}ok�epp
kell a fent eml��tett rutint haszn�alni:
struct servent *sp;
struct sockaddr_in serv_addr;
...
/* serv_addr struktura kitoltese */
sp=getservbyname("ftp","tcp");
serv_addr.sin_port=sp->s_port;
/* ... */
92 FEJEZET 5. A BERKELEY SOCKETOK
5.14 A socketokkal kapcsolatos tov�abbi
rendszerh��v�asok
Ebben a r�eszben olyan socketokkal kapcsolatos dolgok lesznek ismertetve, amelyek n�elk�ul
meg lehet ugyan �elni, de "ig�enyesebb" programokat nem lehet ezek n�elk�ul meg��rni.
5.14.1 TCP s�urg}os adat tov�abb��t�asa
Mint m�ar eml��tve volt, a TCP lehet}os�eget ad s�urg}os adatok (TCP urgent data) k�uld�es�ere
is. A socket interface "generikus" ilyen ir�any�u megtervez�ese (vagyis az Out of Band
data kezel�ese) nagyon neh�ez volt, mivel az egyes protokollok m�as-m�as dolgokat enged-
nek meg Out of Band data-nak. A TCP protokoll egyszerre ak�ar t�obb, �es ak�armilyen
hossz�u �uzenetet tud tov�abb��tani, m��g mondjuk az XNS h�al�ozat egy id}oben legfeljebb 1
bytenyi s�urg}os adatot (Out of Band data-t) tud kezelni (ha csak ezt az XNS lehet}os�eget
haszn�aljuk ki a programunkban, akkor k�onnyen �atvihet}o lesz TCP-re, m��g ford��tva ez
nem szokott menni). M�eg az is bonyol��tja a helyzetet, hogy a TCP m�ar azel}ott jelezni
k�epes a kommunik�aci�os partnernek a s�urg}os adat l�etez�es�et, m�eg miel}ott maguknak az
adatoknak az �atvitele megt�ort�enne.
A s�urg}os (OOB) adatok elk�uld�ese �es fogad�asa annyib�ol �all, hogy a send() ill. recv()
rendszerh��v�asokn�al megadjuk az MSG OOB konstans aget. Az OOB adatokat a t�obbi
"norm�al" adatt�ol teljesen f�uggetlen�ul lehet beolvasni (mintha egy k�ul�on kommunik�aci�os
csatorn�an kapn�ank }oket), �es az
ioctl(sock, SIOCATMARK, &answer);
ioctl() rendszerh��v�assal k�erdezhetj�uk meg az oper�aci�os rendszert}ol, hogy a "norm�al"
adatfolyamnak ezen a pontj�an k�uldt�ek-e az OOB adatot (eszerint a felt�etel szerint lesz
az answer==1 �all��t�as igaz vagy hamis, azaz az answer v�altoz�o �ert�eke 1 lesz, ha az adat-
folyamnak ezen a pontj�an k�uldt�ek az OOB adatot). L�asd erre a k�ovetkez}o p�eld�at!
sigurg_signal_handler()
{
int atmark, buf[1024];
while(1) {
if (ioctl(sock, SIOCATMARK, &atmark)<0) {
perror("ioctl");
exit(2);
}
if (atmark) break;
read(sock, buf,1024);
}
if (recv(sock, &atmark, 1, MSG_OOB) <0) {
perror("recv");
exit(1);
}
}
}
5.14. A SOCKETOKKAL KAPCSOLATOS TOV�ABBI RENDSZERH��V �ASOK 93
A fenti programr�esz a SIGURG signal (a SIGURG signal azt jelzi, hogy s�urg}os ada-
tot k�uld�ott a kommunik�aci�os partner, de nem biztos, hogy azt m�ar meg is kaptuk ...)
kezel�es�et v�egzi. Beolvassa (�es "eldobja") a norm�al adatokat eg�esz addig, am��g a s�urg}os
adat elk�uld�esi hely�eig el nem jut, �es ott beolvas 1 bytenyi s�urg}os adatot. (A SIGURG
signalr�ol ld. a k�ovetkez}o pontot.)
5.14.2 A socketokhoz kapcsol�od�o SIGIO �es SIGURG
signalok
Az eddigiekben csak a socketok "szinkron" m�od�u kezel�es�er}ol volt sz�o (vagyis amikor
a rendszerh��v�asok csak azut�an fejez}odnek be, miut�an az oper�aci�os rendszer a m}uveletet
teljesen elv�egezte). Lehet}os�eg van bizonyos esem�enyeknek az "aszinkron" m�od�u kezel�es�ere
is. Ezzel kapcsolatosak az oper�aci�os rendszer SIGIO �es SIGURG nev}u signaljai.
A rendszert "meg lehet k�erni" a kor�abban m�ar bemutatott signal() rendsz-
erh��v�assal, hogy olyan esetekben k�uldj�on egy SIGIO signalt valamelyik folyamatnak,
amikor valamelyik socketon (beolvasand�o) adat �erkezett. Hasonl�o m�odon k�erhet}o a
"s�urg}os adat �erkez�es�et" jelz}o signal is. Ehhez el}osz�or a signal() rendszerh��v�assal a
k��v�ant signal-handler elj�ar�ast ki kell jel�olni, majd meg kell adni annak a folyamat-
nak az azonos��t�oj�at ( fcntl(socketdescriptor, F_SETOWN, procid) ) rendsz-
erh��v�assal, amelynek a signalt k�uldeni kell; �es v�eg�ul "enged�elyezni" kell a signal-k�uld�est
egy ( fcntl(socketdescriptor, F_SETFL, FASYNC) ) rendszerh��v�assal (vagyis ezzel
azt mondjuk meg az oper�aci�os rendszernek, hogy a signal-handler "k�esz" a signalok fo-
gad�as�ara).
Erre p�elda a k�ovetkez}o programr�eszlet (itt mindk�et signal-handlert kijel�olt�uk, de ez
nem "k�otelez}o" - a saj�at programunkba csak azt kell belerakni, amelyre sz�uks�eg�unk van).
#include <fcntl.h>
#include <signal.h>
#include <errno.h>
int iosignalhandler();
int urgsignalhandler();
int sd;
..
sd = socket( ... );
..
signal(SIGIO,iosignalhandler);
signal(SIGURG,urgsignalhandler);
if (fcntl(sd,F_SETOWN,getpid())<0) { /* Mi kapjuk a signalt */
perror("hiba az 1. fcntl-nel");
exit(1);
}
94 FEJEZET 5. A BERKELEY SOCKETOK
/* Ezutan kapunk majd signalokat - ha valami erkezik */
if (fcntl(sd,F_SETFL,FASYNC)<0) {
perror("hiba a 2. fcntl-nel");
exit(1);
}
5.14.3 UDP broadcast lehet}os�eg
Lehet}os�eg van arra is, hogy a (helyi) Ethernet h�al�ozatra kapcsolt (vagyis a k�abelre
�zikailag r�ak�ot�ott) hostok mindegyik�enek "egy m}uvelettel" (egyszerre) k�uldj�unk valam-
ilyen �uzenetet (magyar�an broadcast �uzenetet k�uldj�unk).
Ezt a k�ovetkez}o socket-opci�o be�all��t�as�aval lehet el�erni:
if ((setsockopt(s,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on))<0) {
/*
* hiba a setsockopt-nal ...
*/
perror("hiba a setsockpt-nal");
....
}
Ezut�an a sockethoz kell rendelni egy c��met (AF INET c��mform�atummal, IN-
ADDR ANY c��mmel, �es annak az UDP portnak a sorsz�am�at kell hozz�arendelni, amelyre
a broadcast �uzenetet a t�obbi g�epen k�uldeni akarjuk.)
5.14.4 Socket aszinkron �uzemm�odra �all��t�asa
Az accept(), connect() �es write() rendszerh��v�asoknak esetenk�ent v�arniuk kell, am��g
valamekkora mem�oria felszabadul. Ez azt jelenti, hogy ha egy folyamat a fenti rendsz-
erh��v�asok k�oz�ul v�egrehajt egyet, �es �epp nincs el�eg szabad mem�oria (egy speci�alisan erre
a c�elra kijel�olt kernel-ter�uleten), akkor a folyamat nem fut tov�abb, am��g a sz�uks�eges
mennyis�eg}u mem�oria fel nem szabadul. Ezt meg lehet ker�ulni a k�ovetkez}o p�eld�aban
bemutatott rendszerh��v�assal:
#include <fcntl.h>
..
sd=socket( ... );
..
if (fcntl(sd,F_SETFL,FNDELAY) < 0) {
perror("hiba az fcntl-nel");
exit(1);
}
5.15. P�ELD�AK A SOCKET RENDSZER HASZN�ALAT�ARA 95
Ezut�an a fent eml��tett rendszerh��v�asok k�oz�ul az accept() �es a connect() negat��v
(vagyis hib�at jelz}o) visszat�er�esi �ert�ekkel t�er vissza, �es az errno v�altoz�oba EWOULD-
BLOCK hibak�od ker�ul, ha a rendszerh��v�as v�egrehajt�as�ahoz a rendszernek v�arnia kellene.
Ekkor a rendszerh��v�as nem hajt�odik v�egre. Az adatk�uld}o (pl. write() �es send()) rend-
szerh��v�asok (amelyek visszat�er�esi �ert�ekk�ent az elk�uld�ott adatbyteok sz�am�at adj�ak vissza)
ha nincs el�eg mem�oria, akkor (esetleg) kevesebb byteot k�uldenek el, �es ezt adj�ak vissza.
5.15 P�eld�ak a socket rendszer haszn�alat�ara
A k�ovetkez}o pontok egy-egy p�eld�an kereszt�ul mutatj�ak be a leggyakoribb kliens �es szerver
feladatokat UNIX k�ornyezetben. Term�eszetesen a val�os �ELETBEN m�as kliens �es szerver
struktur�ak is l�eteznek, de itt nincs lehet}os�eg mindent bemutatni.
5.15.1 P�elda egy egyszer}u iterat��v �osszek�ottet�es-alap�u
szerverre
A k�ovetkez}o program lefoglal egy TCP portot, ki��rja annak a c��m�et a k�eperny}ore, �es
v�egtelen ciklusban v�ar a TCP-porton egy kapcsolatra, �es kiszolg�alja a r�akapcsol�odott
klienst (a szolg�alat annyi, hogy a kliens �altal elk�uld�ott byteokat a szabv�anyos kimenetre
ki��rja).
/*
* Pelda arra, hogy hogyan mukodik egy (iterativ) szerver.
* A program vegtelen ciklusban figyel egy adott TCP portot, beolvassa
* es a kepernyore irja az onnan jovo byteokat, majd uj kapcsolatra
* var.
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h> /* sockaddr_in struktura */
#include <netdb.h> /* /etc/hosts tabla */
#include <stdio.h>
#define TRUE 1
main()
{
int sock, length;
struct sockaddr_in server;
int msgsock;
char buf[1024];
int retval;
int i;
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
96 FEJEZET 5. A BERKELEY SOCKETOK
perror("hiba a socket-nel");
exit(1);
}
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(INADDR_ANY);
server.sin_port = htons(0);
if (bind(sock, &server, sizeof(server))) {
perror("hiba a bind-nel");
exit(1);
}
length = sizeof(server);
if (getsockname(sock, &server, &length)) {
perror("hiba a getsockname-nel");
exit(1);
}
fprintf(stderr,"TCP port:%d\n", ntohs(server.sin_port));
listen(sock, 5);
while(1) {
msgsock = accept(sock, 0, 0);
if (msgsock == -1)
perror("hiba az accept-nel");
else do {
bzero(buf, sizeof(buf));
if ((retval = read(msgsock, buf, 1024)) < 0)
perror("hiba a read-nel");
i = 0;
if (retval == 0)
fprintf(stderr,"Kapcsolat lezarva\n");
else
fprintf(stderr,"String:%s\n", buf);
} while (retval != 0);
close(msgsock);
};
close(sock); /* Sosem sullyedunk idaig */
}
5.15.2 P�elda egy �osszek�ottet�es-alap�u kliensre
A k�ovetkez}o program a megadott host megadott TCP portj�aval fel�ep��t egy kapcsolatot,
�es adatokat k�uld �at oda.
/*
* Hasznalata: programnev hostnev TCPport-number
*
* A program letrehoz a megadott hoston, a megadott TCP porttal
* egy kapcsolatot. Rair egy uzenetet es megall.
5.15. P�ELD�AK A SOCKET RENDSZER HASZN �ALAT �ARA 97
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#define DATA "Isten hozta ornagyur."
main(argc, argv)
int argc;
char *argv[];
{
int sock;
struct sockaddr_in server;
struct hostent *hp, *gethostbyname();
char buf[1024];
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
perror("hiba a socket-nel");
exit(1);
}
server.sin_family = AF_INET;
hp = gethostbyname(argv[1]);
if (hp == NULL) {
fprintf(stderr, "%s: ismeretlen host\n", argv[1]);
exit(2);
}
bcopy(hp->h_addr, &server.sin_addr, hp->h_length);
server.sin_port = htons(atoi(argv[2]));
if (connect(sock, &server, sizeof(server)) < 0) {
perror("hiba a connect-nel");
exit(1);
}
if (write(sock, DATA, sizeof(DATA)) < 0)
perror("hiba a write-nal");
close(sock);
}
98 FEJEZET 5. A BERKELEY SOCKETOK
5.15.3 P�elda egy select-et haszn�al�o �osszek�ottet�es-alap�u
szerverre
A k�ovetkez}o program lefoglal egy TCP portot, ki��rja annak a c��m�et a k�eperny}ore, �es
v�egtelen ciklusban v�ar a TCP-porton egy kapcsolatra, �es kiszolg�alja a r�akapcsol�odott
klienst (a szolg�alat annyi, hogy a kliens �altal elk�uld�ott byteokat a szabv�anyos kimenetre
ki��rja). Ha egy megadott id}on bel�ul nem �erkezik egy klienst}ol sem r�akapcsol�od�asi ig�eny,
akkor megfelel}o hiba�uzenetet ��r ki, �es el}or}ol kezdi az eg�eszet.
/*
* Ez egy egyszeru szerver, amely var egy kliens rakapcsoladasara, de
* egy timeout erteket is definial, es ha azon az idon belul nem
* kapcsolodik ra egy kliens sem, akkor azt eszreveszi es fut tovabb.
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#define TRUE 1
main()
{
int sock, length;
struct sockaddr_in server; /* Internet domain-beli cim */
int msgsock; /* Erre a socket-descriptorra accept-alja
a kapcsolatot */
char buf[1024];
int retval;
fd_set ready;
struct timeval to; /* timeout erteke */
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
perror("hiba a socket-nel");
exit(1);
}
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(INADDR_ANY);
server.sin_port = htons(0);
if (bind(sock, &server, sizeof(server))) {
perror("hiba a bind-nal");
exit(1);
}
length = sizeof(server);
if (getsockname(sock, &server, &length)) {
5.15. P�ELD�AK A SOCKET RENDSZER HASZN �ALAT �ARA 99
perror("hiba a getsockname-nel");
exit(1);
}
fprintf(stderr,"TCP port:%d\n", ntohs(server.sin_port));
/* Kliensekre var */
listen(sock, 5);
while(1) {
FD_ZERO(&ready); /* \"ures halmazt hoz l\'etre */
FD_SET(sock, &ready); /*sock socketot figyelni kell */
to.tv_sec = 5; /* Timeout */
to.tv_usec=0; /* Microsec. */
if (select(sock + 1, &ready, NULL, NULL, &to) < 0) {
perror("hiba a select-nel");
continue;
}
if (FD_ISSET(sock, &ready)) { /* Be van allitva? */
msgsock=accept(sock,(struct sockaddr *)0,
(int *)0);
if (msgsock == -1)
perror("hiba az accept-nel");
else do {
bzero(buf, sizeof(buf));
if ((retval=read(msgsock,buf,1024))<0)
perror("hiba a read-nel");
else if (retval == 0)
fprintf(stderr,"End...\n");
else
fprintf(stderr,"%s\n", buf);
} while (retval > 0);
close(msgsock);
} else
fprintf(stderr,"Nincs kapcsolat ... \n");
};
close(sock); /* Idaig nem sullyedhetunk */
}
5.15.4 P�elda egy konkurrens �osszek�ottet�es-alap�u sz-
erverre
A k�ovetkez}o program lefoglalja az 5678-as TCP portot, ki��rja annak a sorsz�am�at a
k�eperny}ore (vagyis az 5678-at), �es v�egtelen ciklusban v�ar azon a TCP-porton egy kapc-
solatra. Ha egy kliens r�a akar kapcsol�odni, akkor elfogadja a r�akapcsol�od�asi k�erelmet,
majd sz�ul egy gyermek-folyamatot, amely a szok�asos (kor�abban is l�atott) "szolg�altat�ast"
elv�egzi.
A SIGCLD signalt a program ignor�alja,��gy a meghalt gyermek-folyamatok nem "hal-
100 FEJEZET 5. A BERKELEY SOCKETOK
moz�odnak fel" zombi-proceszek form�aj�aban.
/*
* Pelda arra, hogy hogyan mukodik egy (konkurrens) szerver.
* A program vegtelen ciklusban figyel egy adott TCP portot, beolvassa
* es a kepernyore irja az onnan jovo byteokat, majd uj kapcsolatra
* var.
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <signal.h>
#define TRUE 1
main()
{
int sock, length;
struct sockaddr_in server;
int msgsock;
char buf[1024];
int retval;
int i;
signal(SIGCLD,SIG_IGN);
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
perror("hiba a socket-nel");
exit(1);
}
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(INADDR_ANY);
server.sin_port = htons(5678);
if (bind(sock, &server, sizeof(server))) {
perror("hiba a bind-nel");
exit(1);
}
length = sizeof(server);
if (getsockname(sock, &server, &length)) {
perror("hiba a getsockname-nel");
exit(1);
}
fprintf(stderr,"TCP port:%d\n", ntohs(server.sin_port));
listen(sock, 5);
do {
5.15. P�ELD�AK A SOCKET RENDSZER HASZN�ALAT�ARA 101
msgsock = accept(sock, 0, 0);
if (msgsock == -1)
perror("hiba az accept-nel");
else
{
if (fork() == 0)
{ /* Gyermek processz */
close(sock);
do {
bzero(buf, sizeof(buf));
if ((retval = read(msgsock, buf, 1024)) < 0)
perror("hiba a read-nel");
i = 0;
if (retval == 0)
fprintf(stderr,"Kapcsolat lezarva\n");
else
fprintf(stderr,"String:%s\n", buf);
} while (retval != 0);
close(msgsock);
exit(0);
}
else
{
close(msgsock);
}
}
} while (TRUE);
close(sock); /* Sosem sullyedunk idaig */
}
5.15.5 P�elda egy �osszek�ottet�es-mentes (datagram) sz-
erverre
A k�ovetkez}o program lefoglal egy UDP portot, ki��rja annak a c��m�et a k�eperny}ore, �es v�ar
az UDP-porton egy datagramra, �es ha kap egyet, akkor ki��rja a tartalm�at.
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
/*
* A program letrehoz egy UDP socketot, nevvel latja el, es egy ra
* erkezo csomagot fogad es kiir.
*/
main()
102 FEJEZET 5. A BERKELEY SOCKETOK
{
int sock, len;
struct sockaddr_in server, from;
char buf[1024];
int addrlen;
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0) {
perror("hiba a socket-nel");
exit(1);
}
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(INADDR_ANY);
server.sin_port = htons(0);
if (bind(sock, &server, sizeof(server))) {
perror("hiba a bind-nal");
exit(1);
}
len = sizeof(server);
if (getsockname(sock, &server, &len)) {
perror("hiba a getsockname-nel");
exit(1);
}
fprintf(stderr,"UDP port:%d\n", ntohs(server.sin_port));
if (recvfrom(sock, buf, 1024, 0, &from, &addrlen) < 0) {
perror("hiba a recvfrom-nal");
exit(2); }
fprintf(stderr,"Fogadott szoveg: >>%s<<\n", buf);
close(sock);
}
5.15.6 P�elda egy �osszek�ottet�es-mentes (datagram)
kliensre
A k�ovetkez}o program a megadott host megadott UDP portj�ara adatokat k�uld.
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#define DATA "Isten hozta ornagyur ..."
/*
5.16. A H�AL �OZATI R�ETEG (IP PROTOKOLL) EL�ER�ESE 103
* Hivas: udpkliens hostname port-nr.
*
* Ez a program a parametereben megadott hostra, es a megadott
* UDP-portra kuld egy datagramot.
*/
main(argc, argv)
int argc;
char *argv[];
{
int sock;
struct sockaddr_in server;
struct hostent *hp, *gethostbyname();
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0) {
perror("hiba a socket-nel");
exit(1);
}
hp = gethostbyname(argv[1]);
if (hp == NULL) {
fprintf(stderr, "%s: ismeretlen host\n", argv[1]);
exit(2);
}
bcopy(hp->h_addr, &server.sin_addr, hp->h_length);
server.sin_family = AF_INET;
server.sin_port = htons(atoi(argv[2]));
if (sendto(sock,DATA,sizeof(DATA),0,&server,sizeof(server))<0)
perror("hiba a sendto-nal");
close(sock);
}
5.16 A h�al�ozati r�eteg (IP protokoll) el�er�ese
104 FEJEZET 5. A BERKELEY SOCKETOK
Fejezet 6
Security
Ebben a fejezetben az oper�aci�os rendszerekkel kapcsolatban felmer�ul}o biztons�agoss�agi
k�erd�esekr}ol lesz sz�o (legink�abb a UNIX rendszerben felmer�ul}o gondokr�ol). Ez a ny��lt
rendszerekkel kapcsolatban az egyik legfontosabb k�erd�esk�or, mert a f�ajlrendszerben (�es a
rendszer t�obbi r�esz�eben) t�arolt inform�aci�ok a tulajdonosuknak komoly �ert�eket jelenthet-
nek. A biztons�agoss�agra f}oleg a h�al�ozatok jelenl�ete miatt kell �ugyelni (mivel mondjuk
egy hib�asan, �atgondolatlanul meg��rt FTP-szerver ak�ar mindenkinek mindent megenged-
het - mivel ez egyes implement�aci�okban az FTP szerver gyakran setuid root program azaz
v�egrehajt�asakor szuperfelhaszn�al�oi jogokkal rendelkezik). Teh�at a hangs�uly a rendszerhez
val�o hozz�af�er�es szab�alyoz�as�an valamint a kommunik�aci�o biztons�agoss�a t�etel�en van (nem
szabad megengedni, hogy a rendszerben t�arolt adatokhoz illet�ektelenek hozz�af�erjenek)
- az nyilv�anval�o, hogy ez a k�erd�es t�ulmutat az adattitkos��t�as k�erd�es�en - �es az �elet m�as
ter�uleteivel is szoros kapcsolatban van: p�eld�aul a rend}ors�eg hozz�af�erhet az emberekr}ol
t�arolt adatokhoz vagy sem; vagy mi sz�am��tson banktitoknak?
Bizonyos szempontb�ol ide tartozik az adatveszt�es elker�ul�ese is (pl. mert le�eg a h�az,
vagy v�eletlen�ul rossz oppyt formatt�alunk, : : : ), de ezekkel a k�erd�essel itt nem akarok
foglalkozni (nem is igen tudn�ek mit ��rni, azon k��v�ul, hogy rendszeresen csin�aljunk minden
adathordoz�on t�arolt inform�aci�or�ol biztons�agi m�asolatot).
6.1 Tervez�esi elvek
A k�ovetkez}o pontok n�eh�any hasznos szempontot mutatnak be, amelyet biztons�agi rend-
szerek tervez�esekor �erdemes k�ovetni:
� A rendszerterv �es a haszn�alt biztons�agi protokoll legyen nyilv�anos. K�onnyelm}us�eg
azt felt�etelezni, hogy a rendszerbe behatolni akar�ok azt nem fogj�ak ismerni.
� Alap�ertelmez�es mindig legyen az, hogy valaki valamihez nem f�erhet hozz�a.
� A securityvel kapcsolatos k�erd�eseket a rendszer tervez�es�enek korai f�azis�aban
tiszt�azni kell, �es a security csomagot a rendszer magj�aba integr�alni kell - annak
nincs sok �ertelme, hogy egyetlen modult megcsin�alunk �ugy, hogy az nagyon er}os
biztons�agi el}o��r�asoknak feleljen meg, a t�obbi modul pedig nem tartalmaz ilyen c�el�u
r�eszeket.
105
106 FEJEZET 6. SECURITY
� Az alkalmazott biztons�agi int�ezked�esek pszichol�ogiailag elfogadhat�oak legyenek. A
rendszert val�osz��n}uleg emberek fogj�ak haszn�alni, ez�ert a rendszert "bar�ats�agoss�a"
kell tenni.
� Ha lehet ker�ulj�uk az eg�esz rendszer felett "teljes hatalommal b��r�o" rendszergazda
(superuser, supervisor ...) koncepci�ot. A rendszert bontsuk moduljaira (valamilyen
szempontok szerint - mondjuk egy-egy modul egy-egy fontosabb er}oforr�as kezel�es�et
v�egezze), �es az egyes moduloknak legyenek (k�ul�on-k�ul�on) fel�ugyel}oi.
6.2 A felhaszn�al�o azonos��t�asa
Komoly probl�em�at jelent a felhaszn�al�o azonos��t�asa a rendszerrel szemben (mindig
felmer�ulhet a k�erd�es, hogy a felhaszn�al�o t�enyleg az, akinek vallja mag�at?). Erre is l�etezik
m�ar t�obb (pszichol�ogiailag is elfogadhat�o) megold�as - a leggyakoribbak a k�ovetkez}ok:
� A felhaszn�al�onak van valamilyen jelszava, amit csak }o (�es mondjuk az oper�aci�os
rendszer) tud, �es a rendszer a bejelentkez�eskor ezt a jelsz�ot megk�erdezi t}ole. Ha
a felhaszn�al�o a jelsz�ot beadja, �es az egyezik a rendszer �altal ismert jelsz�oval, akkor
nagy a val�osz��n}us�ege annak, hogy az a szem�ely, aki bejelentkezett t�enyleg az,
akinek kiadja mag�at. Ilyen rendszerekben probl�em�at az okoz, hogy hol t�arolja
a rendszer a jelszavakat. Ezt vagy �ugy oldj�ak meg, hogy a jelsz�of�ajl egy speci�alis
f�ajl-attributummal van ell�atva, �es senki sem olvashatja el a tartalm�at (de ekkor
biztons�agi m�asolatot sem lehet r�ola k�esz��teni!). Egy m�asik m�odszer a jelsz�of�ajl
t�arol�as�ara az, amit a UNIX oper�aci�os rendszern�el alkalmaznak: a jelsz�of�ajl min-
denki �altal olvashat�o (�altal�aban /etc/passwd a neve). Viszont ebben a f�ajlban
a jelsz�o nem ny��lt sz�oveg, hanem titkos��tott form�aban van t�arolva (a 2. os-
zlopban van a jelsz�o). Amikor a rendszerbe bejelentkezik egy felhaszn�al�o, �es
beadja a jelszav�at, akkor a rendszer elv�egzi rajta a "szok�asos" (de term�eszetesen
egyir�any�u) titkos��t�asi folyamatot, �es az eredm�enyt �osszehasonl��tja a jelsz�of�ajlban
t�arolt titkos��tott jelsz�oval. Ha a kett}o megegyezik, akkor a felhaszn�al�o j�o jelsz�ot
adott be, �es be lehet engedni a rendszerbe.
� Gyakran haszn�alnak �un. egy alkalomra sz�ol�o jelszavakat. Ekkor a felhaszn�al�o
kap egy f�uzetet, amelyben mondjuk a k�ovetkez}o 1000 bejelentkez�eshez sz�uks�eges
jelszavak vannak. Ennek a m�odszernek az a gyenge pontja, ha a felhaszn�al�o elveszti
ezt a f�uzetet.
� M�as m�odszer a k�erd�es-feleletek m�odszere. Ekkor a felhaszn�al�o (mondjuk amikor
el}osz�or le�ult a g�ephez) beadott az oper�aci�os rendszernek nagyon sok k�erd�est �es
r�ajuk a helyes v�alaszokat. Egy k�ovetkez}o bejelentkez�eskor az oper�aci�os rendszer
ezek k�oz�ul a beadott k�erd�esek k�oz�ul v�alaszt tal�alomra mondjuk �ot�ot, �es megk�erdi
r�ajuk a v�alaszt. Ha a v�alaszok helyesek, akkor a felhaszn�al�ot beengedi a rendszerbe.
� Az azonos��t�as t�ort�enhet ak�ar �zikai �es biol�ogiai tulajdons�agok felhaszn�al�as�aval is
(pl. a retina erezete az emberekre jellemz}o, �es hossz�u id}on kereszt�ul l�enyeg�eben
�alland�o - ezt kihaszn�alva lehet egy olyan berendez�est csin�alni, amelybe a bejelen-
tkez�eskor bele kell n�ezni, �es elv�egzi az azonos��t�ast).
6.3. A 4.3BSD UNIX R-PROGRAMJAI 107
6.3 A 4.3BSD UNIX r-programjai
A 4.3BSD UNIX-ban vannak t�obb olyan program, amely lehet}ov�e teszi, hogy f�ajlokat
m�asoljunk egyik hostr�ol a m�asikra (rcp - remote copy) parancs, egy m�asik hoston shell
scripteket futtassunk (rsh - remote shell) vagy bejelentkezz�unk valamely m�as hostra �es
azon interakt��van dolgozzunk (rlogin - remote login).
Ezek a programok lehet}os�eget ny�ujtanak annak megad�as�ara, hogy ezek a
szolg�altat�asok mely hostokr�ol �erhet}oek el - ezzel bizonyos fok�u illet�ekess�egvizsg�alatra
adnak lehet}os�eget.�Erdemes megn�ezni, hogy hogyan t�ort�enik mindez!
A 4.3BSD UNIX-os hostokon van egy /etc/hosts.equiv nev}u �le, amely tartalmazza
azoknak a hostoknak a neveit, amelyeken azonosak a kiosztott useridek (felhaszn�al�oi
nevek) a helyi hoston lev}o kioszt�assal. Ekkor ha egy ilyen "ekvivalens" hostr�ol mondjuk a
kutya nev}u felhaszn�al�o egy f�ajlt akar m�asolni egy olyan helyi directoryba, amelyre a helyi
kutya nev}u felhaszn�al�onak ��r�asi joga van, akkor ez a m}uvelet meg van engedve. Van egy
m�asik fontos f�ajl is: a .rhosts nev}u (ez a felhaszn�al�o HOME-directoryj�aban tal�alhat�o).
Ebben is lehetnek hostnevek felsorolva (ahol a tulajdonos userid-je (login neve!) meg-
egyezik a helyi login-n�evvel) vagy lehetnek benne (hostn�ev,login-n�ev) p�arok is. Ez
ut�obbi esetben ha a t�avoli hostr�ol a megadott login-nev}u felhaszn�al�o be akar jelentkezni
annak a felhaszn�al�onak a login-nev�evel, akinek a HOME directoryj�aban a .rhosts �le
ezt a (hostn�ev,login-n�ev) p�art tartalmazza, akkor az azonos��t�as a jelsz�o bek�er�ese n�elk�ul
sikeresnek tekinthet}o.
Ha saj�at szervereket ��runk, ahol ezt az r-programokban alkalmazott il-
let�ekess�egvizsg�alatot a ruserok() k�onyvt�ari f�uggv�ennyel v�egezhetj�uk el. Ennek alakja:
ret=ruserok(rhost, superuser, remote_username, local_username);
char *rhost;
int superuser;
char *remote_username;
char *local_username;
Eredm�eny: ret=0, ha az illet�ekess�egvizsg�alat sikeres volt, azaz a felhaszn�al�o bel�ephet
jelsz�obead�as n�elk�ul, egy�ebk�ent ret �ert�eke -1 lesz. (Az rhost param�eter annak a hostnak
a nev�et tartalmazza, amelyr}ol be akarnak jelentkezni (gethostbyaddr(getpeername()))
m�odon kaphatjuk ezt meg. A superuser v�altoz�o akkor 1, ha a bejelentkez}o ezen a g�epen
superuser jogokat akar-e kapni. A marad�ek k�et param�eter a t�avoli �es a helyi hostokon a
felhaszn�al�oi nevek.)
6.4 A Kerberos illet�ekess�eg-vizsg�al�o protokoll
A Kerberos elk�esz��t�es�enek c�elja az volt, hogy a h�al�ozatba rakott "nem megb��zhat�o"
sz�am��t�og�epekkel se lehessen a rendszerben illet�ektelen�ul dolgozni, a szerver �es a kliens
k�ozt �araml�o adatokat titkos��tani lehessen, �es a kliensek ne tagadhass�ak le kil�et�uket
a szerverek el}ott. A Kerberos rendszer a k�ovetkez}ok�eppen m}uk�odik:
Van egy bels}o adatb�azis, amely (azonos��t�o, kulcs) p�arokat t�arol, ahol az azonos��t�ok
k�oz�ott el}ofordul az eg�esz rendszerhez hozz�af�er}o �osszes felhszn�al�o azonos��t�oja, �es minden
egyes szerverhez is tartozik egy-egy azonos��t�o.
108 FEJEZET 6. SECURITY
� Amikor a felhaszn�al�o bejelentkezik valamelyik sz�am��t�og�epbe, �es m�ar be��rta a nev�et
a login: �uzenet ut�an, a login program (aki a bejelentkez�eskor fell�ep}o feladatokat
v�egzi el) egy �uzenetet k�uld a Kerberos illet�ekess�eg-vizsg�al�o szervernek. Az �uzenet
tartalmaz k�et sz�oveget: az egyik sz�oveg a felhaszn�al�o azonos��t�oja, a m�asik sz�oveg
pedig az �un. jegykiad�o szerver (ticket-granting szerver, TGS) nev�et tartalmazza
(ennek a szerep�er}ol k�es}obb lesz sz�o).
� Az illet�ekess�eg-vizsg�al�o szerver a fent eml��tett adatb�azisb�ol kikeresi a kapott
�uzenetben l�ev}o k�et azonos��t�ohoz tartoz�o kulcsokat (a felhaszn�al�oi azonos��t�ohoz
t�arolt kulcs megegyezik a felhaszn�al�o titkos��tott jelszav�aval). Ezut�an a szerver
egy v�alasz�uzenetet k�uld vissza, ami tartalmaz egy titkos �un. TGS-kulcsot, �es egy
�un. jegyet. Ez a TGS-jegy tartalmazza a felhaszn�al�oi azonos��t�ot, a jegykiad�o sz-
erver (TGS) nev�et, annak a sz�am��t�og�epnek az Internet c��m�et, amelyen a felhaszn�al�o
dolgozik, �es a fent eml��tett TGS-kulcsot. A TGS-jegy az �uzenetben titkos��tva van
a felhaszn�al�o �altal nem ismert kulccsal (a jegykiad�o szerver azonos��t�oj�ahoz tartoz�o
kulccsal), �es a teljes �uzenet titkos��tva van a felhaszn�al�o titkos��tott jelszav�aval, hogy
m�as ne f�erjen hozz�a a tartalm�ahoz.
� A felhaszn�al�o jelszav�anak bead�asa ut�an az azonos��t�o szervert}ol visszakapott
�uzenetet a login program a felhaszn�al�o titkos��tott jelszav�aval dek�odolja, �es a TGS-
kulcsot valamint a (titkos��tott) TGS-jegyet elt�arolja.
� Ezut�an ha a felhaszn�al�onak valamilyen h�al�ozati szolg�altat�asra van sz�uks�ege, akkor
a jegykiad�o szervert}ol (TGS-t}ol) k�ernie kell egy "jegyet" a k��v�ant szerverhez, �es a
szervern�el ezzel a jeggyel azonos��thatja mag�at.
� Ha p�eld�aul a nyomtat�o szervert akarjuk haszn�alni, akkor ahhoz egy jegy k�er�es�ehez
a jegykiad�o szerverhez egy olyan �uzenetet kell k�uldeni, amely a kor�abban elt�arolt
TGS-jegyet, a nyomtat�o szerver nev�et �es egy, a kor�abban megkapott TGS-kulccsal
titkos��tott adatmez}ot (ellen}orz}o mez}ot). Ez az ellen}orz}o mez}o tartalmazza a fel-
haszn�al�o bejelentkez�esi nev�et, a g�epj�enek az Internet c��m�et, �es a pillanatnyi id}ot.
� A jegykiad�o szerver a kapott �uzenet ellen}orz�ese ut�an v�alasz�uzenetet k�uld, amiben
van egy �uj kulcs, �es egy �uj (titkos��tott) jegy. Ez a titkos��tott jegy a szolg�altat�ast
k�er}o kil�et�et igazolja, �es a nyomtat�o szerver kulcs�aval van titkos��tva (ami a Kerberos
adatb�azis�aban van, �es csak a nyomtat�o szerver �es a Kerberos f�erhet hozz�a
- ui. a nyomtat�o szerverbe p�eld�aul "be van huzalozva".). A v�alasz�uzenet a kor�abbi
TGS-kulccsal van titkos��tva.
� A felhaszn�al�o programja az �uzenetet dek�odolja, �es a nyomtat�o szervernek a fenti
"�uj jegyet" kell elk�uldenie (m�asik k�et adatmez}o mellett), ezzel igazolhatja kil�et�et.
A m�asik k�et adatmez}ok k�oz�ul az egyik a nyomtat�o szerver nev�et, a m�asik pedig (a
kor�abban eml��tett ellen}orz}o mez}oh�oz hasonl�oan) a felhaszn�al�o bejelentkez�esi nev�et,
6.5. TAN�ACSOK SETUID ROOT PROGRAMOK ��R�AS�AHOZ 109
a g�epj�enek az Internet c��m�et, �es a pillanatnyi id}ot tartalmazza (ez a mez}o az el}oz}o
pontban eml��tett �uj kulccsal van titkos��tva, ez�ert ezt a nyomtat�o szerver dek�odolni
tudja).
A k�et helyen is eml��tett ellen}orz}o mez}o tartalmazza a pillanatnyi id}ot is. Ez az�ert
l�enyeges, mert ezek az "igazolv�anyok" viszonylag r�ovid �elettartalm�uak, nehogy valami
illet�ektelen "h�al�ozatlehallgat�o" �ujra fel tudja haszn�alni. Viszont ekkor meg kell oldani
azt, hogy a h�al�ozatban lev}o g�epek �or�ajai nagyj�ab�ol egy�utt legyenek.
6.5 Tan�acsok setuid root programok ��r�as�ahoz
Ha lehet ne ��rjunk ilyen programokat, mivel ezek futtat�askor korl�atoz�as n�elk�ul
gar�azd�alkodhatnak a rendszerben (ez tal�an a legkomolyabban legmegfontoland�obb
tan�acs). Ha arra van sz�uks�eg, hogy bizonyos f�ajlokhoz (itt nem rendszerf�ajlokra gon-
dolok, hanem mondjuk egy programmal sz�all��tott licensz-f�ajl vagy valami hasonl�o) csak
a program f�erjen hozz�a, akkor el�eg mondjuk egy �uj felhaszn�al�ot l�etrehozni, �es a pro-
gramhoz tartoz�o "k�enyes" f�ajlokat ezen �uj felhaszn�al�o tulajdonak�ent kell kezelni, �es amely
programnak ehhez hozz�a kell f�ernie, azt el kell l�atni egy setuid bittel (de ett}ol m�eg nem
setuid root programot kapunk!).
A setuid root programok ��r�asakor t�orekedj�unk arra, hogy min�el r�ovidebb legyen a
program azon szakasza, ahol a program kihaszn�alhatja azt, hogy "mindent szabad neki".
P�eld�aul azokat a szervereket szokt�ak setuid root bittel ell�atni, amelyek a felhaszn�al�ot�ol
megk�ovetelik, hogy beadja a jelszav�at �es a login nev�et (userid-j�et). Ha j�o a beadott
jelsz�o, akkor a szerver v�egrehajtja a setuid() �es setgid() UNIX rendszerh��v�asokat
annak a felhaszn�al�onak a felhaszn�al�oi- illetve csoport-azonos��t�oj�aval, aki bejelentkezett,
�es a szerver ezut�an m�ar el is veszti a superuser jogokat - ezut�an m�ar csak azt szabad neki
is, amit a bejelentkezett felhaszn�al�o interakt��van is megtehetne a rendszerben.
Ha egy szervert �ugy akarunk meg��rni, hogy azt b�arki haszn�alhassa an�elk�ul, hogy
t�enylegesen bejelentkezett volna a rendszerbe (mint p�eld�aul az anonymous FTP
szolg�altat�as), akkor hozzunk l�etre egy �uj felhaszn�al�ot (az anonymous FTP szolg�altat�as
eset�en ennek a felhaszn�al�onak mindig ftp a neve), amelyre a szerver olyankor setuid()-
el (�es setgid()-el), ha a kliens nem tudott neki m�as ("jobb") felhaszn�al�oi azonos��t�ot �es
jelsz�ot beadni.
A setuid root programok minden f�ajlhoz hozz�af�ernek - f�uggetlen�ul att�ol, hogy ki
ind��totta el }oket. A UNIX oper�aci�os rendszer lehet}os�eget ny�ujt a kor�abban bemutatott
access() rendszerh��v�assal, hogy egy f�ajlra vonatkoz�oan eld�onts�uk, hogy aki a setuid root
programot elind��totta, az a saj�at jog�an olvashatja-e, fel�ul��rhatja-e �es v�egrehajthatja-e azt
a f�ajlt. (Ez az �ut az�ert j�arhat�o, mert az access() a val�odi felhaszn�al�oi azonos��t�o alapj�an
vizsg�alja a jogokat, nem pedig az e�ektiv felhaszn�al�oi azonos��t�o alapj�an; a setuid bit csak
az e�ektiv felhaszn�al�oi azonos��t�ot �all��tja { a val�odi felhaszn�al�oi azonos��t�o is t�arolva van
a processz-t�abl�aban, amit a getuid() rendszerh��v�assal lek�erdezhet�unk vagy a setuid()
rendszerh��v�assal megv�altoztathatunk).
A setuid programok mindig z�arj�ak le a megnyitott f�ajljaikat, mert a gyermek-
folyamatk�ent v�egrehajtott folyamatok a megnyitott f�ajlokat �or�oklik, �es ��gy sok �ert�ekes
inform�aci�ohoz juthatnak (mindegy, hogy mi�ert - ennek lehet az oka programhiba is vagy
lehet ak�ar egy ravasz rendszerprogramoz�o is).
110 FEJEZET 6. SECURITY
A programok �altal haszn�alt tempor�alis f�ajlokat �ugy hozzuk l�etre, hogy azokra a tu-
lajdonosuknak minden (�esszer}u) jogokat meg kell adni, m��g m�asoknak ne legyen semmi
joguk a f�ajlra vonatkoz�oan (vagyis a 0700 okt�alis sz�am gyakran megfelel a creat()-n�el).
Mindig ellen}orizz�uk a rendszerh��v�asok visszat�er�esi �ert�ek�et, �es ha sz�uks�eges, az
errno v�altoz�o �ert�ek�et is. Ezzel kapcsolatban ismert a k�ovetkez}o security-lyuk a UNIX
egy kor�abbi verzi�oj�aval kapcsolatban: b�arki rendszergazda jogokhoz juthatott egy kis
�ugyess�eggel, ugyanis a su parancsban volt egy �ori�asi hiba. Az su rendszerprogram olyan
esetben, amikor nem tudja megnyitni a jelsz�of�ajlt (neve /etc/passwd), jelsz�obek�er�es
n�elk�ul rendszergazda jogokkal illeti meg a v�egrehajt�oj�at. A UNIX k�esz��t}oi �ugy gon-
dolt�ak, hogy a jelsz�of�ajl hi�anya olyan komoly probl�ema { v�eletlen�ul nem is fordulhat
el}o {, hogy ez a m}uk�od�es elfogadhat�o. Viszont a su rendszerprogramban a jelsz�of�ajlt
megnyit�o open() rendszerh��v�as sikertelens�eg�enek nem vizsg�alt�ak meg az ok�at vagyis azt,
hogy val�oban nem l�etezik-e a jelsz�of�ajl, vagy pedig m�as oka van a f�ajlmegnyit�as sikerte-
lens�eg�enek. Ezt a legt�obben �ugy j�atszott�ak ki, hogy megnyitottak annyi f�ajlt, amennyit
csak lehetett1 , �es v�egrehajtott�ak a su parancsot. Ekkor az elind��tott su parancs �or�ok�olte
az }ot elind��t�o folyamat megnyitott f�ajldeszkriptorait, de a jelsz�of�ajlt m�ar nem tudta meg-
nyitni, mert nem volt szabad f�ajldeszkriptora: m�ar megnyitott annyi f�ajlt, amennyi a
folyamat sz�am�ara maxim�alisan enged�elyezve volt. �Igy teh�at az open() rendszerh��v�as
sikertelen volt, annak ellen�ere, hogy volt egy olvashat�o jelsz�of�ajl, m�egis �ugy tekintette a
rendszer, hogy "nagy baj van", �es rendszergazda jogokkal aj�and�ekozta meg az �ovatlan
v�egrehajt�ot : : :
1Vagy kicsit kevesebbet .... persze vigy�aztak arra, hogy a su utility be tudja k�erni a jelsz�ot a /dev/tty
f�ajlr�ol, �es ehhez azt meg kellett tudnia nyitni. Itt megjegyezz�uk, hogy a UNIX rendszerben statikus korl�at azegy folyamat �altal egyidej}uleg megnyithat�o f�ajlok sz�ama.
Fejezet 7
A rendszermag szerkezete
Ebben a fejezetben �attekintj�uk az el}oz}o fejezetekben bemutatott rendszerszolg�altat�asok
implement�al�as�at: azt, hogy milyen m�odon vannak implement�alva a UNIX-szer}u rendsz-
erekben. Nyilv�an t�obb implement�aci�o is l�etezik (System V, BSD, Linux, Solaris, : : : ) �es
mindegyik bemutat�as�ara nincs lehet}os�eg (a forr�ask�odban lehetnek nagyobb k�ul�onbs�egek
is), itt ink�abb a fontosabb adatszerkezetek �es a rendszerer}oforr�asok kapcsolat�at �es
kezel�esm�odj�at fogom bemutatni. (Az el}ofordul�o p�eld�ak legink�abb a 4.3BSD rendszer
korai v�altozataib�ol sz�armaznak; a mem�oriakezel�esn�el bemutatott r�egi�o rendszer pedig a
System V Release 3.0-b�ol sz�armazik1.)
El}osz�or �attekintj�uk a folyamatokkezel�es�enek a fontosabb r�eszleteit, majd a h�atter�eben
lev}o mem�oriakezel�esi mechanizmusokat valamint a f�ajlkezel�es fontosabb k�erd�eseit fogjuk
tiszt�azni.
Meg kell eml��teni, hogy a legt�obb adatszerkezet a r�egebbi rendszermag imple-
ment�aci�okban statikus m�eret}u volt (pl. egy �x m�eret}u vektorban voltak t�arolva),
amit ma m�ar megpr�ob�alnak kik�usz�ob�olni, ��gy a rendszer maxim�alis m�ert�ekben k�epes
lesz kiel�eg��teni a v�altoz�o er}oforr�asig�enyeket. Azt, hogy egy t�abla �x m�eret}u-e vagy
sem, itt nem fogom le��rni (nem is ��rhatom), mivel ez egyr�eszt rendszermag imple-
ment�aci�onk�ent v�altozik m�asr�eszt pedig ugyanannak a rendszernek a k�ul�onf�ele (p�eld�aul
m�as-m�as gy�art�okt�ol sz�armaz�o) v�altozatai egyes r�eszletekben elt�er�eseket mutathatnak
egym�ast�ol.
Nyilv�anval�oan a k�ovetkez}o pontokban le��rt inform�aci�ok nem �altal�anos �erv�eny}uek
(vagyis egy-egy rendszer implement�al�oja d�onthet �ugy, hogy valamit m�ashogyan imple-
ment�al), viszont az eddig elk�esz�ult monolitikus oper�aci�os rendszer implement�aci�okban az
itt k�oz�olt elveket k�ovetik a leggyakrabban.
A UNIX-szer}u rendszerek forr�ask�odj�at eddig �altal�aban nagyr�eszt C nyelven
k�esz��tett�ek el a hardverf�ugg}o r�eszek kiv�etel�evel. A hardverf�ugg}o r�eszeket pedig �altal�aban
alacsonyszint}u assembly nyelven ��rj�ak (sorok sz�am�at tekintve ez gyakran az eg�esz
rendszer m�eret�enek az 5 sz�azal�eka alatt van). A hardverf�ugg}o r�eszek legink�abb az
eszk�ozmeghajt�okat kezel}o, valamint a mem�oriakezel}o r�eszekben tal�alhat�oak, m��g enn�el
kevesebb a hardverf�ugg}o r�eszek mennyis�ege a folyamatok kezel�es�et v�egz}o komponensek-
ben, valamint a f�ajlrendszerkezel}oben.
1A bemutatott eszk�oz�ok kiv�alaszt�as�an�al els}osorban a szeml�eletess�eg volt a c�elom, nem volt c�el, hogy mindeneszk�ozt ugyanabb�ol az oper�aci�os rendszerb}ol v�alasszak.
111
112 FEJEZET 7. A RENDSZERMAG SZERKEZETE
7.1 A folyamatok kezel�ese
El}osz�or �attekintj�uk a folyamatok kezel�es�ehez sz�uks�eges adatszerkezeteket, majd
megn�ezz�uk azt, hogy milyen m�odon lehet az egyes folyamatkezel}o rendszerh��v�asokat im-
plement�alni.
7.1.1 A folyamatkezel�es adatszerkezetei
Kor�abban m�ar eml��tettem, hogy egy oper�aci�os rendszer megtervez�esekor d�ont}o szerepe
van annak, hogy mi minden ker�ul egy folyamatba { azaz milyen er}oforr�asok gy}ujtem�enye
a folyamat. Ez alapvet}oen meghat�arozza a rendszerben fut�o programok k�ornyezet�et.
A legt�obb rendszermag implement�aci�o tartalmaz egy folyamatle��r�o adatszerkezetet,
amelyben �osszegy}ujtik egy-egy folyamat �allapot�anak az �osszes jellemz}oj�et. Ez a folya-
matle��r�o adatszerkezet logikailag k�et f}o r�eszre bonthat�o: az egyik r�esz azokat az in-
form�aci�okat tartalmazza, amelyeknek minden id}opillanatban a mem�ori�aban kell lenni�uk
(ezt nevezik a System V, BSD rendszerekben proc struktur�anak), m��g a m�asik r�esz
(a user (felhaszn�al�oi) struktura) azokat az inform�aci�okat tartalmazza a folyamatr�ol,
amikre csak a rezidens �allapot�aban van sz�uks�eg (vagyis olyankor, amikor a folyamat
a �zikai mem�ori�aban tart�ozkodik, azaz a mem�oriakezel}o nem rakta ki a h�att�ert�arra { a
�zikai mem�oria kis m�erete miatt). A rendszer tartalmaz egy �un. processz-t�abl�at, amely
(gyakran �x m�eret}u) folyamatonk�ent tartalmaz egy hivatkoz�ast a megfelel}o folyamat
user illetve proc struktur�aj�ara, valamint tartalmazza egy eg�esz konstanst, ami a folya-
mat exit-st�atusz�at �es �allapot�at jellemzi, �es a k�ovetkez}o �allapotok valamelyik�et jel�olheti
ki a folyamat aktu�alis �allapotak�ent:
� SSLEEP : A folyamat egy esem�eny bek�ovetkezt�ere v�ar (ld. k�es}obb).
� SRUN : A folyamat fut�asra k�esz (lehet, hogy pillanatnyilag nem }o, de az �utemez}o
�atadhatja neki a vez�erl�est).
� SZOMB : A folyamat befejez}od�ott, de a visszat�er�esi �ert�ek�et (exit-st�atusz�at) m�eg
nem k�erdezte meg a sz�ul}oje, ez�ert ez a processz-t�abla bejegyz�es m�eg nem lett
megsz�untetve.
� SSTOP : A folyamat fut�asa meg lett �all��tva (p�eld�aul egy signallal).
� SIDL : Egy seg�ed�allapot, amelyet a rendszermag l�etrehoz�as alatt �all�o, m�eg nem
futtathat�o folyamatok sz�am�ara tart fenn.
A proc strukt�ura a k�ovetkez}o inform�aci�okat tartalmazza:
��Utemez�esi jellemz}ok (p�eld�aul a folyamat priorit�as�at), a folyamat processzorter-
hel�es�enek a m�ert�ek�et, ...
� Folyamatazonos��t�ot (a sz�ul}ofolyamat azonos��t�oj�aval egy�utt).
� A folyamatot futtat�o felhaszn�al�o azonos��t�oj�at.
� Mem�oriakezel�esi inform�aci�ok:
{ Egy hivatkoz�as a program k�odj�anak a szerkezet�et le��r�o t�abl�azatra (ezt nevezik
a BSD-ben text strukt�ur�anak { err}ol nemsok�ara r�eszletesebben is ��rok).
7.1. A FOLYAMATOK KEZEL�ESE 113
{ A folyamat lapt�abl�aj�anak a c��m�et is tartalmazza.
{ A folyamat user struktur�aj�anak a mem�oriabeli vagy (kilapozott �allapotban)
h�att�ert�arol�on lev}o hely�et tartalmazza.
� Egy esem�eny megnevez�es�et is tartalmazhatja, amelynek a bek�ovetkez�es�eig a folya-
mat v�arakozik (vagyis nem fut). A rendszermag egy-egy esem�eny bek�ovetkeztekor
(p�eld�aul amikor egy blokkot beolvasott a diszkr}ol) megn�ezi azt, hogy mely folyama-
tok v�arakoznak az adott esem�enyre, �es tov�abbind��tja }oket. Egy folyamat egyszerre
legfeljebb csak egy esem�eny bek�ovetkez�es�ere v�arakozhat.
� Tartalmazza azt, hogy milyen signalokat k�uldtek a folyamatnak (ez lehet ak�ar egy
32-bites eg�esz sz�am, egy-egy bitje egy-egy signalnak felelhet meg). Tov�abb�a tar-
talmaz arr�ol is inform�aci�okat, hogy az egyes signalokat a folyamat milyen m�odon
kezeli (nem veszi �gyelembe }oket, vagy van a folyamatban egy signal-kezel}o elj�ar�as,
vagy pedig az alap�ertelmez�es szerinti signalkezel�esi m�odot v�alasztotta a folyamat).
Amennyiben egy folyamat valamilyen esem�enyre v�arakoz�as k�ozben signalokat kap,
akkor bejegyzi ide, hogy milyen signalt kapott, �es a kapott signalt csak azut�an fogja
feldolgozni, miut�an az v�art esem�eny bek�ovetkezett, �es a folyamat tov�abbfut.
� Tartalmazza, hogy a folyamat mikorra k�ert "�ebreszt}ot" (amennyiben �onk�ent
v�arakoz�o �allapotba ment valamennyi id}o eltelt�eig, vagy egy ALARM signalt k�ert
az oper�aci�os rendszert}ol).
A fenti adatok szerepe alapj�an l�athat�o, hogy �alland�oan a mem�ori�aban kell }oket tartani
(ezek n�elk�ul nem lehetne "igazs�agosan" kiv�alasztani azt, hogy egy kontextuscsere ut�an
melyik folyamat kapja meg a processzort).
A folyamatok proc strukt�ur�aja egyr�eszt fel van f}uzve egy k�etir�any�u list�aba, amely
list�an v�egigmenve az �osszes folyamat adataihoz hozz�af�erhet�unk. Kor�abban m�ar
eml��tettem, hogy egy folyamat tetsz}oleges sz�am�u ut�odot (gyermek-folyamatot) hozhat
l�etre, ��gy kialakulhat a folyamatoknak egy fa szerkezet}u struktur�aja, amely egy �altal�anos
fa (vagyis nemmondhatunk egy fels}o korl�atot arra vonatkoz�oan, hogy a f�aban egy folyam-
atot reprezent�al�o pontnak legfeljebb h�any gyermeke lehet). Ezt a fa szerkezet}u hierarchi�at
is t�arolni kell, amit a legt�obb rendszerben nem k�ozvetlen�ul �altal�anos fak�ent t�arolnak,
hanem az �altal�anos fa adatszerkezetet bin�aris f�ara visszavezetve t�arolj�ak (a bin�aris f�ara
val�o visszavezet�eses t�arol�as �ugy t�ort�enik, hogy a bin�aris fa minden egyes csom�opontj�aban
van egy hivatkoz�as az �altal�anos fabeli megfelel}o pont els}o gyermek�ere, valamint van egy
hivatkoz�as az �altal�anos fabeli testv�ereire { ez a m�odszer az adatszerkezeteket t�argyal�o
k�onyvekben magtal�alhat�o alapvet}o m�odszer; sz�amunkra ez m�ar kev�esb�e l�enyeges).
Egy folyamat user struktur�aja a k�ovetkez}o inform�aci�okat tartalmazza:
� Tartalmazza azt, hogy a folyamat "felhaszn�al�oi" �uzemm�odban fut-e, vagy pedig
valamilyen rendszerh��v�ast v�egrehajtva a rendszermag valamelyik r�esz�eben "fut".
� A rendszerh��v�asok param�etereit �es v�egrehajt�asuk �allapot�at le��r�o adatszerkezeteket.
� A folyamathoz tartoz�o programv�egrehajt�asi pont jellemz}oit (processzorregiszterek
�ert�ek�et, a v�egrehajt�asi verem tetej�ere mutat�o veremmutat�o).
114 FEJEZET 7. A RENDSZERMAG SZERKEZETE
� A folyamathoz tartoz�o m�asodik (kernel m�odban haszn�alt) veremmutat�o �ert�ek�et
(egy folyamathoz legink�abb biztons�agoss�agi okok miatt k�et verem tartozik: az
egyik vermet a program az elj�ar�asok param�etereinek, lok�alis v�altoz�oinak �es a vis-
szat�er�esi c��mek t�arol�as�ara haszn�alja { erre szoktak egyszer}uen v�egrehajt�asi verem
n�even hivatkozni); a m�asik veremet a rendszermag olyankor haszn�alja, amikor a
folyamat k�er�es�ere valamilyen szolg�altat�ast elv�egez (ezt nevezik a folyamat rendsz-
ermagbeli verm�enek (angolul kernel stack), �es a user struktura nemcsak a verem-
mutat�ot, hanem mag�at ezt a m�asodik (rendszermagbeli) vermet is tartalmazza. A
k�et veremre els}osorban biztons�agi okok miatt van sz�uks�eg: egyr�eszt azzal, hogy a
(�x m�eret}u { n�eh�any KB m�eret}u) rendszermagbeli verem sz�am�ara sz�uks�eges (el�eg
kicsi) hely �alland�oan le van foglalva, nem fordulhat el}o az a kellemetlen helyzet,
hogy a rendszermag m}uk�od�ese sor�an "megb�enul" egy esetleges mem�oriabetel�es mi-
att (ciki lenne, ha a rendszermag egy elj�ar�ast sem tudna megh��vni, mivel mondjuk
betelt a mem�oria); tov�abb�a mivel a folyamat "felhaszn�al�oi" m�odban nem f�er hozz�a
a rendszermagbeli verm�enek a tartalm�ahoz, ez�ert nem tud hozz�af�erni a vermen lev}o
olyan inform�aci�okhoz, amit a kernel "rajta hagyott", �es nem t�or�olt onnan (ezekhez
az inform�aci�okhoz a kernelen k��v�ul m�asnak �altal�aban nincs semmi k�oze).
� Itt van t�arolva a folyamat f�ajldeszkriptoraihoz taroz�o f�ajl-t�ablabeli hivatkoz�as
(vagyis az, hogy melyik f�ajldeszkriptorhoz a glob�alis f�ajlt�abla melyik eleme tartozik
{ eml�ekezz�unk r�a, hogy erre az�ert is sz�uks�eg van, mert egy folyamat "oszt�od�asa"
ut�an a sz�ul}o �es a gyermek folyamat ugyanazokhoz a f�ajlokhoz f�erhet hozz�a, a
f�ajl-poz��ci�okat pedig megosztva haszn�alj�ak). Itt vannak t�arolva f�ajldeszkriptorhoz
k�ot�ott inform�aci�ok is (p�eld�aul az, hogy a f�ajlt a folyamat "oszt�od�asa" ut�an au-
tomatikusan le kell z�arni).
� A folyamat er}oforr�ashaszn�alat�anak jellemz}o adatai (azaz mib}ol mennyit haszn�alt
(CPU id}ot)).
� A folyamatot futtat�o felhaszn�al�o csoport-azonos��t�oja, valamint az e�ektiv fel-
haszn�al�oi �es csoportazonos��t�ok is itt lesznek t�arolva.
� A folyamat munka-directoryja is itt van t�arolva.
� A folyamat gy�ok�er-directoryja is itt van t�arolva (ne felejts�uk el, hogy ez is v�altozhat
{ gondoljunk csak a chroot() rendszerh��v�asra).
Egy folyamat a mem�ori�aban t�obb �un. szegmensb}ol �all (egyes implement�aci�okban a
szegmens helyett a r�egi�o elnevez�est is haszn�alj�ak). A szegmenseknek h�arom "oszt�aly�at"
szok�as megk�ul�onb�oztetni (ez az oszt�alyoz�as a szegmensek szerepe alapj�an t�ort�enik): van-
nak v�egrehajthat�o utas��t�asokat tartalmaz�o �un. k�odszegmensek, adatokat tartalmaz�o
adatszegmensek, valamint a v�egrehajt�asi vermet tartalmaz�o veremszegmensek. Egy
folyamat �altal�aban mindh�arom szegmenst��pussal rendelkezik; a szegmenseket a virtu�alis
mem�ori�aban �ugy szok�as elhelyezni, hogy a virtu�alis c��mtartom�any valamelyik "v�eg�en"
(leggyakrabban az alj�an) helyezkedik el a �x m�eret}u k�odszegmens (ennek a m�erete adott,
miut�an a programot leford��tottuk), a fennmarad�o helyen pedig a verem �es az adat-
szegmens helyezkedik el { �altal�aban ezek nem r�ogz��tett m�eret}uek, kezdetben a virtu�alis
c��mtartom�any k�et "sz�el�en" helyezkednek el, �es egym�as ir�any�aba h��znak. A szegmensek
�altal�aban egy szegmenst�abl�aba vannak rendszerezve.
7.1. A FOLYAMATOK KEZEL�ESE 115
M�ar eml��tettem, hogy minden folyamathoz nyilv�an van tartva egy hivatkoz�as egy �un.
text struktur�ara. Ez a text strukt�ura pointereket tartalmaz a folyamat v�egrehajthat�o
k�odj�at tartalmaz�o k�odszegmensekre. Minden text strukt�ura tartalmaz egy referen-
ciasz�aml�al�ot (ez egy eg�esz sz�am), amelyben t�arolja, hogy h�any folyamat hivatkozik
r�a a proc struktur�aj�aban (vagyis az �altala le��rt v�egrehajthat�o k�odot h�any program
haszn�alja)), valamint tartalmazza a r�a hivatkoz�o folyamatok proc struktur�aj�anak a
list�aj�at.
7.1.2 A folyamatkezel�es rendszerh��v�asai
M�ar l�attuk a folyamatok szerkezet�enek a kezel�es�evel kapcsolatos fontosabb adatsz-
erkezeteket; most �attekintj�uk azt, hogy a folyamatokat kezel}o rendszerh��v�asok (p�eld�aul a
fork() �es az exec()) (illetve a wait() �es az exit()) hogyan lesznek megval�os��tva, mit
kell csin�alniuk ezeken az adatszerkezeteken a feladatuk elv�egz�es�e�ert.
A fork() rendszerh��v�as l�etrehoz egy �uj proc strukt�ura objektumot az �uj gyermek-
folyamat r�esz�ere �es megfelel}oen kit�olti azt (egyedi folyamatazonos��t�ot kap, bejegyzi a fut-
tat�o felhaszn�al�o azonos��t�oj�at, : : : ). Ezut�an a sz�ul}o folyamat user struktur�aj�at lem�asolja,
�es a m�asolatot az �uj folyamatmegkapja. Mivel mind a sz�ul}o, mind pedig a gyermek folya-
mat ugyanazt a k�odot hajtja v�egre (mindkett}onek a proc struktur�aja ugyanarra a text
struktur�ara mutat), ez�ert a sz�ul}o text struktur�aj�anak a referenciasz�aml�al�oj�at n�ovelni
kell eggyel a konzisztencia �erdek�eben, �es az �ujonnan l�etrehozott folyamat proc struk-
tur�aj�at be kell csatolni a folyamatok kor�abban m�ar eml��tett k�etir�any�u list�aj�aba illetve
a folyamatok fa-struktur�aj�u hierarchi�aj�aba. Ezut�an az adat- illetve veremszegmensek
sz�am�ara lesz hely lefoglalva (pontosan akkora, amekkora a sz�ul}oben volt a megfelel}o
szegmens m�erete), �es a sz�ul}o adat- illetve veremszegmens�enek a tartalma �at lesz m�asolva
a gyermekfolyamat megfelel}o szegmenseibe. Megjegyezz�uk, hogy ezt a szegmensm�asol�ast
gyakran optimaliz�alj�ak olym�odon, hogy a gyermek �es a sz�ul}o folyamatok ugyanazt a
mem�ori�at haszn�alj�ak eg�eszen addig, ami��g valamelyik�uk nem m�odos��tja, �es a t�enyleges
m�asol�asra csak a m�odos��t�askor (�altal�aban csak a m�odos��tott r�eszt tartalmaz�o lapon) ker�ul
sor. Ez az optimaliz�al�as a fork() m}uveletet nagyon "olcs�ov�a" teheti a legt�obb alka-
lmaz�asakor, mivel a fork() szolg�altat�ast haszn�al�o programok nagyon nagy sz�azal�ek�aban
a fork() rendszerh��v�ast egy exec() rendszerh��v�as k�oveti a gyermekfolyamatban, aminek
az eredm�enyek�ent a folyamat virtu�alis c��mtartom�any�anak a k�od-, adat- illetve veremszeg-
mens�et ki lehet dobni ... Term�eszetesen a processz-t�abl�aban is l�etrej�on egy �uj bejegyz�es a
megfelel}o proc illetve user struktur�akkal, a folyamat pedig fut�asra k�esz SRUN �allapotban
lesz bejegyezve.
Az exec() rendszerh��v�as nem hoz l�etre �uj proc illetve user struktur�at, hanem az
�ujonnan elind��tand�o folyamat k�odj�at tartalmaz�o k�odszegmenssel egy �uj text struktur�at
hoz l�etre (ha a megfelel}o k�odszegmenst tartalmaz�o text struktura m�ar l�etezik, akkor
annak a referenciasz�aml�al�oj�at n�oveli eggyel), a r�egi k�odot tartalmaz�o text strukt�ura
referenciasz�aml�al�oj�at pedig cs�okkenti eggyel, �es amennyiben a sz�aml�al�o null�ara cs�okken
(vagyis m�as m�ar nem haszn�alja azt a k�odot), akkor az oper�aci�os rendszer eldobja azt.
A v�egrehajthat�o programb�ol be lesznek t�oltve az inicializ�alt statikus illetve glob�alis
v�altoz�okat tartalmaz�o adatszegmens (ha van ilyen). A f�ajldeszkriptor t�abla olyankor
m�odos��tva lesz, ha valamelyik f�ajldeszkriptorhoz megadt�ak, hogy exec() rendszerh��v�as
v�egrehajt�asakor le kell z�arni. A signalok kezel�es�et le��r�o t�abl�azatok majdnem minden
v�altoztat�as n�elk�ul megmaradnak, csak olyankor kell m�odos��tani, ha valamelyik signal-
116 FEJEZET 7. A RENDSZERMAG SZERKEZETE
hoz egy signal-kezel}o elj�ar�as c��me volt elt�arolva, ugyanis az �ujonnan bet�olt�ott folyamat
c��mtartom�any�aban ki tudja mi van azon a helyen : : : .
Miut�at egy folyamat befejez}odik �es v�egrehajtotta az exit() rendszerh��v�ast, a ker-
nel felszabad��tja az �altala lefoglalt adat �es verem mem�oriaszegmenseket, cs�okkenti a
k�odszegmenst le��r�o text struktura referenciasz�aml�al�oj�at, �es ha ez null�ara cs�okken, akkor
felszabad��tja a k�odszegmensek �altal elfoglalt mem�oriater�uleteket. Ezut�an lez�arja a be-
fejez}od�ott folyamat m�eg megnyitott f�ajldeszkriptorjait, �es deallok�alhatja a user struk-
tur�aj�at is. A folyamat exit-st�atusza (vagyis az az �ert�ek, amit az exit() rendszerh��v�as
argumentumak�ent megadtak, ki lesz m�asolva a proc struktur�ab�ol (ui. kicsivel kor�abban
oda lett berakva) a processz-t�abl�aba, majd a sz�ul}ofolyamatnak k�uldve lesz egy SIGCHLD
signal, jelezve neki, hogy meghalt egy gyermeke, ezut�an deallok�alva lesz a folyamat proc
struktur�aja. A gyermek ezut�an { m�ar er}oforr�asait felszabad��tva { beker�ul a zombie
folyamatok (processz-t�ablabeli �allapota SZOMB lesz) k�oz�e eg�eszen addig, am��g a sz�ul}oje le
nem k�erdezi az exit-st�atusz�at, majd ut�ana a folyamat processz-t�abla bejegyz�ese is t�or�olve
lesz.
A wait() rendszerh��v�as v�egrehajt�asa ut�an a sz�ul}o folyamat megn�ezi a gyermekeinek
a list�aj�at, hogy valamelyik befejez}od�ott-e (azaz �allapota SZOMB-e), �es ha igen, akkor
visszaadja az exit-st�atusz�at, �es megsz�unteti a sz�am�ara lefoglalt processz-t�abla bejegyz�est.
7.1.3 �Utemez�esi k�erd�esek
A rendszermag feladatai k�oz�e tartozik az �utemez�es megszervez�ese: a processzor
megoszt�asa a fut�asra k�esz folyamatok k�oz�ott { lehet}oleg igazs�agosan (az igazs�agoss�ag nem
felt�etlen�ul az egyenl}o eloszt�ast jelenti, hanem a folyamatok k�ozt a fontoss�aguk szerinti
eloszt�ast). A kontextuscsere (vagyis a v�alt�as az egyik folyamatr�ol a m�asikra) vagy akkor
lesz, amikor az aktu�alisan fut�o folyamat id}oszelete lej�ar (vagyis mondjuk 50 ms-on �at fu-
tott), vagy amikor a folyamat valamilyen I/O m}uvelet elv�egz�es�et k�eri a rendszermagt�ol,
�es a folyamat k�enytelen le�allni �es v�arakozni addig, am��g a rendszermag a megadott
m}uveletet elv�egzi. Fontos megeml��teni, hogy amikor egy folyamat a rendszermag valami-
lyen szolg�altat�as�at ig�enybe akarja venni, �es a vez�erl�es �atad�odik a rendszermagba, azut�an
a rendszermagban fut�o folyamat nem lesz megszak��tva (vagyis nem t�ort�enik kontextusc-
sere) eg�eszen addig, am��g a folyamat vagy el nem hagyja a rendszermagot, vagy pedig
�onmaga hajland�o lemondani a CPU-haszn�alati jog�ar�ol (�altal�aban az�ert, mert valamilyen
esem�enyre kell v�arnia). Erre az�ert van sz�uks�eg, mert a rendszermag szolg�altat�asait egysz-
erre t�obb folyamat is ig�enyelheti, �es valamilyen m�odon meg kellett val�os��tani a konkur-
rens folyamatok k�olcs�on�os kiz�ar�as�at. Az el�eg drasztikus megold�asnak t�unhet, hogy a
rendszermag haszn�alata k�ozben a folyamatok nem szak��that�ok meg, viszont a rendsz-
ermag �altal�aban �ugy van elk�esz��tve, hogy a folyamatok viszonylag hamar kil�ephetnek
bel}ole vagy el�eg hamar k�enytelenek �onsz�antukb�ol a CPU-haszn�alati jogot (pl. egy I/O
eszk�oznek munk�at adva).
Amikor egy folyamat a rendszermagban tart�ozkodik, �es kezdem�enyezi egy diszk-
szektor tartalm�anak a beolvas�as�at, akkor v�arnia kell addig, am��g a megadott szektor
be lesz olvasva a k�ozponti mem�ori�aba, �es a rendszermag a rendelkez�es�ere bocs�atja a
megadott blokkot. Ezt a v�arakoz�ast a folyamat elt�oltheti �ugy is, hogy folyamatosan
v�egrehajt olyan utas��t�asokat, amelyekkel ellen}orizheti, hogy a rendelkez�es�ere �all-e a
megadott diszk-szektor, �es ha nem, akkor tov�abb v�ar, viszont ez a megold�as CPU-
id}o pazarl�ashoz vezetne, hiszen azalatt, am��g egy folyamat v�arakozik, addig egy m�asik
7.2. A MEM�ORIAKEZEL }O IMPLEMENT �ACI �OJA 117
folyamatot el lehet ind��tani (ez az id}ooszt�asos multiprogramoz�as hat�ekonys�ag�anak tal�an
legf}obb alapja). Egy folyamat a rendszermagban a sleep() f�uggv�enyh��v�assal mondhat le
a processzorhaszn�alati jog�ar�ol (ennek a f�uggv�enynek az argumentumak�ent meg kell adni
egy esem�eny-azonos��t�ot { annak az esem�enynek az azonos��t�oj�at, aminek a bek�ovetkez�es�eig
a folyamat v�arakozni akar). Amikor egy esem�eny bek�ovetkezik (p�eld�aul beolvastak
egy olyan diszk-szektort, amire valamelyik folyamat v�arakozik), akkor aki az esem�enyt
el}oid�ezte (diszk-blokk beolvas�askor p�eld�aul az az eszk�ozmeghajt�o, amelyik a k�erd�eses
blokkot beolvasta) v�egrehajt egy wakeup() f�uggv�enyh��v�ast, megadva az argumentu-
mak�ent a bek�ovetkezett esem�eny azonos��t�oj�at, �es ezut�an az �osszes olyan folyamat, amelyik
a megadott esem�enyre v�arakozott �ujra fut�asra k�eszen v�arja, hogy megkapja a k�ovetkez}o
id}oszelet�et. Fontos l�atni, hogy egy esem�enyre egyidej}uleg t�obb folyamat is v�arakozhat, �es
ha egy esem�eny bek�ovetkezik, akkor az �osszes r�a v�ar�o folyamat tov�abb fog futni (ez azt
is jelenti, hogy ha p�eld�aul mem�oriahi�any eset�en k�et folyamatnak is sz�uks�ege van mond-
juk egy-egy szabad mem�orialapra, akkor mindketten v�arakozhatnak arra az esem�enyre,
hogy felszabadul egy kor�abban haszn�alatban lev}o mem�orialap, �es miut�an felszabadult
egy mem�orialap, akkor mindk�et v�arakoz�o folyamat el lesz ind��tva, viszont miut�an az
egyik folyamat { mondjuk az, amelyik el}obb fut { megszerezte mag�anak a felszabadult
mem�orialapot, ism�et el}o�all az a helyzet, hogy nincs szabad mem�orialap, �es a m�asik {
addig v�arakoz�o { folyamat ezt ellen}orizv�en �ujb�ol v�arakoz�asra k�enyszer�ul). Felmer�ulhet a
k�erd�es, hogy hogyan nevezhetik az esem�enyeket, amiknek a bek�ovetkez�es�ere v�arni lehet:
tetsz}oleges eg�esz sz�am megadhat�o esem�enyn�evk�ent, de a kialakult konvenci�ok alapj�an
egy, az esem�ennyel kapcsolatos fontosabb, az esem�enyt egy�ertelm}uen azonos��t�o rend-
szermagbeli adatszerkezet mem�oriabeli c��m�et szok�as esem�eny-azonos��t�ok�ent megadni:
ha p�eld�aul egy adott sorsz�am�u diszk-szektor beolvas�as�ara v�arunk, akkor megadhatjuk
annak a mem�oriarekesznek a c��m�et esem�enyazonos��t�ok�ent, ahov�a a megadott diszk-
blokk beolvas�as�at a kernelt}ol k�ert�uk (a megfelel}o diszk-blokk bu�er fejl�ec�enek a c��m�et
{ ld. err}ol a k�es}obbieket). A rendszermag sleep/wakeup mechanizmus�anak van egy
h�atr�anya is: a sleep m}uvelet nem egyetlen atomi g�epi utas��t�as v�egrehajt�as�ab�ol �all, ez�ert
el}ofordulhat az, hogy az esem�eny bek�ovetkez�es�et jelz}o wakeup-ot az esem�enyt el}oid�ez}o
rendszermagkomponens a sleep m}uvelet befejez}od�ese el}ott megh��vja, �es mivel akkor m�eg
az van nyilv�antartva, hogy senki nem v�ar az adott esem�enyre, ez�ert a wakeup nem
jelzi az �epp v�arakozni kezd}o folyamatnak, hogy nem kell tov�abb v�arakoznia. Ezt a
probl�em�at �ugy oldott�ak meg, hogy az ilyen kritikus helyzetekben az ellen}orz�est v�egz}o
k�odot �es a sleep f�uggv�enyh��v�ast "mesters�egesen" atomi utas��t�ass�a teszik azzal, hogy a
v�egrehajt�asuk idej�ere letiltj�ak a hardver megszak��t�asokat (ezzel senki sem szak��thatja
f�elbe a m}uk�od�es�et).
7.2 A mem�oriakezel}o implement�aci�oja
A mem�oriakezel�es feladata a rendszermag mem�oriasz�uks�egleteinek a kiel�eg��t�ese. Ez
nyilv�an mag�aba foglalja a a folyamatokat alkot�o szegmensek ill. r�egi�ok sz�am�ara val�o
helylefoglal�ast, valamint az oper�aci�os rendszer bels}o feladatainak ell�at�as�ahoz sz�uks�eges
mem�orialefoglal�ast. L�athattuk, hogy a kernel verem m�erete �x, r�aad�asul nem is t�ul
nagy, ez�ert azon nem lehet nagym�eret}u lok�alis v�altoz�okat allok�alni { ez�ert a kernel
r�ak�enyszer�ulhet arra, hogy m�as forr�asokb�ol jusson a feladat�anak az ell�at�as�ahoz sz�uks�eges
mem�ori�ahoz.
A mem�oriakezel}o k�et f}o komponensb}ol �all: az egyik komponens feladata az
118 FEJEZET 7. A RENDSZERMAG SZERKEZETE
el}obbiekben m�ar megeml��tett r�egi�o t��pus�u objektumok implement�al�asa a processzor
mem�oriakezel}o hardver�en (ez proceszort��pust�ol f�ugg}o k�od; a k�ul�onb�oz}o gy�artm�any�u,
de azonos processzor�u g�epek k�oz�ott ez egy hordozhat�o k�odnak tekinthet}o { ennek
kell biztos��tani a rendszermag lapoz�asos �es szegment�alt mem�oriakezel�es�enek az alap-
jait). A m�asik komponens feladata a r�egi�o objektumok seg��ts�eg�evel a rendszermag
mem�oriaig�enyeinek a kiel�eg��t�ese.
Mint m�ar eml��tettem, egy folyamat virtu�alis mem�ori�aja k�ul�onf�ele �un. r�egi�okb�ol lesz
�osszerakva. L�etrehoz�asakor egy folyamat virtu�alis c��mtartom�anya n�egy r�egi�ot tartalmaz:
� Egy v�egrehajthat�o k�odot tartalmaz�o r�egi�ot
� Egy, az inicializ�alt (kezd}o�ert�ekekkel ell�atott) glob�alis v�altoz�okat tartalmaz�o r�egi�ot
� Egy, az inicializ�alatlan (kezd}o�ert�ekekkel nem ell�atott) v�altoz�okat tartalmaz�o r�egi�ot
(ez a r�egi�o nem �x m�eret}u; a m�erete a folyamat ig�enyeinek megfelel}oen b}ov��thet}o
vagy cs�okkenthet}o). A program fut�asa sor�an allok�alt dinamikus mem�oria (C
programokban p�eld�aul a malloc() f�uggv�enyh��v�assal t�ort�en}o mem�oriaallok�al�assal
lefoglalt mem�oria) ebben a r�egi�oban lesz lefoglalva.
� A v�egrehajt�asi vermet tartalmaz�o r�egi�ot.
Egy r�egi�o m�erete teh�at id}oben v�altozhat, �es m�eret�ukkel kapcsolatban egyetlen korl�at
az az, hogy a r�egi�oknak be kell f�erni�uk a (virtu�alis) mem�ori�aba.
Egy folyamathoz id}ovel �ujabb r�egi�okat is lehet allok�alni: p�eld�aul osztott k�onyvt�arak
(shared library) alkalmaz�asakor egy osztott k�onyvt�ar bet�olt�ese egy �ujabb programk�odot,
valamint egy �ujabb inicializ�alt adatokat tartalmaz�o r�egi�o l�etrehoz�as�at jelenti az osztott
k�onyvt�arat alkalmaz�o folyamat virtu�alis c��mtartom�any�aban.
Megjegyezz�uk, hogy az itt bemutatott r�egi�o modell nagyon hasonl��t az AT&T UNIX
System V Release 3.0 oper�aci�os rendszer�eben alkalmazott megold�asra (ott nevezik a
mem�oria alot�oelemeit r�egi�oknak) { igaz n�eh�any helyen az egyszer}ubb t�argyal�as �erdek�eben
kis m�odos��t�asokat v�egeztem.
7.2.1 A r�egi�om}uveletek
Ebben a pontban r�oviden �osszefoglalom a r�egi�o objektumokon v�egezhet}o m}uveleteket:
� Egy �uj (�ures) r�egi�o lefoglal�asa.
� Egy r�egi�o objektum megsz�untet�ese.
� Egy r�egi�o tartalm�anak be�agyaz�asa egy folyamat virtu�alis c��mtartom�any�aba.
� Egy r�egi�o lecsatol�asa egy folyamat virtu�alis c��mtartom�any�ab�ol.
� Egy r�egi�or�ol m�asolat k�esz��t�ese.
� Egy r�egi�o m�eret�enek a m�odos��t�asa.
� A f�ajlrendszerb}ol egy program bet�olt�ese egy r�egi�oba.
7.2. A MEM�ORIAKEZEL }O IMPLEMENT �ACI �OJA 119
� Egy r�egi�o r�ogz��t�ese a �zikai mem�ori�aba I/O m}uveletek idej�ere, illetve a r�ogz��t�es
megsz�untet�ese (erre az�ert lehet sz�uks�eg, mert az intelligens diszk-kontrollerek a
r�ajuk b��zott feladatot (pl. egy diszk-blokk beolvas�asa) a "h�att�erben" is el tudj�ak
v�egezni, �es meg kell akad�alyozni azt, hogy egy olyan lapot kilapozzanak, amire egy
ilyen intelligens diszk-kontrollert}ol adatokat v�arunk (ui. a legt�obb diszk-kontroller
ezt nem tudja "k�ovetni", �es amikor beolvassa az adatokat, akkor m�ar nem oda kell
beolvasni, amit kor�abban megadtak).
7.2.2 A r�egi�o rendszer adatszerkezetei
A processz-t�abla (valamint a text strukt�ura) tartalmazza egy r�egi�olista c��m�et. Egy ilyen
r�egi�olista egy eleme egy-egy folyamat virtu�alis mem�ori�aj�at alkot�o mem�oriater�uleteket
(r�egi�okat) le��r�o r�egi�ole��r�o struktur�ara mutat. Egy adott r�egi�o le��r�o struktur�aj�ara t�obb
folyamat r�egi�olist�aj�ar�ol is mutathat egy-egy pointer { ha az adott r�egi�o t�obb folyamat
virtu�alis c��mtartom�any�anak is r�esze. A folyamatonk�ent nyilv�antartott r�egi�ole��r�o lista
tartalmazza azt is, hogy egy adott r�egi�o a folyamat c��mtartom�any�aban hol helyezkedik
el, ��gy egy adott r�egi�o nem kell, hogy az �osszes folyamat virtu�alis c��mtartom�any�aban
ugyanott helyezkedjen el.
Egy r�egi�ole��r�o objektum tartalmaz egy hivatkoz�ast a r�egi�o tartalm�at le��r�o
mem�orialapok sorozat�at le��r�o "lapt�abl�ara". Egy "lapt�abla" k�et fontos komponens-
adatszerkezete a k�ovetkez}o: a hardver mem�oriakezel}o egys�eg�enek a lapt�abl�aja (a
hardver mem�oriakezel}o egys�ege �altal el}o��rt form�aban), valamint tartalmazza azok-
nak a m�agneslemez-szektorok c��m�enek a sorozat�at, ahova az adott r�egi�o tartalm�at
ki lehet lapozni mem�oriasz}uke eset�en (ezzel a virtu�alis mem�oria m�eret�et a virtu�alis
mem�oriakezel�es sz�am�ara fenntartott lemezter�ulet m�eret�ere korl�atozza { de ez m�ar im-
plement�aci�os r�eszlet, amit m�ashogyan megoldva m�as korl�atoz�asokhoz juthatunk, illetve
kell}oen exibilis megold�ast tal�alva kiker�ulhetj�uk a korl�atoz�asokat).
Egy r�egi�o el van l�atva egy t��pus-azonos��t�oval, amely t��pus-azonos��t�o a r�egi�o haszn�alati
m�odj�ar�ol adhat tov�abbi inform�aci�okat. Egy r�egi�ot��pus-azonos��t�o egy konstans, melynek
az �ert�eke a k�ovetkez}o konstansok k�oz�ul ker�ulhet ki:
� SHARED TEXT : Programk�odot tartalmaz�o, nem m�odos��that�o tartalm�u, t�obb folya-
mat �altal is el�erhet}o r�egi�o.
� SHARED MEMORY : Adatokat tartalmaz�o, t�obb folyamat �altal is el�erhet}o r�egi�o.
� PRIVATE : Egy folyamat saj�at (m�as folyamatokkal nem megosztott) adatait tartal-
maz�o r�egi�o.
Egy �uj folyamat l�etrehoz�asakor a virtu�alis mem�ori�aj�at alkot�o r�egi�okat le��r�o lista le lesz
m�asolva. Ekkor a PRIVATE t��pus�u r�egi�oknak egy �uj p�eld�anya lesz l�etrehozva (�atm�asolva
az eredeti r�egi�o tartalm�at), a t�obb folyamat �altal megosztottan haszn�alt r�egi�okra �uj hi-
vatkoz�asok lesznek l�etrehozva. Egy folyamat megsz�untet�esekor azok a r�egi�ok meg lesznek
sz�untetve, amelyekre csak az az egy folyamat hivatkozik (vagyis a megsz�unteten}o folya-
mat hivatkozik r�a, �es csak egy folyamat hivatkozik r�a).
120 FEJEZET 7. A RENDSZERMAG SZERKEZETE
7.2.3 A lapoz�as implement�al�asa
A �zikai mem�ori�at a rendszermag implement�aci�ok �altal�aban h�arom f}o r�eszre bontj�ak: az
egyik r�esz a mag�at a rendszermagot a k�od illetve adatszegmenseivel egy�utt tartalmaz�o
r�esz; a m�asik r�esz a �zikai mem�oria lapkereteir}ol nyilv�antartott inform�aci�okat tartal-
mazza (ez a mem�oriat�erk�ep { eredeti angol nev�en core map); a harmadik r�eszt pedig
maguk a �zikai mem�ori�aban lev}o lapkeretek alkotj�ak. A rendszermag eddig elk�esz�ult
implement�aci�oinak k�oz�os jellemz}oje, hogy a rendszermagnak �es a core mapnak teljes
eg�esz�eben �alland�oan a �zikai mem�ori�aban kell lennie, azaz nem lapozhat�o ki.
A lapoz�as implement�aci�oj�anak a k�ozponti adatszerkezete az el}obb m�ar eml��tett core
map. A core map minden egyes �zikai mem�ori�aban lev}o lapkerettel kapcsolatban ny-
ilv�antartja, hogy az adott lapkereten lev}o lap a virtu�alis mem�ori�at tartalmaz�o diszken
hol helyezkedik el (akkor, ha nincs a mem�ori�aban), azaz hova kell majd kilapozni; a core
map t�arolja azt is, hogy az adott lapkereten lev}o lap melyik r�egi�onak a r�esze; azt is
t�arolja, hogy a lap a r'egi�on bel�ul h�anyadik lap. Ezenk��v�ul a core map az �eppen nem
haszn�alt (szabad) lapkereteket egy list�aba f}uzi, valamintminden egyes lapkerethez t�arolja
azt is, hogy az a lapkeret �eppen szabad-e, valamint azt, hogy az adott lapkeret tartalm�at
nem szabad kilapozni a h�att�ert�arra (mivel p�eld�aul egy I/O m}uvelet a h�att�erben dolgozik
rajta). Megjegyezz�uk, hogy a core map lapkeretenk�ent egy �x m�eret}u adatszerkezet: a
Berkeley UNIX-ban egy core map bejegyz�es m�erete 16 b�ajt { ennyi plusz inform�aci�ot kell
t�arolni a lapoz�as megszervez�es�ehez minden egyes 4096-b�ajtos lapkerethez (vagyis ezzel a
mem�ori�anak kevesebb, mint az egy sz�azal�eka "veszik el").
A lapoz�ast a rendszermag �es egy felhaszn�al�oi �uzemm�odban fut�o folyamat (a lapoz�o
daemon) egy�uttesen implement�alj�ak. A rendszermag t�arolja a szabad lapkeretek sz�am�at,
�es ha a szabad lapkeretek sz�ama egy k�usz�ob�ert�ek alatt van (pl. az �osszes lapkeretek
sz�am�anak a harminc sz�azal�ek�at nem �eri el), akkor a lapoz�o d�emon a core mapben t�arolt
inform�aci�ok alapj�an felszabad��t �ujabb lapkereteket. A lapcsere algoritmusk�ent az �ora (ez
l�enyeg�eben FIFO) algoritmushoz hasonl�o k�etmutat�os �ora algoritmust alkalmazz�ak. Az
�ora algoritmus onnan kapta a nev�et, hogy modellezhet�o egy �ora mutat�oj�aval, amely
"v�egighalad" a core map-bejegyz�eseken, �es az �osszes nem szabad, �es kilapoz�as ellen
nem v�edett lapot kilapozhat�onak nyilv�an��tja, ha pedig egy lapot az el}oz}o menetben
kilapozhat�onak nyilv�an��tott, �es az el}oz}o menet �ota nem volt r�a hivatkoz�as, akkor ki is
lapozza. A k�etmutat�os �ora algoritmusban az �or�anak k�et "mutat�oja" van: az egyik mu-
tat�o a m�asikat valamekkora (pl. a mem�oria 25 sz�azal�ek�anak megfelel}o) r�est kihagyva
k�oveti, �es az el}ol l�ev}o mutat�o �altal mutatott, nem szabad �es kilapoz�as ellen nem v�edett
lapot kilapozhat�onak nyilv�an��tja a rendszer, majd amikor az �ora m�asodik mutat�oja egy
kilapozhat�onak nyilv�an��tott, �es az�ota nem haszn�alt lakeretet tal�al, akkor a megfelel}o lap-
keret tartalm�at kilapozza a h�att�ert�arra. Vagyis az egy- illetve k�etmutat�oj�u �ora algoritmus
l�enyeg�eben ugyanaz, csak egy lap kilapozhat�ov�a nyilv�an��t�asa �es a kilapoz�asa k�oz�ott eltelt
id}o k�et mutat�os esetben kisebb�e tehet}o.
7.2.4 A programbet�olt�es
Amikor egy folyamat v�egrehajt egy exec() rendszerh��v�ast, akkor ellen}orzi azt, hogy a
megadott v�egrehajtand�o f�ajl val�oban v�egrehajtat�o-e (azaz a hozz�a tartoz�o rwx-bitek k�ozt
megvan-e a megfelel}o x bit, valamint a kernel ellen}orzi a v�egrehajthat�o f�ajlokra vonatkoz�o
n�eh�any formai k�ovetelm�eny teljes�ul�es�et). Ha v�egrehajthat�o, akkor bet�olti az egyes
7.3. AZ ESZK �OZMEGHAJT �OK IMPLEMENT �ACI �OJA 121
logikai r�eszeit a mem�ori�aba (l�etrehozva a sz�uks�eges r�egi�okat a mem�ori�aban - lapoz�asos
mem�oriekezel}ovel ell�atott oper�aci�os rendszerek eset�eben gyakori a fut�o programoknak
az "ig�eny szerinti" belapoz�asa, azaz a h�att�ert�arr�ol csak azok a lapok lesznek belapozva,
amelyekre r�aker�ul a vez�erl�es, �es csak akkor lesznek belapozva, amikor sz�uks�eg lesz r�ajuk),
�es ha minden probl�emamentesen siker�ut, akkor a folyamat kor�abbi c��mtartom�any�at el-
dobja (az azt le��r�o r�egi�ok k�oz�ul megsz�unteti azokat, amelyekre m�as folyamatok nem hi-
vatkoznak), �es az �ujonnan beolvasott r�egi�okat jel�oli ki a folyamat v�egrehajthat�o k�odj�at,
adatait illetve v�egrehajt�asi verm�et tartalmaz�o r�egi�ok�ent, �es elkezdi az �uj k�odszegmens
v�egrehajt�as�at az "elej�et}ol". Nyilv�an ha az �uj r�egi�ok bet�olt�ese sikertelen (p�eld�aul mert
elfogyott a mem�oria), akkor a bet�olt�ott �uj r�egi�okat el kell dobni, �es az exec() rendsz-
erh��v�as hibak�oddal kell, hogy visszat�erjen. Ez�ert az nem j�o megold�as, hogy a kor�abbi
k�od, adat illetve verem szegmenseket mindj�art a rendszerh��v�as megkezd�esekor kidobjuk,
mert lehet, hogy nem tudjuk az �uj r�egi�okat a diszkr}ol beolvasni.
A v�egrehajthat�o f�ajlokra vonatkoz�o egyetlen formai k�ovetelm�eny { az hagyom�anyos
�un. a.out2 f�ajlform�atum eset�en { az, hogy a f�ajl elej�en kell lennie egy fejl�ecnek, ami
t�erk�epk�ent tartalmazza az egyes szegmensek hely�et a v�egrehajthat�o programot tartal-
maz�o f�ajlon bel�ul. E fejl�ec szerkezete a k�ovetkez}o C nyelv}u strukt�ur�aval jellemezhet}o:
struct a_out_fejlec {
unsigned long a_magic;
unsigned long a_text;
unsigned long a_data;
unsigned long a_bss;
unsigned long a_syms;
unsigned long a_entry;
unsigned long a_trsize;
unsigned long a_drsize;
}
7.3 Az eszk�ozmeghajt�ok implement�aci�oja
A rendszermag a k�ul�onf�ele hardver perif�eri�akkal foglalkoz�o r�eszeket egy { a g�epf�ugg}os�ege
miatt { j�ol elk�ul�on��thet}o modulban tartalmazza: az eszk�ozmeghatjt�ok modulj�aban. A
legt�obb rendszermag implement�aci�o az eszk�oz�oket (illetve az eszk�oz�ok vez�erl�es�e�ert felel}os
rendszermagr�eszeket, az eszk�ozmeghajt�okat) k�et csoportba osztja: a karakteres el�er�es}u
�es a blokkonk�enti el�er�es}u eszk�oz�ok csoportj�ara.
Ha a rendszerhez egy �uj eszk�ozt akarunk illeszteni, akkor meg kell ��rni az eszk�oz
vez�erl�es�e�ert felel}os eszk�ozmeghajt�ot (ez n�eh�any j�ol de�ni�alt, az eszk�ozzel kapcsolatot
tart�o elj�ar�as meg��r�as�at jelenti), �es a meg��rt elj�ar�asokat egy, az eszk�ozmeghajt�o elj�ar�asokat
tartalmaz�o, glob�alis vektorba be kell tenni (a karakteres eszk�oz�ok eset�en e vektor neve
cdevsw, a blokkos el�er�es}u eszk�oz�ok eset�en pedig bdevsw). Egy eszk�oz major device
numberje az e vektorokon bel�uli index�evel egyenl}o.
2Van t�obb ismert v�egrehajthat�o-f�ajl form�atum (mint p�eld�aul az a.out, x.out, COFF, ELF), amelyeknek
hsonl�o a szerepe, de n�eh�any extra lehet}os�eg megl�et�eben k�ul�onb�oznek egym�ast�ol. Ebben a le��r�asban az �un.a.out f�ajlform�atumot, a legr�egebb �ota haszn�alt v�egrehajthat�o-f�ajl form�atumot fogjuk megismerni. Ez megfelela szok�asos rendszermag-implement�aci�ok ig�enyeinek, �es k�onny}u is meg�erteni.
122 FEJEZET 7. A RENDSZERMAG SZERKEZETE
A blokk-el�er�es}u eszk�oz�oket meghajt�o eszk�ozmeghajt�o a k�ovetkez}o elj�ar�asokat mint
bel�ep�esi pontokat tartalmazza:
� init() : A rendszer ind��t�asakor lesz v�egrehajtva, feladata az eszk�oz pontos
azonos��t�asa.
� open() : Ez az elj�ar�as az eszk�ozmeghajt�ohoz tartoz�o speci�alis f�ajlra vonatkoz�oan
kiadott open() rendszerh��v�as hat�as�ara lesz v�egrehajtva. �Altal�aban ellen}oriznie kell,
hogy a hozz�a tartoz�o hardver perif�eria a rendszer ind��t�asakor helyesen fel lett-e
ismerve, illetve m}uk�odik-e.
� close() : Ez az elj�ar�as akkor lesz v�egrehajtva, ha az eszk�ozt haszn�al�o �osszes folya-
mat az eszk�ozre vonatkoz�oan kor�abban megnyitott speci�alis f�ajlt lez�arta. Ilyenkor
az eszk�ozmeghajt�ot �es az eszk�ozt egy "alap�allapotba" kell hozni. P�eld�aul ezt
haszn�alj�ak m�agnesszalagok visszateker�es�ere, miut�an m�ar senki sem haszn�alja (igaz,
ritka a blokk el�er�es}u m�agnesszalagegys�eg).
� strategy() : Egy eszk�ozre val�o ��r�asi vagy az eszk�ozr}ol t�ort�en}o olvas�asi m}uvelet
kezdem�enyez�es�et lehet vele k�erni. Argumentumak�ent meg kell adni egy diszk-
blokk bu�er fejl�ec�enek a c��m�et (ld. r�eszletesebben a bu�er cache le��r�asakor), �es
a h��v�o folyamat a bu�er fejl�ec�enek a c��m�et mint esem�enyazonos��t�ot haszn�alhatja,
ha v�arakozni akar az I/O m}uvelet befejez}od�es�ere (amit az eszk�ozmeghajt�o t�obbi
r�esze (pl. interrupt-vez�erelten) megold).
� ioctl() : Eszk�ozf�ugg}o m}uveleteket lehet ebbe berakni. Az eszk�ozh�oz tartoz�o
speci�alis f�ajlra vonatkoz�oan kiadott ioctl() h��v�askor lesz v�egrehajtva. Egy
diszk eset�eben itt implement�alhat�ok p�eld�aul a diszk meta-inform�aci�oinak (m�eret,
part��ci�os t�abla) a lek�erdez�es�enek �es be�all��t�as�anak a m}uveletei.
A karakteres el�er�es}u eszk�oz�oket meghajt�o eszk�ozmeghajt�o a k�ovetkez}o elj�ar�asokat
mint bel�ep�esi pontokat tartalmazza:
� init() : A rendszer ind��t�asakor lesz v�egrehajtva, feladata az eszk�oz pontos
azonos��t�asa.
� open() : Ez az elj�ar�as az eszk�ozmeghajt�ohoz tartoz�o speci�alis f�ajlra vonatkoz�oan
kiadott open() rendszerh��v�as hat�as�ara lesz v�egrehajtva. �Altal�aban ellen}oriznie kell,
hogy a hozz�a tartoz�o hardver perif�eria a rendszer ind��t�asakor helyesen fel lett-e
ismerve, illetve m}uk�odik-e.
� close() : Ez az elj�ar�as akkor lesz v�egrehajtva, ha az eszk�ozt haszn�al�o �osszes folya-
mat az eszk�ozre vonatkoz�oan kor�abban megnyitott speci�alis f�ajlt lez�arta. Ilyenkor
az eszk�ozmeghajt�ot �es az eszk�ozt egy "alap�allapotba" kell hozni. P�eld�aul ezt
haszn�alj�ak m�agnesszalagok visszateker�es�ere, miut�an m�ar senki sem haszn�alja.
� read() : Karaktereket olvas be az adott eszk�ozr}ol.
� write() : Karaktereket ��r az adott eszk�ozre.
7.4. A BUFFER CACHE SZEREPE �ES IMPLEMENT �ACI �OJA 123
� ioctl() : Eszk�ozf�ugg}o m}uveleteket lehet ebbe berakni. Az eszk�ozh�oz tartoz�o
speci�alis f�ajlra vonatkoz�oan kiadott ioctl() h��v�askor lesz v�egrehajtva. Egy
m�agnesszalag eset�eben itt implement�alhat�ok p�eld�aul a szalagv�ege karakter fel��r�asa
a szalagra, valamint a szalag meta-inform�aci�oinak (m�eret, part��ci�os t�abla) a
lek�erdez�es�enek �es be�all��t�as�anak a m}uveletei.
� select() : Ellen}orzi, hogy van-e beolvasni val�o adat az eszk�ozr}ol; illetve ellen}orzi,
hogy van-e hely az eszk�oz�on, ahova �uj adatokat lehet fel��rni.
� stop() : Ezt megh��vva lehet sz�uneteltetni egy eszk�ozre a karakterek kiirat�as�ata
(p�eld�aul egy termin�alon a ctrl-S karakterek megnyom�asakor sz�unetelni fog a ki��r�as).
A rendszermag forr�ask�odj�anak a leford��t�asakor gyakran t�obb eszk�ozmeghajt�ot be-
ford��tanak, mint amennyire t�enylegesen sz�uks�eges lenne. A rendszermagba beford��tott
eszk�ozmeghajt�okat �ugy nevezik, hogy statikusan bekon�gur�alt eszk�ozmeghajt�ok. A rend-
szer beind��t�asakor az �osszes statikusan bekon�gur�alt eszk�ozmeghajt�o init() v�egre lesz
hajtva, �es ekkor ellen}orzi a kernel, hogy az eszk�oz hozz�a van-e kapcsolva a g�ephez,
lek�erdezi a harver param�etereit, stb. Ezt a folyamatot nevezik autokon�gur�aci�onak.
7.4 A bu�er cache szerepe �es implement�aci�oja
A blokk el�er�es}u eszk�oz�ok kezel�es�et v�egz}o eszk�ozmeghajt�ok �es a g�epf�uggetlen "maga-
sszint}u" rendszermag k�oz�ott helyezkedik el egy szoftverr�eteg, a bu�er cache. A bu�er
cache �un. bu�er objektumokat kezel: egy bu�er egy diszk-blokk (illetve m�as blokk
el�er�es}u eszk�oz�ok "blokkjainak") tartalm�at tartalmazza, �es a legfontosabb c�elja az, hogy
az adott blokkot haszn�al�o illetve m�odos��t�o �osszes folyamat ugyanazon a "p�eld�anyon" dol-
gozzanak (vagyis ha az egyik folyamat megv�altoztatja egy blokk bu�er tartalm�at, akkor
az �osszes t�obbi p�arhuzamosan fut�o �es ugyanazt a blokkot haszn�al�o folyamat azonnal a
m�odos��tott diszk-blokk tartalmat l�assa). Vagyis az �osszes folyamat egy adott diszk-blokk
tartalm�at a rendszerben csak �es kiz�ar�olag a rendszer mem�ori�aj�aban egyetlen p�eld�anyban
t�arolt blokk-bu�eren kereszt�ul �erheti el. E bu�erel�esnek egy k�ovetkezm�enye az is, hogy
a gyakran haszn�alt diszk-blokkok a mem�ori�aban lesznek t�arolva, ezzel meggyors��tva a
diszk-blokkhoz val�o hozz�af�er�est (�es mivel a mem�ori�aban t�arolt diszk-blokk tartalmat
hat�ekonys�agi okok miatt csak k�esleltetve ��rja fel a diszkre, ez�ert a rendszer �erz�ekenny�e
v�alik az �aramkimarad�asokra { ez �onmag�aban egy h�atr�any, de a bu�erel�es t�obb el}onye
miatt �altal�aban nem tekintik nagy probl�em�anak).
A bu�er cache kulcsfontoss�ag�u objektumai a bu�er fejl�ecek, �es a hozz�ajuk tartoz�o
adatter�uletek (ez ut�obbi adatter�uletekre p�elda egy-egy diszk-blokk tartalma). A bu�er
fejl�ecek egy-egy bu�errel kapcsolatban a k�ovetkez}o inform�aci�okat tartalmazz�ak:
� Annak az eszk�oznek az azonos��t�oj�at (major/minor device sorsz�am), amelyr}ol a
bu�erhez tartoz�o adatter�uleten t�arolt mem�oriater�ulet tartalm�at bet�olt�ott�uk.
� A bu�erben t�arolt adatter�ulet c��m�et (pl. szektor-sorsz�am�at) azon az eszk�oz�on bel�ul,
amelyr}ol a bu�er tartalm�at beolvastuk.
� Egy mutat�o egy adatter�uletre, ahol az eszk�ozr}ol beolvasott blokk/szektor tartalma
van, illetve t�arolva van, az adatter�ulet m�erete, �es az, hogy hogy az adott adat-
ter�uleten mennyi az "�ert�ekes" adat.
124 FEJEZET 7. A RENDSZERMAG SZERKEZETE
� A bu�er �allapot�at le��r�o jelz}oket (ld. k�es}obb).
A bu�er fejl�ecek t�obb k�ul�onb�oz}o list�aba is fel vannak f}uzve k�ul�onf�ele c�elokkal. A
k�ovetkez}okben felsorolom azt, hogy milyen list�ak vannak, amelyre a bu�er fejl�ecek fel
lehetnek f}uzve:
� Foglalt bu�erek : ezen a list�an azok a bu�erek vannak, amelyeknek a tartalm�anak
a �zikai mem�ori�aban kell lennie (ilyen p�eld�aul egy f�ajlrendszer szuperblokkja).
� Cache bu�erek : ezen a list�an azok a bu�erek vannak, amelyeknek a
tartalm�at �eppen senki sem haszn�alja (az�ert ker�ultek be, mivel tartalmukat
valaki kicsit kor�abban haszn�alta); ha nem lesz m�as szabad bu�er, akkor ezek
"�ujrafelhaszn�alhat�ok" lesznek helysz}uke eset�en.
� El�ev�ult bu�erek sora : ezen a list�an azok a bu�erek lesznek, amelyekre a
k�es}obbiekben nagy val�osz��n}us�eggel nem fognak hivatkozni. Ha sz�uks�eg lenne �uj
bu�erek beolvas�as�ara, �es nincs m�as szabad bu�er-fejl�ec, akkor innen el lehet venni
b�armelyik bu�ert.
��Ures bu�er fejl�ecek sora : csak bu�er fejl�ecek vannak, amelyek nem t�arolnak
adatot (nincsenek haszn�alva).
� Egy eszk�ozmeghajt�onak �atadott bu�erek sora : minden blokk el�er�es}u
eszk�oznek van egy sora, amelyen azok a bu�erek (illetve fejl�eceik) vannak, ame-
lyeken az adott eszk�ozmeghajt�onak valamit el kell v�egeznie (pl. a bu�er tartalm�at
vissza kell ��rnia a diszkre, ...).
A k�ovetkez}okben le��rom a bu�er cache rendszer interf�esz�et alkot�o elj�ar�asokat:
� Egy eszk�oz azonos��t�oj�at �es annak egy blokkj�anak a c��m�et megadva megh��vhatjuk
a getblk() vagy a bread() m}uveleteket, amely visszaad egy bu�er fejl�ecet az
adott eszk�oz adott blokkj�ahoz. A visszaadott bu�er a getblk() h��v�asa ut�an nem
felt�etlen�ul tartalmazza a megadott eszk�oz-blokk tartalm�at (csak akkor tartalmazza,
ha a B DONE jelz}o a bu�er �allapotjelz}oi k�oz�ott be van �all��tva). Ha a bread()
m}uveletet h��vjuk meg, akkor a megadott eszk�ozr}ol a megadott blokk tartalma
be lesz olvasva, �es a bu�erhez kapcsolt adatter�uletre lesz ��rva. Mindk�et elj�ar�as
megh��v�asa ut�an a bu�er "haszn�alat alatt l�ev}onek" lesz nyilv�an��tva: addig, am��g ez
a jelz}o ki nem lesz kapcsolva, m�as nem v�egezhet rajta semmit. Megjegyezz�uk, hogy
a getblk() m}uveletet olyankor szokt�ak megh��vni, ha a diszk-blokk illetve a bu�er
tartalm�at teljesen �at akarj�ak ��rni, ��gy nincs sz�uks�eg az el}oz}o tartalm�ara.
� A breada()m}uvelet hasonl��t a bread()-hez, de van m�eg egy argumentuma, amely-
ben megadhatjuk, hogy m�eg h�any blokknyit olvasson el}ore a megadott egys�egen (de
a tov�abbi blokkok aszinkron lesznek beolvasva, vagyis az elj�ar�ast v�egrehajt�o folya-
mat fut�asa csak az explicite megadott blokk beolvas�as�aig lesz felf�uggesztve).
� A brelse() m}uveletnek meg kell adni egy bu�er fejl�ec�enek a c��m�et, �es ezut�an a
bu�er r�aker�ul a szabad bu�ereket tartalmaz�o list�akra.
7.4. A BUFFER CACHE SZEREPE �ES IMPLEMENT �ACI �OJA 125
� A bwrite() m}uvelet a bu�ert annak az eszk�ozmeghajt�onak a bu�er-sor�ara rakja,
amelyr}ol a bu�er tartalm�at beolvastuk, �es a bu�ert visszairatja az eszk�ozre oda,
ahonnan beolvastuk. V�ar, am��g a bu�er nem lett vissza��rva. Ezt akkor szok�as
megh��vni, ha pontosan tudni akarjuk, hogy siker�ult-e a vissza��r�as, �es k��v�ancsiak
vagyunk a vissza��r�as esetleges sikertelens�eg�enek az ok�ara.
� A bawrite() m}uvelet a bwrite()-hoz hasonl�oan m}uk�odik, de nem v�ar a bu�er
vissza��r�as�aig. Ez biztos��tja a maxim�alis p�arhuzamoss�agot, mivel a vissza��r�as a
folyamat tov�abbi fut�as�aval p�arhuzamosan t�ort�enhet.
� A bdwrite()m}uvelet nem kezdem�enyez I/O m}uveletet a bu�er tartalm�anak a vis-
sza��r�as�ara, de a bu�ert r�arakja a szabad bu�erek list�aj�ara, �es "m�odos��tott"-nak
jelzi. Ez azt jelenti, hogy miel}ott valaki �ujrafelhaszn�aln�a (leszedn�e a szabad bu�er-
eket t�arol�o list�ar�ol), a bu�er tartalm�at vissza kell ��rni oda, ahonnan beolvastuk.
Ezt az elj�ar�ast akkor haszn�alj�ak, ha nem biztosak abban, hogy a bu�ert m�ar vissza
kell ��rni (mivel p�eld�aul az utols�o r�a vonatkoz�o write() rendszerh��v�as nem t�olt�otte
fel teljesen, ��gy v�arhat�o, hogy m�odos��tani fogj�ak).
M�ar eml��tettem, hogy minden bu�er fejl�ece tartalmaz egy jelz}ot, amely a bu�er
�allapot�at ��rja le. E jelz}o �ert�ek�et a k�ovetkez}o biteknek megfelel}o �allapotjellemz}ok logikai
"VAGY" kapcsolat�aval jellemezhetj�uk:
� B READ : ez azt jelzi, hogy a bu�ert az eszk�ozmeghajt�onak �atadtuk, hogy olvassa
be a tartalm�at a diszkr}ol.
� B WRITE : ez azt jelzi, hogy a bu�ert az eszk�ozmeghajt�onak �atadtuk, hogy ��rja ki a
tartalm�at a diszkre. Megjegyezz�uk, hogy a B WRITE konstans �ert�eke nulla, vagyis az
eszk�ozmeghajt�o ha nem tal�alja a B READ jelz}ot be�all��tva, akkor B WRITE-ot felt�etelez.
� B DONE : ez a jelz}o ki lesz kapcsolva miel}ott a bu�ert �atadjuk az eszk�ozmeghajt�onak
valamilyenm}uvelet elv�egz�es�ere, majdmiut�an az eszk�ozmeghajt�o elv�egezte a kijel�olt
m}uveletet, be�all��tja ezt a bitet.
� B ERROR : a B DONE jelz}ovel k�oz�osen jelezhetik, hogy a bu�eren k�ert I/O m}uveletet
az eszk�ozmeghajt�o befejezte, de a m}uveletet nem lehetett sikeresen v�egrehajtani.
� B BUSY : azt jelzi, hogy a bu�ert valaki haszn�alja. Am��g ez a jelz}o be van �all��tva,
addig m�as nem haszn�alhatja a bu�ert. Ha getblk() vagy bread() m}uvelettel
akarunk beolvasni egy haszn�alatban lev}o bu�ert, akkor ezek addig v�arnak, am��g
ezt a jelz}obitet ki nem kapcsolja a bu�er aktu�alis haszn�al�oja (a sleep()/wakeup()
mechanizmussal v�ar), majd be�all��tja ezt a bitet, �es visszaadja a bu�ert a k�er}onek.
� B ASYNC : ez a jelz}o akkor lesz be�all��tva, ha a bu�ert a bawrite() m}uvelettel ��rt�ak
vissza. Ha ez a jelz}o be van �all��tva, akkor a bu�erre vonatkoz�o I/O m}uvelet befe-
jez�ese ut�an a bu�erre vonatkoz�oan automatikusan v�egre kell hajtani a brelse()
m}uveletet.
� B DELWRIT : ez a jelz}o akkor lesz be�all��va, ha a bu�ert a bdwrite()m}uvelettel ��rt�ak
vissza. Ha a getblk() egy adott bu�er keres�esekor a bu�ert megtal�alta, �es ez a bit
be van �all��tva, akkor a bu�er tartalm�at �atadja az eszk�ozmeghajt�onak vissza��r�asra
miel}ott visszat�erne a h��v�ohoz.
126 FEJEZET 7. A RENDSZERMAG SZERKEZETE
7.5 A f�ajlrendszer implement�aci�oja
A UNIX-szer}u oper�aci�os rendszerek rendszermagjai (��gy a BSD, a System V �es a Linux is)
a f�ajlrendszereket csak blokk-el�er�es}u eszk�oz�ok�on, a bu�er cache-nek a f�ajlrendszerkezel}o
�es az eszk�ozmeghajt�o k�oz�e helyezve tudj�ak l�etrehozni �es kezelni { p�eld�aul egy oppyn,
winchesteren, CD-ROM egys�egen : : : . A tov�abbiakban a f�ajlrendszert tartalmaz�o eszk�ozt
diszknek nevezz�uk, de ez alatt b�armilyen blokk-el�er�es}u eszk�ozt is �erthet�unk. Ebben a
pontban el}osz�or �attekintj�uk a f�ajlrendszer implement�aci�oj�aval kapcsolatos diszken t�arolt
adatszerkezeteket, majd �attekintj�uk az ezeket m�odos��t�o mechanizmusokat.
A f�ajlrendszer szerkezete �es implement�aci�oja sokf�ele lehet; az eredeti UNIX Version 7
f�ajlrendszer m�eg viszonylag sok korl�atoz�ast tartalmaz (p�eld�aul max. 14 karakter hossz�u
f�ajlnevek, nincsenek szimbolikus linkek). L�enyeg�eben ugyanezt a f�ajlrendszert tartal-
mazza a UNIX System V Release 3, �es egy ugyanilyen szemantik�aj�u f�ajlrendszert im-
plement�altak a MINIX oper�aci�os rendszerben, amit �atvettek a Linux oper�aci�os rend-
szerben is, �es mint a Linux els}o (�es egyben legprimit��vebb) f�ajlrendszer�et nagyon sok�aig
haszn�alt�ak (kezdetben nem lehetett Linuxot futtatni MINIX oper�aci�os rendszer licensz
n�elk�ul, mivel a Linuxnak akkoriban nem volt f�ajlrendszer-l�etrehoz�o seg�edprogramja).�Erdemes megjegyezni, hogy a MINIX f�ajlrendszere a diszken t�arolt form�atum�aban
l�enyegesen k�ul�onb�oz�ott a UNIX Version 7 f�ajlrendszer�et}ol (m��g a szabad blokkok il-
letve i-node-ok a Version 7 UNIX-ben lista adatszerkezetben voltak nyilv�antartva,
addig a MINIX bitt�erk�epeket vezetett be ezeknek az inform�aci�oknak a t�arol�as�ara,
ami l�enyegesen gyorsabbnak bizonyult a kor�abbi megold�asokn�al). A 4.2BSD illetve
4.3BSD oper�aci�os rendszerek f�ajlrendszer�enek fel�ep��t�ese l�enyeges �uj��t�asokat tartalmazott,
legink�abb a jobb hat�ekonys�ag el�er�ese, valamint a kor�abbi f�ajlrendszer implement�aci�ok
zavar�o korl�atoz�asainak a kik�usz�ob�ol�ese �erdek�eben. Ez ut�obbi kateg�ori�aba es}o v�altoz�asok
k�oz�ul tal�an a szimbolikus linkek megjelen�ese, valamint a maximum 255 karakter hossz�u
f�ajlnevekmegjelen�ese a legfontosabb. A jobb hat�ekonys�agot pedig t�obbek k�ozt a diszk��r�o-
olvas�o fej�enek a mozg�as�anak a minimaliz�al�as�aval, valamint a diszk hardver adotts�againak
(pl. interleaving) a kihaszn�al�as�aval �ert�ek el. A 4.2BSD ill. 4.3BSD �uj, �un FFS (Fast File
System { magyarul: gyors (el�er�es}u) f�ajlrendszer) f�ajlrendszer�enek alapj�an tervezt�ek meg
a Linux oper�aci�os rendszer ext2 f�ajlrendszer�et a hasonl�o hat�ekonys�ag �es szolg�altat�asok
biztos��t�asa �erdek�eben.
A modern rendszermag implement�aci�ok t�obbf�ele f�ajlrendszert��pust is tudnak egysz-
erre kezelni { �altal�aban egy �un. virtu�alis f�ajlrendszer r�etegnek a f�ajlrendszer kezel}o
�es a bu�er cache k�oz�e t�ort�en}o beilleszt�es�evel: amikor egy f�ajlt haszn�alni/m�odos��tani
akarnak, akkor a virtu�alis f�ajlrendszer r�eteg megvizsg�alja, hogy az adott f�ajl milyen
fel�ep��t�es}u f�ajlrendszeren van (ekkor egy f�ajl szerkezet�et le��r�o adatstruktur�aban (amit
majd k�es}obb m�eg l�atni fogunk) a f�ajlt tartalmaz�o f�ajlrendszer t��pus�at is t�arolni kell),
�es a megfelel}o f�ajlrendszer f�ajlkezel}o m}uvelet�et implement�al�o elj�ar�ast h��vja meg a feladat
elv�eg�es�ere. A tov�abbiakban egy igen elterjedt f�ajlrendszert fogunk megismerni: a 4.2BSD
FFS f�ajlrendszer�et { ez tal�an a legbonyolultabb �es a leghat�ekonyabb az eddig elk�esz�ult
f�ajlrendszer implement�aci�ok k�oz�ul, de szerkezet�ukben �es funkci�ojukban az �osszes t�obbi
eddig elk�esz�ult f�ajlrendszer hasonl��t r�a, ��gy a t�obbi f�ajlrendszerr}ol is egy �atfog�o �es pontos
k�epet alkothatunk a FFS megismer�ese ut�an.
7.5. A F �AJLRENDSZER IMPLEMENT �ACI �OJA 127
7.5.1 A diszken t�arolt adatszerkezetek
Egy f�ajlrendszer egy m�agneslemezegys�egen vagy annak egy partici�oj�an helyezkedhet el
{ e k�et eset k�oz�ott a k�ul�onbs�eg csak annyi, hogy a teljes diszk kezel�es szempontj�ab�ol
tekinthet}o egy olyan part��ci�onak, amely a teljes diszket lefedi, m��g egy part��ci�o tekinthet}o
egy olyan "kisebb diszknek", amelyen a szektorok sz�amoz�asa nem null�an�al kezd}odik, �es
a m�erete is kisebb, mint a teljes diszk m�erete. A tov�abbiakban nem tesz�unk k�ul�onbs�eget
e k�et eset k�oz�ott az el}obbi meggondol�asok miatt, �es a f�ajlrendszert tartalmaz�o diszket
vagy diszk-part��ci�ot ezut�an logikai diszknek fogom nevezni.
A logikai diszk els}o szektora az �un. boot-szektor, ami tartalmazza az �un. els}odleges
oper�aci�os rendszer bet�olt}o programot. Az els}odleges oper�aci�os rendszer bet�olt}o program-
nak a m�erete nagyon kicsi, ez�ert �altal�aban csak annyit tud tenni, hogy bet�olti az ut�ana
lev}o szektorokr�ol (el}ore le�x�alt elhelyezked�es}u) m�asodlagos oper�aci�os rendszer bet�olt}o
programot. A m�asodlagos oper�aci�os rendszer bet�olt}o program pedig m�ar ismeri a logikai
diszken t�arolt f�ajlrendszer form�atum�at, �es onnan t�olti be a gyakran t�obb megabytem�eret}u
oper�aci�os rendszert (amelynek a f�ajlrendszerben egy j�ol meghat�arozott helyen kell lennie
(a System V rendszerekn�el gyakran a /unix a neve, a BSD rendszerekn�el pedig /vmunix a
neve; a Linux rendszerben pedig a leggyakoribb a /vmlinux vagy /vmlinuz f�ajln�ev), de ez
a "j�ol meghat�arozott" hely k�ovetelm�eny m�ar csak egy f�ajlnevet r�ogz��t, ahol az oper�aci�os
rendszer magja megtal�alhat�o, nem pedig �x diszk-szektor sorsz�amokat felt�etelez).
A logikai diszknek az els}odleges illetve m�asodlagos oper�aci�os rendszer bet�olt}o pro-
gramj�at tartalmaz�o szektorokat k�ovet}o r�esze �un. cilinder-csoportokra van felosztva
(a Linux oper�aci�os rendszer ext2 f�ajlrendszer�en�el hasonl�o a helyzet, de ott ezeket az
egys�egeket blokk-csoportoknak nevezik): a �zikai diszk egym�ast k�ovet}o valah�any �un.
cilindere (koncentrikus k�or alak�u hengerei) alkot egy cilinder-csoportot, �es ezt az ab-
sztrakci�ot olyan meggondol�asb�ol hozt�ak l�etre, �es �ugy alak��tott�ak ki, hogy egy cilinder-
csoporton bel�ul a �zikai lemez olvas�ofej�enek minim�alismozg�ast kelljen v�egeznie. A gyako-
rlatban egy cilinder-csoport m�erete 8 megab�ajt k�or�ul van (de enn�el lehet t�obb is vagy ak�ar
kevesebb is). Minden cilinder-csoport szerkezete hasonl�o: van benne egy szuperblokk,
egy cilindercsoport-blokk, egy i-node t�abla valamint adatokat (f�ajlokat �es directorykat)
tartalmaz�o szektorok.
A szuperblokk tartalmazza a f�ajlrendszer m�eret�ere �es szerkezet�ere vonatkoz�o in-
form�aci�okat:
� A f�ajlrendszer m�erete blokkokban
� Egy blokk m�erete b�ajtokban
� A blokkn�al kisebb ter�uletfoglal�asi egys�eg m�eret�et (fragment3-m�eretet)
� A f�ajlrendszerben maxim�alisan allok�alhat�o i-node-ok sz�ama, valamint a m�eg szabad
i-node-ok sz�ama (ezekr}ol az objektumokr�ol kor�abban m�ar ��rtam, de m�eg sz�o lesz
r�oluk r�eszletesebben).
3Mivel a f�ajlrendszer blokk-m�erete gyakran 4 vagy 8K, �es a f�ajlok nagy r�esze ezekn�el j�oval kisebb (egyesjelent�ese szerint egy "tipikus" rendszerben az �atlagos felhaszn�al�oi f�ahl m�erete kb. 1.5K), ez�ert ha egy 1.5Km�eret}u f�ajlnak lefoglalunk egy 8K m�eret}u blokkot, akkor a blokk kihaszn�alatlan r�esze (ebben a p�eld�aban
ez 6.5K) elveszne, ez�ert a FFS f�ajlrendszer tervez}oi bevezett�ek a blokkn�al kisebb allok�aci�os egys�eget, az �un.fragmentet. Megjegyezz�uk, hogy egy f�ajlnak csak az utols�o blokkja helyett lehet t�ored�ekblokkokat, fragmenteketallok�alni.
128 FEJEZET 7. A RENDSZERMAG SZERKEZETE
� Am�eg nem foglalt (szabad) f�ajlrendszerblokkok list�aj�anak els}o n�eh�any elem�et (az �uj
BSD FFS f�ajlrendszerben ez �atker�ult a cilindercsoportonk�ent kezelt cilindercsoport-
blokkba, amit hamarosan r�eszletesebben megismer�unk).
� Az i-node-ok sz�am�at egy cilinder-csoporton bel�ul.
L�athattuk, hogy minden cilinder-csoport tartalmaz az elej�en egy szuperblokkot: mivel
a szuperblokk olyan fontoss�ag�u, hogy n�elk�ule az eg�esz f�ajlrendszerrel semmit sem lehetne
kezdeni (ui. nem lehetne pontosan tudni olyan adatokat, mint p�eld�aul a cilinder-
csoportok m�erete), ez�ert az �osszes cilinder-csoport a szuperblokk egy-egy m�asolat�at tar-
talmazza, �es az �osszes szuperblokk-p�eld�anyban ugyanazok az adatok tal�alhat�oak meg
(vagyis ha az egyik szuperblokk megs�er�ulne, akkor egy m�asik szuperblokkot haszn�alva a
f�ajlrendszer tartalma m�eg megmenthet}o).
Egy cilinder-csoportban a szuperblokkot a cilindercsoport-blokk k�oveti, amelynek
a feladata a cilinder-csoportra lok�alis jellemz}ok le��r�asa. Ez a k�ovetkez}o l�enyeges in-
form�aci�okat tartalmazza:
� A cilinder-csoporton bel�ul az adatblokkok sz�ama.
� A cilinder-csoporton bel�ul az i-node-ok sz�ama.
� A cilinder-csoportban a szabad blokkok sz�ama �es elhelyezked�ese.
� A cilinder-csoportban a szabad fragmentek sz�ama �es elhelyezked�ese.
� A cilinder-csoportban a szabad inode-ok sz�ama �es elhelyezked�ese.
Minden cilinder-csoport tartalmazza a cilinder-csoportot le��r�o blokk ut�an a cilinder-
csoport i-node t�abl�aj�at. M�ar eml��tettem, hogy az i-node a f�ajlrendszer objektumainak
(f�ajlok, directoryk) az attributumait, a f�ajlrendszerbeli elhelyezked�es�et �es egy�eb jellemz}oit
tartalmaz�o objektum. Egy i-node teh�at a k�ovetkez}o f�ajl-attributumokat �es egy�eb
jellemz}oket t�arol egy f�ajlr�ol:
� A f�ajlra mutat�o linkek sz�ama (a szimbolikus linkek n�elk�ul!).
� A f�ajl rwx-bitjei.
� A f�ajl t��pusa (regul�aris f�ajl, directory, blokk-speci�alis, karakter-speci�alis, szimbo-
likus link, vagy m�as)
� A tulajdonos felhaszn�al�oi �es csoportazonos��t�oja.
� A f�ajl hossza.
� A f�ajl utols�o m�odos��t�as�anak a d�atuma.
� A f�ajl utols�o el�er�es�enek a d�atuma.
� A f�ajl i-node-j�anak az utols�o m�odos��t�as�anak a d�atuma.
� A f�ajl elhelyezked�es�et le��r�o "t�erk�ep" (ennek a t�erk�epnek a szerkezet�er}ol m�ar ��rtam
a 2.4. pontban).
7.5. A F �AJLRENDSZER IMPLEMENT �ACI �OJA 129
A cilinder-csoport i-node t�abla ut�ani blokkjai a f�ajlrendszerben t�arolt f�ajlok blokkjait,
valamint a f�ajlok elhelyezked�es�enek a felt�erk�epez�es�et le��r�o indirekt blokkok (ld. 2.4.
pontban) tartalm�at tartalmazza.
Kor�abban m�ar azt is l�athattuk, hogy a directoryk (k�onyvt�arak) is f�ajlok, de a f�ajl-
t��pusukk�ent nem a regul�aris f�ajl van nyilv�antartva, hanem a directory f�ajl, �es azt is l�attuk,
hogy a tartalma is r�ogz��tett form�atum�u. A kor�abban m�ar bemutatott (System V ill.
MINIX) directory form�atuma csak a legfeljebb 14-karakteres f�ajlnevek haszn�alat�at tette
lehet}ov�e, �es egy directory-bejegyz�es (a directoryben lev}o egy-egy f�ajlr�ol nyilv�antartott
adat) 16 b�ajt, �x hossz�us�ag�u volt. A 4.3BSD FFS f�ajlrendszer�eben egy f�ajl neve maximum
255 karakter hossz�u lehet, �es a directoryk szerkezete �ugy m�odosult, hogy egy directorybe-
jegyz�es (ami egy f�ajlnevet tartalmaz, �es egy directory pedig ilyen directory-bejegyz�esek
sorozat�ab�ol �all) v�altoz�o hossz�us�ag�u lehet, �es a directoryn bel�ul kialak��tottak egy teljes
szabad-lista kezel�est, amely list�ara az egyes directory-bejegyz�esek egym�as ut�an fel van-
nak f}uzve, �es ha egy �uj f�ajlt hozunk l�etre egy directoryban, akkor a rendszermag el}osz�or
megn�ezi, hogy valamelyik directory-bejegyz�esben van-e annyi hely, hogy azt k�et beje-
gyz�ess�e osztva elf�er-e az �uj f�ajl neve �es i-node-sorsz�ama a sz�uks�eges lista-adminisztr�aci�os
adatokkal vagy sem. Ha van el�eg hely, akkor az �uj f�ajl felvitele ��gy megoldhat�o; ha nincs
el�eg hely, akkor a directoryt tartalmaz�o speci�alis f�ajl r�esz�ere �ujabb blokk lesz lefoglalva,
�es ott egy �uj listaelemk�ent �ujabb directory-bejegyz�es lesz allok�alva.
Kor�abban m�ar l�attuk a linkek t�arol�asm�odj�at �es nyilv�antart�as�at a directory-
bejegyz�esekben. A BSD FFS f�ajlrendszerben bevezetett szimbolikus linkek t�arol�asa att�ol
l�enyegesen elt�er: a szimbolikus linkek egy speci�alis szimbolikus link t��pus�u f�ajlban vannak
t�arolva; a f�ajl tartalma ilyenkor maga a szimbolikus link �altal mutatott f�ajlrendszerbeli
objektumnak a neve (vagyis ott nem i-node sorsz�am van t�arolva). Ezzel lehet}ov�e v�alt
az, hogy egy szimbolikus link egy m�asik f�ajlrendszerben (pl. m�asik diszken t�arolt) f�ajlra
is mutathasson, nincsenek olyan korl�atoz�asok, mint a kor�abban bemutatott (�un. hard
link t��pus�u) linkekn�el, hogy csak egy f�ajlrendszeren bel�ul lehet linkeket l�etrehozni, de
f�ajlrendszerek k�oz�ott "�atmutat�o" linkeket nem lehet l�etrehozni. Term�eszetesen ennek
megvan az a h�atr�anya, hogy el}ofordulhatnak olyan szimbolikus linkek, amelyek a "sem-
mibe" mutatnak, mert p�eld�aul let�or�olt�ek azt a f�ajlt, ahov�a a szimbolikus link mutat.
A szimbolikus linkek konzisztenci�aj�anak az elfogadhat�o id}on bel�uli ellen}orz�es�enek nincs
kialakult m�odszere, nem is foglalkoznak vele.
A diszk-blokkok illetve az i-node t�abla elemeit alkot�o i-node-ok foglalts�ag�at �altal�aban
egy bitt�erk�eppel kezelik: az adatter�ulet elej�en lefoglalnak annyi blokkot, amely legal�abb
annyi bitet tartalmaz, ah�any diszk-blokk (illetve i-node) van az adott cilider-csoporton
bel�ul. Ezen az adatter�uleten minden egyes objektumr�ol (diszk-blokknak vagy i-nodenak)
t�arolva van az, hogy szabad-e vagy pedig �ert�ekes inform�aci�ot tartalmaz (azaz foglalt).
Egy 0-�as bit jelzi azt, ha szabad; egy 1-es bit jelzi a foglalts�agot. A UNIX System
V Release 3.2 v�altozat�aban illetve kor�abban m�eg nem vett�ek �at a BSD UNIX FFS
f�ajlrendszer�et �es a szabad blokkokat egy list�aban t�arolt�ak, ami lassabb megold�asnak bi-
zonyult (a Linux ext2 f�ajlrendszer�enek az el}odje, az ext f�ajlrendszerben is ezt a szabadlista
kezel�esi m�odszert v�alasztott�ak (annak ellen�ere, hogy a MINIX f�ajlrendszerben, amib}ol
kiindultak, nem ezt haszn�alt�ak), de miut�an l�att�ak a hat�ekonys�ag roml�as�at, visszat�ertek
a bitt�erk�epes m�odszerre).
130 FEJEZET 7. A RENDSZERMAG SZERKEZETE
7.5.2 Az adatszerkezeteken oper�al�o m}uveletek
Az el}oz}o pontban �attekintett�uk a f�ajlrendszer szerkezet�et a diszken. Ott l�athattuk a
fontosabb adatszerkezeteket, amiknek a kezel�ese �es konzisztenci�aj�anak biztos��t�asa a rend-
szermag f�ajlrendszer-kezel}oj�enek a feladata. Ebben a pontban �attekintj�uk azt, hogy
a rendszermag hogyan kezeli a f�ajlrendszereket, illetve milyen seg�edm}uveletek meg-
val�os��t�as�at tartalmazza.
A szuperblokk kezel�es�et �altal�aban a bu�er cache szintj�en, a bu�er cache elj�ar�asaival
v�egzik: a f�ajlrendszereket a f�ajl-hierarchi�aba illeszt}o mount() rendszerh��v�askor lesz a
szuperblokk beolvasva, �es eg�eszen a megfelel}o umount() rendszerh��v�asig bennmarad
a mem�ori�aba. A szuperblokkokat a beillesztett f�ajlrendszerekre vonatkoz�o egy�eb in-
form�aci�okkal egy�utt (p�eld�aul azzal az inform�aci�oval egy�utt, hogy melyik directoryn�al
van beillesztve a f�ajlrendszer tartalma) egy �un. mount t�abl�aban t�arolj�ak.
A haszn�alt (azaz valamelyik rendszermag-komponens �altal hivatkozott) i-node-ok
t�arol�as�ara is van egy t�abla, az �un. i-node t�abla. Az i-node t�abla egyr�eszt t�arolja a logikai
diszken lev}o f�ajlrendszerr}ol behozott i-node tartalm�at (statikus jellemz}oket), valamint az
i-node dinamikus jellemz}oit: azokat a jellemz}oket, amiket csak egy "haszn�alatban lev}o"
i-node eset�en kell nyilv�antartani. Az i-node dinamikus jellemz}oit a k�ovetkez}o adatok
alkotj�ak:
� Melyik eszk�ozr}ol lett beolvasva.
� Mi az adott i-node sorsz�ama az eszk�oz�on t�arolt i-node-ok k�oz�ott.
� Az i-node-ra van-e egy m�asik f�ajlrendszer illesztve (ld. mount t�abla).
� Ha az i-node-ra egy m�asik f�ajlrendszer r�a van illesztve, akkor t�arolni kell annak a
f�ajlrendszernek a mount-t�abla beli azonos��t�oj�at (�altal�aban az i-node sorsz�am�at).
� H�any megnyitott f�ajl hivatkozik erre az i-node-ra.
Nyilv�anval�o, hogy kell egy m}uvelet egy i-node-nak az i-node t�abl�aba t�olt�es�ere, �es egy
m�odos��tott i-node tartalm�anak a logikai diszken lev}o f�ajlrendszerre vissza��r�as�ara. Ezeket
�altal�aban �ugy oldj�ak meg, hogy a megadott logikai diszkr}ol beolvass�ak azt a blokkot,
amely az i-node-ot tartalmazza, m�odos��tj�ak a bu�erben a tartalm�at, majd a bu�ert
szinkron m�odon vissza��rj�ak a diszkre (vagyis v�arnak, am��g vissza nem lesz ��rva). Am��g
a bu�er tartalm�at manipul�alj�ak, addig a bu�er haszn�alat�ara kiz�ar�olagos jogot form�al �es
kap a rendszer megfelel}o r�esze.
Fontos l�atni, hogy ha egy i-node m�ar benn van az i-node t�abl�aban, akkor nem szabad
m�egegyszer bet�olteni, hanem a r�a vonatkoz�o hivatkoz�asok sz�am�at kell eggyel n�ovelni, �es
az i-node t�ablabeli el}oz}o p�eld�any�at kell m�asoknak is haszn�alni (ui. a POSIX �es m�as sz-
abv�anyok a f�ajlrendszer szemantik�aj�at �ugy de�ni�alj�ak, hogy ha egy folyamat valamilyen
v�altoztat�ast v�egez egy f�ajlon (ezzel a f�ajlt le��r�o i-node-on), akkor a v�altoztat�as ut�an min-
denki ugyanazt a m�odos��tott f�ajlt l�atja, �es ez a k�ovetelm�eny ��gy { az i-node �ujraolvas�asa
n�elk�ul { k�onnyen biztos��that�o; persze erre l�eteznek m�as (bonyolultabb) megold�asok, de
tudtommal senki sem haszn�alta }oket).
Sz�uks�eg van egy �uj (addig szabad) i-node-ot allok�al�o m}uveletre, illetve egy i-node
deallok�al�o m}uveletre. Ezeknek a m}uveleteknek az eredm�enyek�eppen nemcsak az i-node
t�abl�aban t�ort�enik v�altoz�as, hanem a logikai diszken (az azt tartalmaz�o adathordoz�on)
7.5. A F �AJLRENDSZER IMPLEMENT �ACI �OJA 131
is; a megfelel}o cilinder-csoport blokkokat aktualiz�alni kell (ez nyilv�an a megfelel}o blokk
beolvas�as�aval illetve vissza��r�as�aval j�ar, de a jelenlegi implement�aci�ok ezeknek nem szoktak
egy k�ul�on t�abl�at l�etrehozni �es kezelni). A MINIX f�ajlrendszerben mivel a bitt�erk�epek a
szuperblokkal egy�utt voltak t�arolva, ez�ert az i-node allok�al�o �es deallok�al�o m}uveletek a
szuperblokk objektum m}uveletei voltak.
A cilinder-csoport i-node t�abla ut�ani r�esz�et, az adatblokkok ter�ulet�enek a kezel�es�et
v�egz}o elj�ar�asokat is meg kell ��rni: kell egy adatblokk-lefoglal�o �es egy adatblokk fel-
szabad��t�o elj�ar�as. Ezeknek az elj�ar�asoknak a megfelel}o cilinder-csoport blokkot (az
adatblokk-foglalts�agi t�abl�aval) m�odos��taniuk kell az elv�egzett m}uvelet alapj�an.
7.5.3 Allok�aci�os strat�egi�ak
Az el}obbiekben �attekintett�uk az FFS f�ajlrendszer f}obb adatszerkezeteit. Ezen ismeretek
birtok�aban m�ar mindent meg tudunk csin�alni egy f�ajlrendszerrel, de ahhoz, hogy ezeket
a MINIX (vagy System V Release 3.2) rendszermagj�anak f�ajlrendszer�ehez k�epest el�egg�e
elbonyol��tott adatszerkezeteket optim�alisan ki lehessen haszn�alni, kialak��tottak egy-egy
blokk- illetve i-node-lefoglal�asi strat�egi�akat. Ezeket ismertetem ebben a pontban.
Az optimaliz�al�asok �altal�aban a diszk olvas�ofej�enek a mozg�as-p�aly�aj�at pr�ob�alj�ak meg
minim�aliss�a tenni bizonyos tipikus m}uvelet-sorozatok alkalm�aval.
P�eld�aul egy adott directory tartalm�at list�az�o ls parancs a directoryban lev}o �osszes
f�ajlt �es directoryt (azok i-nodej�at) el�er annak �erdek�eben, hogy azokr�ol inform�aci�okat
gy}ujts�on be (pl. egy f�ajl hossz�at ki tudja ��rni, ...). Ez�ert az egy directoryban lev}o
f�ajlok i-nodejaik a sz�ul}odirectoryval egy�utt ugyanabban a cilinder-csoportban vannak.
Mivel nem lehet az �osszes f�ajl �es directory ugyanabban a cilinder-csoportban, az is egy
konvenci�o, hogy a directoryk i-nodejaikat az sz�ul}o directory i-nodej�at tartalmaz�o cilinder-
csoportba nem rakj�ak, hanem az mindig egy m�asik cilinder-csoportba ker�ul (a megfelel}o
cilinder-csoportot �ugy v�alasztj�ak ki, hogy megn�ezik, hogy melyik cilinder-csoportban
van a legt�obb szabad (nem haszn�alt) i-node, �es ebben a cilinder-csoportban hoznak l�etre
egy �uj directoryt). Term�eszetesen ha valamelyik cilinder-csoportban nincs szabad (nem
haszn�alt) i-node, akkor egy m�asik cilinder-csoportot kell v�alasztani.
Az adatblokkok elhelyez�es�ere is vannak szab�alyok, m�eghozz�a itt ink�abb arra
t�orekednek, hogy egy f�ajl adatblokkjai abbad a cilinder-csoportban helyezkedjenek el,
amelyben a f�ajl i-node-ja van. Mivel nagy f�ajlok eset�en egy f�ajl �osszes adatblokkja nem
ker�ulhet ugyanabba a cilinder-csoportba, ez�ert az is egy szab�aly, hogy egy f�ajl minden
egyes �x nagys�ag�u r�esz�et (pl. megab�ajtj�at) megpr�ob�alj�ak m�as-m�as cilinder-csoportokba
elhelyezni, de ha nem siker�ul, akkor persze feladj�ak az optimaliz�aci�os t�orekv�eseket, �es
keresnek megfelel}o nagys�ag�u szabad helyet, �es ott helyezik el az adatokat.
7.5.4 F�ajln�evr}ol - i-nodera transzform�aci�o
A f�ajlkezel}o rendszer egyik gyakori feladata a f�ajl abszolut vagy relativ el�er�esi neve alapj�an
a f�ajlhoz tartoz�o i-node megkeres�ese. Ennek az algoritmusnak teh�at az inputja egy f�ajln�ev
(abszolut vagy relativ), outputja pedig egy i-node hivatkoz�as illetve egy logikai �ert�ek, ami
azt jelzi, hogy sikeres volt-e a transzform�aci�o.
A transzform�aci�o els}o l�ep�esek�ent meg lesz hat�arozva egy kezd}o directory: abszolut
f�ajlnevek eset�en (ha a f�ajl el�er�esi nev�enek els}o karaktere egy "/" jel) a gy�ok�er-directory;
132 FEJEZET 7. A RENDSZERMAG SZERKEZETE
relativ f�ajlnevek eset�en (vagyis ha a f�ajl el�er�esi nev�enek az els}o karaktere nem egy "/"
jel) pedig a folyamat munkadirectoryja.
A rendszermag ellen}orzi, hogy ez val�oban egy directory-e, �es val�oban van-e r�a keres�esi
enged�ely�unk. Ha nem directory vagy nincs jogunk benne keres�esre, akkor egy hibak�oddal
visszat�er.
Ezut�an le lesz v�alasztva a f�ajl el�er�esi nev�enek a k�ovetkez}o komponense (a k�ovetkez}o
"/" karakterig tart), �es a rendszermag megkeresi az ilyen nev}u bejegyz�est a kezd}o directo-
ryban, �es hibak�oddal t�er vissza, ha nem tal�alja; ha pedig megtal�alja, akkor a directoryban
a hozz�a tartoz�o i-node sorsz�ama alapj�an be lesz t�oltve az i-node, �es ezt az �uj i-node-ot
mint kezd}o directoryt felhaszn�alva ugyanezt ism�etli, am��g sikeres a transzform�aci�o ("elf-
ogyott a f�ajl el�er�esi neve") vagy sikertelen a transzform�aci�o. A sikertelens�eget t�obb
t�enyez}o is okozhatja: vagy nincs olyan directory, amire a f�ajl el�er�esi nev�eben hivatkoztak
(az is lehet, hogy van olyan nev}u directory bejegyz�es, de az nem directoryra, hanem
egy f�ajl t��pus�u i-node-ra mutat), vagy nincs a directoryra keres�esi jog. Term�eszetesen
az is hiba, ha az inputk�ent megadott f�ajl el�er�esi n�evben m�eg vannak komponensek, de
a directory-hierarchi�aban m�ar nem tudunk "lejjebb" menni (mert a tov�abbhalad�ashoz
sz�uks�eges komponens hi�anyzik).
Ha menet k�ozben olyan i-node-hoz �ert�unk, amelyre egy m�asik f�ajlrendszer van
beillesztve, akkor a beillesztett f�ajlrendszer mount t�abl�aban lev}o szuperblokkja alapj�an
be lesz t�oltve a beillesztett f�ajlrendszer gy�ok�er-directoryja, �es a keres�es ott folytat�odik.
Visszafel�e ugyanez megvan: ha a ".." (sz�ul}o directory) bejegyz�esre egy gy�ok�er-directory
eset�eben hivatkoznak, akkor megkeresik azt, hogy az a bizonyos hivatkozott gy�ok�er di-
rectory melyik i-node-ra van r�aillesztve, �es enn�el az i-node-n�al folytat�odik a f�ajln�evr}ol
i-node-ra transzform�aci�o.
A hard linkek kezel�ese semmi probl�em�at nem okoz az algoritmusunknak; a szimbolikus
linkek feldolgoz�asa pedig csak annyi neh�ezs�eget okoz, hogy vigy�azni kell, nehogy v�egtelen
ciklusba keveredjen a transzform�aci�os algoritmus valamilyen v�eletlen�ul vagy sz�and�ekosan
rosszul l�etrehozott szimbolikus link miatt. Ezt �ugy oldj�ak meg, hogy korl�atozz�ak az
egy f�ajln�ev i-node-ra transzform�al�asa sor�an maxim�alisan el}ofordulhat�o szimbolikus linkek
sz�am�at.
7.5.5 A rendszerh��v�as interf�esz
A f�ajlrendszerkezel}o k�od egy j�ol szepar�alhat�o r�esz�et alkotj�ak a rendszerh��v�asokat feldol-
goz�o elj�ar�asok. Ezek az elj�ar�asok lesznek megh��vva olyankor, amikor egy alkalmaz�as egy
rendszerh��v�ast hajt v�egre, �es ezek h��vj�ak meg az alacsonyszint}u i-node �es m�asm}uveleteket
a rendszerh��v�as feladat�anak elv�egz�es�ehez.
Azok a rendszerh��v�asok, amelyek f�ajlokat megnyitnak illetve l�etrehoznak (�altal�aban
ezek az open() illetve a creat() rendszerh��v�asok), �altal�aban egy f�ajlnevet v�arnak az ar-
gumentumaikban, �es egy { kor�abban m�ar eml��tett { f�ajldeszkriptorral t�ernek vissza. Azok
a rendszerh��v�asok, amelyek egy m�ar megnyitott f�ajlon v�egeznek valamilyen m}uveletet,
a megnyitott f�ajl f�ajldeszkriptor�at v�arj�ak �altal�aban els}o argumentumukk�ent. L�attuk
m�ar, hogy ezek a f�ajldeszkriptorok eg�esz (C nyelven int) t��pus�uak, �es ha p�eld�aul ki-
irattuk az �ert�ek�uket, akkor l�athattuk, hogy �altal�aban 0-t�ol kezd}od}oen lesznek sz�amozva,
�es van egy maxim�alis �ert�ek�uk is (legfeljebb ennyi f�ajlt hozhat l�etre egy folyamat). M�ar
eml��tettem, hogy a folyamat user struktur�aja tartalmazza azt a t�abl�azatot, amely a
f�ajldeszkriptorokhoz a glob�alis f�ajl t�abla egy elem�et rendeli. Ebben a glob�alis t�abl�aban az
7.6. A KOMMUNIK �ACI �OS ALRENDSZER IMPLEMENT �ACI �OJA 133
�osszes megnyitott f�ajlr�ol nyilv�antartanak bizonyos inform�aci�okat (p�eld�aul azt, hogy h�any
folyamat h�any f�ajldeszkriptora hivatkozik arra a t�ablaelemre), de itt van nyilv�antartva az
is, hogy mi az aktu�alis f�ajl-poz��ci�o a f�ajlon bel�ul (�es ha v�egrehajtunk egy read(), write()
vagy egy lseek() rendszerh��v�ast, akkor ez az ebben a t�abl�aban t�arolt f�ajl-poz��ci�o alapj�an
tudja, hogy hol tartunk a f�ajl feldolgoz�as�aban illetve ezt a t�abl�azatot megfelel}oen aktu-
aliz�alni is fogja). Megjegyezz�uk, hogy ha k�etszer egym�as ut�an open() rendszerh��v�assal
megnyitunk egy f�ajlt, akkor a glob�alis f�ajl t�abl�aban k�et t�ablaelem fog l�etrej�onni; ha vis-
zont dup() rendszerh��v�assal egy f�ajlhoz l�etrehozunk egy �uj f�ajldeszkriptort, akkor az ere-
deti f�ajldeszkriptorhoz tartoz�o glob�alis f�ajlt�abla-elemhez fog l�etrej�onni egy �uj hivatkoz�as
az �uj f�ajldeszkriptoron kereszt�ul.
Megjegyezz�uk, hogy a socket rendszerben egy f�ajldeszkriptorhoz nem csak egy glob�alis
f�ajlt�ablabeli elem tartozhat, hanem egy { hasonl�o c�el�u { glob�alis socket-t�ablabeli elem
is; ezzel ebben a kiad�asban nem foglalkozunk.
7.6 A kommunik�aci�os alrendszer implement�aci�oja
Ebben a fejezetben a rendszermag k�et alapvet}o folyamatok k�oz�otti kommunik�aci�os
eszk�oz�et, a signal()-okat, valamint a pipe-okat fogjuk �attekinteni.
Egy signal gener�al�asakor4 a proc struktur�aba bejegyz�esre ker�ul az, hogy milyen
signalt k�uldtek a folyamatnak. Ha egy folyamat ak�ozben kap signalt, mik�ozben egy
rendszerh��v�ast hajt v�egre, akkor a signal-kezel}o csak azut�an lesz v�egrehajtva, miut�an a
rendszermagbeli fut�as befejez}odik (miel}ott a folyamat v�egrehajtan�a a visszat�er�est a fel-
haszn�al�oi programba, ellen}orzi, hogy k�uldtek-e neki egy signalt); egy�eb esetben a signal-
kezel}o azonnal v�egrehajthat�o.
A pipe() rendszerh��v�as egy cs}ovonalat hoz l�etre, a hozz�a tartoz�o f�ajldeszkriptor-
t�ablabeli bejegyz�esekkel egy�utt. A pipe objektumok �altal�aban olyan f�ajlokk�ent van-
nak implement�alva, amely f�ajlra vonatkoz�oan nincs hivatkoz�as a f�ajlrendszerben egy
directory-bejegyz�esb}ol sem. Term�eszetesen tartozik hozz�a egy i-node (amit �altal�aban
a gy�ok�er-directoryt is tartalmaz�o gy�ok�er-f�ajlrendszerben allok�alnak), amelynek a m�erete
gyakran korl�atozva van (tipikus m�eretkorl�atoz�as az, hogy a pipe-ok tartalm�at k�epez}o
adatok t�arol�as�ara csak direkt blokkokat haszn�alnak, nem haszn�alnak egyszeres, k�etszere
illetve h�aromszoros indirekt blokkokat). A pipe-ba ��rt adatokat a l�etrehozott i-node-hoz
tartoz�o adatter�uleten teh�at el lehet t�arolni; vagyis amikor adatokat ��runk egy pipe-ba,
akkor a rendszermag ellen}orzi, hogy a fel��rand�o adatok bef�ernek-e a pipe-ba, �es ha igen,
akkor be��rja (ezzel a pipe m�eret�et megfelel}oen m�odos��tja); ha pedig nincs el�eg hely, akkor
vagy be��r valmennyi adatot a pipe-ba �es a write() rendszerh��v�as visszaadja, hogy men-
nyit ��rtak a pipe-ba, vagy pedig visszat�er azzal, hogy blokkolna a pipe-ba ��r�as. A glob�alis
f�ajlt�abl�aban k�et elem van allok�alva: az egyik az ��r�asi oldalhoz, a m�asik pedig az olvas�asi
oldalhoz. Amennyiben az �i r�o folyamatok tele��rj�ak a pipe-ot, akkor az �ujabb ��r�oknak
v�arniuk kell, am��g az olvas�ok nem olvass�ak ki a pipe-ban lev}o �osszes adatot, majd a pipe
olvas�asa illetve ��r�asa �ujrakezd}odhet { �ugy, hogy mind az ��r�asi, mind pedig az olvas�asi
f�ajlpoz��ci�o null�ara lesz �all��tva.
4Egy signalt vagy a kill() rendszerh��v�assal egy m�asik folyamat, vagy a rendszermag, vagy pedig a fel-haszn�al�o a ctrl-C billenty}uk lenyom�as�aval gener�alhat.
134 FEJEZET 7. A RENDSZERMAG SZERKEZETE
7.7 K�erd�esek
� Vajon mi�ert nem lehet hard linkkel f�ajlrendszerek k�oz�otti linket l�etrehozni?
� Vajon a pipe-okhoz tartoz�o i-node-okat mi�ert a gy�ok�er-k�onyvt�arat is tartalmaz�o
gy�ok�er-f�ajlrendszerben szok�as l�etrehozni?
Fejezet 8
A UNIX SYSTEM V STREAMS programoz�asa
Ebben a r�eszben a kommunik�aci�os modulok implement�al�as�anak az AT&T �altal
kialak��tott eszk�oz�et: a STREAMS-et mutatjuk be. Megjegyz�es: az ebben a fe-
jezetben le��rt inform�aci�ok �erdekesek, viszont egyr�eszt a t�obbi fejezethez
kapcsol�as, m�asr�eszt a le��r�as r�eszletess�ege (esetleg m�eg a pontoss�aga is)
k��v�annival�okat hagy maga ut�an. Ezt eredetileg egy k�ul�on le��r�ask�ent
k�esz��tettem (az el}oz}o fejezetek elk�esz��t�ese el}ott kb. 2 �evvel), most csak a
teljess�eg kedv�e�ert raktam bele ebbe a le��r�asba.
8.1 Bevezet�es
A STREAMS rendszert Dennis Ritchie k�esz��tette az ATT Bell Laborat�orium�aban azzal a
c�ellal, hogy egy modul�aris I/O rendszer ki�ep��t�es�ere haszn�alhat�o eszk�ozzel b}ov��tse a UNIX
rendszert. A STREAMS els}o kommersz v�altozata a UNIX System V Release 3 oper�aci�os
rendszerrel lett a fejleszt}ok �es a felhaszn�al�ok rendelkez�es�ere bocs�atva. Ma a STREAMS
rendszert haszn�alj�ak sok helyen a UNIX termin�alok vez�erl�es�ere, h�al�ozati protokollok
implement�al�as�ara �es ez az alapja sz�amos m�as felhaszn�al�oi software rendszernek. Itt
eml��tj�uk meg, hogy a STREAMS seg��ts�eg�evel tudt�ak implement�alni az ATT UNIX Sys-
tem V Release 4.0 rendszerben a 4.3BSD UNIX rendszerben haszn�alt socketeket (a fenti
k�et oper�aci�os rendszerben a sockets rendszer teljesen kompatibilis egym�assal, ��gy a
Berkeley UNIX sockets rendszerh��v�asait haszn�al�o programokat k�onnyebben �atvihetj�uk az
ATT UNIX rendszerekre). A STREAMS mechanizmust csak az ATT UNIX tartalmazza,
a 4.3BSD UNIX-ban ez nincs implement�alva. Ott is van lehet}os�eg hasonl�o strukt�ur�ak
fel�ep��t�es�ere, de ott ez kiss�e neh�ezkesebben megy.
8.1.1 Alapfogalmak
A STREAMS egy UNIX kernelbe be�ep��tett mechanizmus, mely lehet}ov�e tesz egy
k�etir�any�u kapcsolat ki�ep��t�es�et a felhaszn�al�oi programok �es a karakteres, adatkommu-
nik�aci�os STREAMS device driverek k�oz�ott. Eredetileg a UNIX termin�alok vez�erl�es�ere
alak��tott�ak ki, de k�es}obb alkalmazhat�onak bizonyult h�al�ozati protokollok imple-
ment�al�as�ara is. (A Release 4 UNIX m�ar STREAMS termin�al-drivereket haszn�al.) A
STREAMS device driverek adatokat k�ozvet��thetnek a felhaszn�al�oi programok �es a hard-
ware berendez�esek k�oz�ott, de vannak speci�alis driverek is, p�eld�aul a multiplexer driverek,
amelyek legt�obbsz�or nem �allnak a hardware perif�eri�akkal k�ozvetlen kapcsolatban.
135
136 FEJEZET 8. A UNIX SYSTEM V STREAMS PROGRAMOZ�ASA
Az adat�araml�as a driver �es a felhaszn�al�oi program k�oz�ott egyszerre k�et ir�anyban foly-
hat: lefel�e a felhaszn�al�ot�ol a driverig (ezt nevezik write oldalnak) �es felfel�e a drivert}ol
a felhaszn�al�o ir�any�aba (ezt nevezik read oldalnak is). Mindk�et ir�any�u adat�aramot
(streamet) egym�as m�og�e rakott sorok (queuek) seg��ts�eg�evel implement�alj�ak. Egy stream
a STREAMS device drivert}ol indul �es a stream-fejben v�egz}odik. A stream-fej tartja a
kapcsolatot a felhaszn�al�o �es a stream als�obb r�eszei k�oz�ott. Minden egyes STREAMS
driverre vonatkoz�o open rendszerh��v�as egy �uj stream-fejet hoz l�etre (amennyiben a driver
ezt t�amogatja).
A driver �es a felhaszn�al�oi program k�oz�e beilleszthet�unk �un. STREAMS modulokat, amik
se nem driverek, se nem stream-fejek (vagyis egy STREAMS modult nem szok�as p�eld�aul
open rendszerh��v�assal megnyitni). Feladatuk a rajtuk kereszt�ulmen}o adatok valami-
lyen m�odos��t�asa - p�eld�aul protokollinform�aci�okkal kieg�esz��thetik azokat, vagy az egyes
modulok a nekik sz�ol�o inform�aci�okat kivehetik a sorb�ol. Ha a STREAMS drivert meg-
nyitjuk, akkor l�etrej�on a stream-fej. A modulokat ezut�an csak k�ozvetlen�ul a stream-fej
al�a rakhatjuk az ioctl rendszerh��v�assal (a megfelel}o param�eterek be�all��t�as�aval).
A STREAMS driverek teljesen a kernel ter�ulet�en helyezkednek el, ez�ert ezek ��r�asakor
k�ul�on�osen kell vigy�azni, nehogy valami hib�at csin�aljunk!
8.1.2 A STREAMS el}onyei
A STREAMS seg��ts�eg�evel meg��rt programok el}onyei: egyszer}ubb szerkezet}uek (a fe-
ladat szintenk�enti megold�as�at is t�amogatja), k�onnyen alkalmazkodnak b�armilyen kon-
�gur�aci�ohoz, �es hordozhat�oak. Felhaszn�alhat�o a hagyom�anyos UNIX karakteres device
driverek helyett, �es a folyamatok k�oz�otti kommunik�aci�o megold�as�ara is.
Egy streamet dinamikusan kon�gur�alhatunk a fut�asid}oben, ezzel szemben egy
hagyom�anyos UNIX device driver a fut�asid}oben m�ar kev�esb�e (vagy egy�altal�an nem)
megv�altoztathat�o. (Lehet}os�eg van arra, hogy egy hagyom�anyos UNIX karakteres device
drivert p�eld�aul ioctl h��v�asokkal m�odos��tsunk, de ez sokkal �attekinthetetlenebb lenne,
mint az azonos feladat STREAMS megold�asa.)
Az egyes modulok kicser�elhet}oek, ��gy ugyanazt a softwaret alkalmazhatjuk t�obbf�ele kon-
�gur�aci�oban is. A STREAMS j�o eszk�oz�oket ny�ujt p�eld�aul a h�al�ozati softwareek hard-
waref�ugg}o �es hardwaref�uggetlen r�esz�enek elk�ul�on��t�es�ehez - a fels}obb szinteket m�ar teljesen
hardwaref�uggetlen�ul k�odolhatjuk, haszn�alhatjuk.
8.1.3 A STREAMS rendszer vez�erl�ese
A STREAMS rendszert a r�a vonatkoz�o ioctl h��v�asokkal vez�erelhetj�uk. Ennek pro-
tot��pusa a k�ovetkez}o :
int ioctl(int fd,int command,arg);
Itt fd egy nyitott STREAMS driverre vonatkoz�o �ledeszkriptor. A command
param�eter tartalmazza a v�egrehajtand�o m}uvelet k�odj�at, �es ett}ol f�ugg az arg param�eter
�ert�eke. A rendszerh��v�as sor�an fell�epett hib�akat (ha az �uzenetet nem tudta �atadni a
stream-fej m�og�ott lev}o modulnak) a szok�asos m�odon jelzi. (L�asd err}ol r�eszletesebben a
STREAMIO le��r�ast az egyes hiba�uzenetekr}ol!) Az ioctl h��v�as ut�an az errno v�altoz�o
�ert�eke EINVAL lesz, �es a h��v�as nem hajt�odik v�egre, ha az fd �altal speci�k�alt stream m�ar
hozz�a van kapcsolva egy multiplexer driverhez (ld. k�es}obb), vagy a command param�eter
8.1. BEVEZET�ES 137
tartalma nem egy j�o STREAMS parancs-�ert�ek.
A k�ovetkez}okben a leggyakrabban haszn�alt STREAMS ioctl parancsok lesznek is-
mertetve :
� I_PUSH : Bef}uz egy modult k�ozvetlen�ul az fd �altal megadott stream stream-feje
al�a. Az arg param�eter a bef}uzend}o modul nev�ere mutat�o karakter-pointer. Ezut�an
megh��v�odik a bef}uz�ott modul open (megnyit�o) rutinja. Hiba eset�en az errno
v�altoz�o lehets�eges �ert�ekei :
{ EINVAL : A megadott moduln�ev nem ismert a kernelen bel�ul.
{ EFAULT : Az arg a program c��mtartom�any�an k��v�ulre mutat.
{ ENXIO : Open rutin hib�at jelez, vagy hangup-ot kapott az fd-vel megadott
stream.
� I_POP : Leszedi a megadott stream tetej�en lev}o modult. A h��v�asban arg �ert�eke 0
kell legyen. Hiba eset�en az errno v�altoz�o lehets�eges �ert�ekei :
{ EINVAL : Nincs m�ar modul ennek a streamnek a stream-feje alatt.
{ ENXIO : Hangup-ot kapott az fd-vel megadott stream.
� I_STR : Egy STREAMS M_IOCTL (ha sz�uks�eges, akkor ut�ana m�eg egy M_DATA)
�uzenetet gener�al az alapj�an, amire az arg param�eter mutat, �es elk�uldi a lefel�e
men}o streamen. A felhaszn�al�o ��gy k�uldhet ioctl h��v�asokat a moduloknak �es a
drivereknek. A rendszer v�ar addig, am��g az �uzenetet feldolgoz�o modul visszajelz�est
ad arr�ol, hogy sikeres volt-e az ioctl h��v�as. Ha egy megadott id}on (default=15 sec.)
bel�ul nem �erkezik visszajelz�es, akkor az ioctl h��v�as timeout hib�aval megszakad.
Az arg param�eter egy strioctl struktur�ara mutat. Ez tartalmazza a k�ovetkez}o
mez}oket :
int ic_cmd; /* Milyen ugyben kuldjuk ezt ? */
int ic_timout; /* Mennyi ido mulva lesz timeout ? */
int ic_len; /* A lekuldendo adatterulet hossza */
char *ic_dp; /* Pointer az elkuldendo adatteruletre */
Az egyes mez}ok jelent�ese a k�ovetkez}o :
{ ic_cmd : A driver (vagy modul) ez alapj�an tudja meg, hogy mit kell csin�alnia.
{ ic_timout : Megadja, hogy maximum mennyi ideig kell v�arakozni a modul
(vagy driver) v�alasz�ara, vagyis mennyi id}o m�ulva k�ovetkezzen be a timeout.
Ennek �ert�ekei a k�ovetkez}ok lehetnek :
� -1 : v�egtelen sok�aig kell v�arni.
� 0 : a rendszerben defaultnak sz�am��t�o ideig kell v�arni.
� >0 : a param�eterben megadott ideig kell v�arakozni a v�alaszra.
{ ic_len : Az ioctl h��v�as el}ott megadja, hogy milyen hossz�u a streamen
lek�uldend}o ioctl-hez kapcsol�od�o adat hossza. Az ioctl h��v�as ut�an a driver
(ill. modul) �altal felk�uld�ott v�alasz hossz�at tartalmazza (byteokban m�erve).
138 FEJEZET 8. A UNIX SYSTEM V STREAMS PROGRAMOZ�ASA
{ ic_dp : Arra az adatter�uletre mutat, ahol a streamen lek�uldend}o inform�aci�o
van. A h��v�as befejez}od�esekor ide fogja a rendszer be��rni az �uzenetet feldol-
goz�o modul �altal visszak�uld�ott v�alaszt, ��gy e ter�ulet nagys�aga legal�abb akkora
legyen, mint a visszak�uldhet}o leghosszabb v�alasz nagys�aga.
Ha az ioctl h��v�as sikertelen (ioctl visszat�er�ese �ert�eke : -1), akkor a hiba ok�at az
errno v�altoz�o tartalmazza. Ennek lehets�eges �ert�ekei a k�ovetkez}ok :
{ ENOSR : A stream-fej nem tud lefoglalni mem�oriater�uletet az ioctl �uzenetnek,
mert nincs el�eg mem�oria.
{ EFAULT : Valamelyik pointer (arg vagy ic_dp) �altal meghat�arozott
mem�oriater�ulet a process mem�oriatartom�any�an k��v�ul esik.
{ EINVAL : Vagy az ic_len �altal megadott hossz nem esik az adott rendszeren
megengedett tartom�anyba, vagy a ic_timout �ert�eke -1-n�el kisebb.
{ ENXIO : Hangup-ot kapott az fd-vel megadott stream.
{ ETIME : A stream-fej a ic_timout param�eterben megadott id}on bel�ul nem
kapott v�alaszt, a h��v�as timeout miatt befejez}odik.
8.1.4 A STREAMS �uzenett��pusai
�Uzeneteknek nevezz�uk a modulok l�anc�an fel-le men}o inform�aci�okat, hiba�uzeneteket, stb.
Egy �uzenet (message) egy vagy t�obb �uzenetblokkb�ol �all. A STREAMS rendszerben egy
�uzenetblokk �es az adatblokkok fel�ep��t�es�et a k�ovetkez}o struktur�ak tartalmazz�ak :
struct msgb {
struct msgb *b_next; /* queue-n kovetkezo message */
struct msgb *b_prev; /* elozo message a queuen */
struct msgb *b_cont; /* tovabbi messageblokkok */
unsigned char *b_rptr; /* elso hasznos adatbyte*/
unsigned char *b_wptr; /* utolso hasznos byte utani adatbyte */
struct datab *b_datap; /* Adatblokkra pointer */
};
typedef struct msgb mblk_t;
struct datab {
struct datab *db_freep; /* Belso hasznalatra */
unsigned char *db_base; /* A buffer elso bytejara mutat */
unsigned char *db_lim; /* A buffer utolso utani byteja */
unsigned char db_ref; /* Hany uzenet mutat erre az adatra */
unsigned char db_type; /* Uzenettipus */
unsigned char db_class; /* Belso hasznalatra */
};
typedef struct datab dblk_t;
Megjegyz�es: az egyes �uzenetek nem biztos, hogy a teljes adatblokkot lefoglalj�ak. Azt, hogy egy �uzenet
�ert�ekes r�esze az adatblokkon bel�ul hol kezd}odik az �uzenetblokknak a b_rptr mez}oj�eb}ol tudhat�o meg. Az
�uzenetblokk b_wptr mez}oje pedig az adatblokk utols�o �ert�ekes byteja ut�ani bytera mutat.
8.1. BEVEZET�ES 139
A STREAMS megengedi az �uzenetek oszt�alyoz�as�at. A k�ul�onf�ele �uzenett��pusokat fel-
haszn�alva vil�agosabb szerkezet}u programokat��rhatunk. Ekkor a STREAMS szolg�altat�ast
v�egz}o rutin leggyakrabban csak egy �uzenett��pusok szerinti el�agaz�ast tartalmaz, �es egy-egy
�ag egy-egy �uzenett��pus feldolgoz�as�a�ert felel}os. A STREAMS nagyon sokf�ele �uzenett��pust
ismer. Egy mblk_t *bp; m�odon deklar�alt �uzenet t��pus�at a bp->b_datap->db_type kife-
jez�es adja meg.
� M_CTL : A STREAMS modulok egym�as k�ozti illetve driver �es modulok k�ozti
protokollinform�aci�ok tartoznak ebbe az �uzenett��pusba. A felhaszn�al�oi programok
nem k�uldhetnek lefel�e ilyen t��pus�u �uzeneteket, mivel ezeket a stream-fej kisz}uri.
� M_DATA : Adatokat tartalmaz�o �uzenetek. A felhaszn�al�o ezeket a putmsg �es
write rendszerh��v�asokkal ��rhatja bele egy streambe, �es a getmsg �es read rend-
szerh��v�asokkal olvashatja ki a streamb}ol.
� M_DELAY : Ezzel az �uzenettel k�erheti valamelyik STREAMS modul a drivert}ol az
output k�esleltetett kiad�as�at (p�eld�aul az�ert, mert nagyon lass�u az output perif�eria).
Az �uzenet form�atuma nincs pontosabban meghat�arozva, a programoz�o d�ontheti el,
hogy hogyan akarja felhaszn�alni. A felhaszn�al�oi programok nem k�uldhetnek lefel�e
ilyen �uzeneteket, mivel ezeket a stream-fej kisz}uri.
� M_IOCTL : A stream-fej a felhaszn�al�o ioctl h��v�asait ilyen �uzenet form�aj�aban
tov�abb��tja az alatta l�ev}o modulokhoz. Az ioctl-ben ekkor az I_STR parancsot kell
megadni. Az a modul, aki egy ilyen �uzenetet feldolgozott, k�oteles ezt a stream-fej
ir�any�aba nyugt�azni, mert a stream-fej addig nem tov�abb��t �uzeneteket, am��g nem
biztos benne, hogy az ioctl h��v�as hib�atlanul lement.
� M_PROTO : Protokoll-inform�aci�okat a hozz�a tartoz�o adatokkal egy�utt tartalmaz�o
�uzenetek. A felhaszn�al�o ezeket putmsg rendszerh��v�assal ��rhatja a streambe, �es
getmsg rendszerh��v�assal olvashatja ki a streamb}ol. Ezek az �uzenetek nem kezelhet}ok
read/write h��v�assal!.
� M_PCPROTO : Szint�en protokoll-inform�aci�okat tartalmaz, de magas a priorit�asa.
A felhaszn�al�o ezeket putmsg rendszerh��v�assal ��rhatja a streambe, �es getmsg
rendszerh��v�assal olvashatja ki a streamb}ol. Ezek az �uzenetek nem kezelhet}ok
read/write h��v�assal!. A norm�al (alacsony priorit�as�u) protokolladatokt�ol ezeket a
l�etrehoz�asukkor egy aggel k�ul�onb�oztethetj�uk meg a putmsg h��v�asban. A h��v�as
szintaxisa:
putmsg(fd,ctlptr,dataptr,flags)
int fd;
struct strbuf *ctlptr;
struct strbuf *dataptr;
int flags;
Ha a flags param�eter RS_HIPRI-re van �all��tva, akkor az �uzenet magas priorit�as�u
�uzenet lesz. (Egy�ebk�ent a flags param�eter �ert�eke : 0.) L�asd err}ol r�eszletesebben
a UNIX Programmer's Reference Manualt.
140 FEJEZET 8. A UNIX SYSTEM V STREAMS PROGRAMOZ�ASA
� M_IOCACK �es M_IOCNAK : Ezek az �uzenetfajt�ak az ioctl h��v�asok nyugt�az�as�ara val�ok.
Az M_IOCNAK �uzenet egy hibak�odot visz mag�aval a stream-fej ir�any�aba (csak hi-
bak�odot lehet ��gy a stream-fej ir�any�aba k�uldeni, v�alaszadatokat nem). A M_IOCACK
v�alaszadatokat is k�uldhet felfel�e (ez a pozit��v visszajelz�es).
� M_ERROR : Ezt az �uzenetet a modulok vagy a driverek k�uldhetik felfel�e a stream-
fej ir�any�aba, ha a lefele halad�o queuen valami hiba van. Ha ez az �uzenet el�eri a
stream-fejet, akkor az ezut�an kiadott rendszerh��v�asok a close �es a poll kiv�etel�evel
hib�aval fejez}odnek be, �es a rendszer az �uzenet els}o bytej�aban megadott hibak�odot
adja vissza az errno v�altoz�oban hibak�odk�ent. A poll rendszerh��v�as a POLLERR
hib�aval t�er vissza. V�eg�ul egy M_FLUSH �uzenet lesz a lefel�e men}o streamen elk�uldve.
� M_SIG �es M_PCSIG : Signalokat lehet a stream-fejen kereszt�ul bizonyos (p�eld�aul
signalokra v�arakoz�o) folyamatoknak k�uldeni. Az M_PCSIG a magas priorit�as�u.
� M_FLUSH : Egy streamen l�ev}o modulok mindegyik�et arra utas��tja, hogy a queue-
jaikat �ur��ts�ek ki. Minden modulnak �es drivernek kezelnie kell ezt az �uzenetet.
(Erre megold�ast jelent p�eld�aul a kernel flushq() rutinj�anak a megh��v�asa.) Ez egy
magas priorit�as�u �uzenet.
8.1.5 Egy STREAMS-et haszn�al�o program
A k�ovetkez}o program az el}obbieknek a haszn�alat�at mutatja be - ink�abb a programoz�o
szemsz�og�eb}ol. A program el}osz�or megnyitja a /dev/bcndm0 STREAMS drivert, r�ahelyezi
a birk nev}u STREAMS modult, majd ezen I/O m}uveleteket v�egez. (A modul ill. driver
implement�aci�oja k�es}obb lesz ismertetve.) Ez azt jelenti, hogy a megnyitott �leba ��rt
illetve az onnan beolvasott adatok (�uzenetek) kereszt�ulmennek a birk nev}u modulon is,
ami a feladat�anak megfelel}o dolgokat elv�egezheti rajtuk. L�athat�o, hogy a kernelben
lev}o modulokat nev�ukkel lehet azonos��tani (a modulnevek beker�ulnek egy fmodsw kernel
t�abl�azatba). A program v�eg�ul leveszi a driverr}ol a birk nev}u modult, �es lez�arja a meg-
nyitott �let.
A k�ovetkez}o �abra bemutat egy streamet az I_PUSH el}ott �es ut�an.
8.1. BEVEZET�ES 141
write queue read queue
write queue read queue
6
q-next
?
q-next
STREAMS
Driver
Stream-fej
write queue read queue
write queue read queue
6
q-next
?
q-next
6
q-next
?
q-next
write queue read queue
-PUSH
#include <stropts.h> /* Konstansok miatt kell */
#include <fcntl.h>
main() /* STREAMS pelda */
{
char buf[512];
int fd,count;
/* Driver megnyitasa : */
if ((fd=open("/dev/bcndm0",O_RDWR)) == -1 )
{ perror("/dev/bcndm0"); exit(1); }
/* Modul rahelyezese : */
if (ioctl(fd,I_PUSH,"birk") == -1)
{ perror("Push birk"); exit(2); }
while ((count = read(0,buf,512) ) > 0) /* STANDARD inputrol olvas */
if (write(fd,buf,count) != count)
{ perror("/dev/bcndm0"); exit(3); }
/* Modul leszedese : */
if (ioctl(fd,I_POP,0) == -1)
{ perror("Pop birk"); exit(2); }
close(fd);
}
142 FEJEZET 8. A UNIX SYSTEM V STREAMS PROGRAMOZ�ASA
8.1.6 Az ide tartoz�o rendszerh��v�asok
Ebben a pontban fel vannak sorolva azok a UNIX rendszerh��v�asok, amelyek felhaszn�al�oi
szinten kapcsol�odnak a STREAMS-hez. Ezek le��r�as�anak a tanulm�anyoz�asa hasznos lehet.
� open(2) : STREAMS device driverre vonatkoz�o �le megnyit�asa
� close(2) : STREAMS �le lez�ar�asa
� read(2) : Adatok olvas�asa egy �leb�ol
� write(2) : Adatok ��r�asa egy �leba
� ioctl(2) : ioctl h��v�asok. A STREAMS rendszer speci�alis ioctl h��v�asair�ol l�asd a
streamio(7)-et is.
� getmsg(2) : �Uzenet fogad�asa egy streamb}ol
� putmsg(2) : �Uzenet ��r�asa egy streamre
� poll(2) : STREAMS �leon input/output multiplexel�es
8.2 A STREAMS driverek fel�ep��t�ese
Ebben a fejezetben ismertetve lesz az, hogy hogyan �es mit kell tudnia egy STREAMS de-
vice drivernek. Majd bemutatunk egy egyszer}u STREAMS device drivert, �es k�et szint�en
egyszer}u szerkezet}u STREAMS modult. A driver egy tetsz}oleges nagys�ag�u csak ��rhat�o
mem�ori�at biztos��t a programoz�onak. Vagyis a hozz�a �erkez}o �uzeneteket mind eldobja,
mint a /dev/null UNIX device driver. A modulok k�oz�ul az egyik egy olyan modul lesz,
amely nem v�altoztatja meg a rajta �atmen}o adatokat - olyan, mintha ott se lenne. A
m�asik modulnak kicsit t�obb a haszna, a nyomk�ovet�esn�el j�ol lehet haszn�alni. A rajta
�atmen}o �uzenetek hexa dumpj�at ��rja ki.
8.2.1 Mire kell vigy�azni egy driver k�esz��t�esekor
A driverek logikailag a kernel legals�o szintj�en vannak, ez�ert azok ��r�asakor k�ul�on�osen
vigy�azzunk a k�ovetkez}okre :
� A driverek teljesen a kernelben dolgoznak, ez�ert a kis hib�ak is a UNIX rendszer
le�all�as�at vonhatj�ak maguk ut�an.
� A driverek nem haszn�alhatnak rendszerh��v�asokat, �es m�as ezekre �ep�ul}o k�onyvt�ari
rutinokat.
� A driverekben nem lehet a standard lebeg}opontos aritmetik�at haszn�alni.
8.2. A STREAMS DRIVEREK FEL�EP��T�ESE 143
8.2.2 STREAMS szolg�altat�asok
A STREAMS driverekben a driver megnyit�as�at, az adatok tov�abb��t�as�at �es a driver
lez�ar�as�at m�as-m�as elj�ar�as v�egzi. Ezeket az elj�ar�asokat a kernel a neki �atadott
t�abl�azatok alapj�an tudja el�erni, �es amikor v�egrehajtja }oket, akkor param�eterk�ent �atad az
elj�ar�asoknak inform�aci�okat, ami megk�onny��ti a munk�ajukat. A leggyakrabban haszn�alt
rutinok �es feladatuk le��r�asa a k�ovetkez}o pontok t�em�aja.�Altal�aban k�ul�on elj�ar�asokat ��rhatunk a lefel�e �es a felfel�e halad�o streamhez, de ��rhatunk a
k�et stream �altal k�oz�osen haszn�alt rutint is. Ha valamelyik szolg�altat�asra nincs sz�uks�eg,
akkor azt nem kell k�odolni (ld. k�es}obb).
Driver/modul megnyit�asa (open)
Szintaxis :
int xxopen(queue_ptr,dev,flag,sflag)
queue_t *queue_ptr; /* A read-queuera a pointer */
dev_t dev;
int flag,sflag;
Ez a rutin STREAMS driverekn�el a driver megnyit�as�an�al, a STREAMS modulokn�al
a modulra vonatkoz�o I_PUSH h��v�asn�al lesz v�egrehajtva. A hagyom�anyos UNIX device
driverekhez hasonl�oan ennek az elj�ar�asnak inicializ�al�asi feladatai vannak. A queue_ptr
param�eter az �uj streamre egy pointer. A dev param�eter a device numbert tartalmazza, a
flag param�eter megegyezik a hagyom�anyos UNIX device driverekn�el haszn�alt flag-gel
jel�olt param�eterrel (open agek, ld. oflags az open rendszerh��v�as param�eterei k�oz�ott). A
dev param�eter mind a major mind a minor device numbert tartalmazza. Ha sz�uks�eg�unk
van ezek k�oz�ul valamelyikre, akkor az a major() illetve minor() kernel seg�edrutinnal
(legt�obb helyen ez egy makro) kinyerhet}o a dev param�eterb}ol. Az sflag a stream meg-
nyit�as�anak speci�alis jellemz}oit tartalmazza. �Ert�eke lehet :
� 0 : norm�al open-n�el lesz megh��vva, vagyis amikor egy STREAMS driverre utal�o
spci�alis �let nyitunk meg. Ekkor a dev-ben megadott minor device number a �le-
rendszerb}ol kinyert sz�am lesz.
� MODOPEN : Modulk�enti megnyit�askor lesz megh��vva.
� CLONEOPEN : Clone-driver t��pus�u megnyit�ast jelzi. Ekkor nem lesz �atadva a dev
param�eterben �erv�enyes minor device number, hanem a drivernek mag�anak kell egy
bels}o t�abl�azat�ab�ol egy minor device numbert a h��v�o programnak adni.
Az, hogy egy driver hogyan lesz megnyitva, vagyis az sflag=0 lesz vagy
sflag=CLONEOPEN lesz, az a /dev directoryban lev}o speci�alis �lera utal�o bejegyz�es tar-
talm�at�ol f�ugg. A clone-drivernek a major device numberja 63 legyen (SINIX rendszerben
a clone driver major device numberja pont 63), a minor device numberje pedig legyen
egyenl}o az igazi device major device numberj�evel. Ett}ol f�uggetlen�ul csin�alhatunk m�eg
t�obb directory-bejegyz�est is a �lerendszerbe az igazi driver saj�at major �es minor de-
vice numberjeivel. Ezekkel az egyes minor device-okat direkt el tudjuk �erni (ha p�eld�aul
csak a kontroller 2. portja j�o nek�unk, akkor azt). Erre l�athatunk p�eld�at a k�ovetkez}o
144 FEJEZET 8. A UNIX SYSTEM V STREAMS PROGRAMOZ�ASA
t�abl�azatban.
Drivern�ev Major device nr Minor device nr Megjegyz�es
clone 63 0 Clone-driver
x0 40 0 Kontroller 0. portja (direkt)
x1 40 1 Kontroller 1. portja (direkt)
... .. .. ..
xcln 63 40 Kontroller a Clone-driveren kereszt�ul
Ha az xcln �let megnyitjuk, aminek a major device numberje egyenl}o a clone driver major
device numberj�evel, akkor a clone driver lesz el}osz�or v�egrehajtva, �es (mint egy diszp�ecser)
keres egy �ures minor devicet, �es ezt adja tov�abb a driver open rutinnak. A megnyit�o rutin
egy nulla visszat�er�esi �ert�ekkel jelzi, ha nem volt hiba a fut�asa k�ozben, vagy OPENFAIL
�ert�ekkel t�erjen vissza, ha a megnyit�as eredm�enytelen volt. Az open �es a close rutinok
v�egrehajt�asakor a kernel lokkolja a device i-nodej�at, ��gy egyszerre csak egy open vagy
close rutin lehet akt��v major/minor deviceonk�ent. Megjegyz�es: Ha a felhaszn�al�oi programokb�ol
megnyitjuk egy STREAMS device driver valamelyik minor device-j�at, majd k�es}obb ism�et kiadunk egy open
rednszerh��v�ast ugyanarra a minor devicera, akkor a m�asodik open rendszerh��v�asn�al az open rutin nem lesz �ujra
megh��vva.
Driver/modul lez�ar�asa (close)
Szintaxis :
xxclose(queue_ptr)
queue_t *queue_ptr; /* Pointer a read queuera */
A rutin a STREAMS driverre vonatkoz�o close rendszerh��v�asn�al �es az I_POP ioctl
h��v�asn�al lesz v�egrehajtva. Ezut�an a felhaszn�al�oi program m�ar nem tudja el�erni a de-
vice drivert (vagy modult). Sikeres v�egrehajt�as eset�en a visszat�er�esi �ert�ek: 0, sikertelen
v�egrehajt�as eset�en pedig az errno v�altoz�oba rakand�o �ert�ek legyen. Megjegyz�es: a close rutin
csak akkor lesz megh��vva, amikor az adott minor devicera vonatkoz�o legutols�o �let is lez�art�ak.
�Uzenet fogad�asa (put rutin)
Szintaxis :
int xxput(qp,mp)
queue_t *qp;
mblk_t *mp;
Ez az elj�ar�as akkor lesz v�egrehajtva, amikor a drivernek (vagy modulnak) adatot
kell fogadnia a qp param�eter�eben megadott streamr}ol. A mp param�eter a be�erkezett
�uzenetre pointer. Az �uzenetet vagy el kell dobnia, vagy m�odos��tva tov�abb kell
adnia. Ha tov�abbadja, akkor vagy egy saj�at sor�aba (putq() f�uggv�ennyel), vagy a strea-
men lev}o k�ovetkez}o modulnak (putnext() makr�oval), vagy pedig az ellenkez}o ir�any�u
sorba (qreply() f�uggv�ennyel) adhatja tov�abb. Ha egy saj�at sor�aba adja tov�abb, akkor
az �uzenet m�eg �atmegy egy service rutinon is (ld. k�es}obb). Az �uzenettov�abb��t�as �altal�aban
az �uzenetre mutat�o pointer tov�abbad�as�at jelenti.
8.2. A STREAMS DRIVEREK FEL�EP��T�ESE 145
A service rutin
Szintaxis :
int xxsrv(qp)
queue_t *qp;
A service rutin csak a saj�at sor�ara mutat�o pointert kapja meg param�eterk�ent. A
getq f�uggv�ennyel tudja a sor�ab�ol a k�ovetkez}o �uzenetet megszerezni, majd ezut�an ha
tudja, akkor tov�abbadhatja a streamen k�ovetkez}o modulnak. Ez alapj�an egy service
rutin v�azlatos fel�ep��t�ese a k�ovetkez}o lehet :
int xxsrv(qp)
queue_t *qp;
{
/* Lokalis deklaraciok - reentrans kod erdekeben */
mblk_t *mp;
while (mp=getq(qp) != NULL)
{
if (canput(qp->q_next) || (a message magas prioritasu))
{
dolgozd_fel_az_uzenetet();
if (tovabb_kell_adni_az_uzenetet())
{
putnext(qp,mp);
}
} else {
putbq(qp,mp);
return;
}
}
}
Az �uzenett��pusok �ert�ekei �ugy vannak kiosztva, hogy azok az �uzenetek alacsony pri-
orit�as�uak, amelyeknek adatblokkj�aban a db type mez}o �ert�eke QPCTL-n�el kisebb (a
QPCTL makro a saj�at oper�aci�os rendszer�unk valamelyik header�le-j�aban van de�ni�alva).
Service rutin vs. put rutin
A service rutin opcion�alis, csak akkor sz�uks�eges, ha a put rutin az �uzenetet nem tudja
a be�erkez�es�enek " pillanat�aban " r�ogt�on feldolgozni (mert p�eld�aul a hardware perif�eria
m�eg nem �ert el egy bizonyos bels}o �allapotot) vagy a stream m�ar t�ul van terhelve �es nem
f�er bele az �uzenet. Minden modulhoz �es driverhez meg lehet adni egy low water mark �es
egy high water mark �ert�eket. Ez az�ert j�o, mert el lehet vele �erni egy nagyj�ab�ol egyenletes
adat�araml�ast (nem alakul ki adatdug�o). Ha az �uzenetek �altal lefoglalt byte-ok sz�ama
meghaladja a modulhoz megadott high water mark �ert�eket, akkor egy QFULL ag be lesz
�all��tva. Ennek a agnek az �allapot�at az el}otte lev}o modul a canput kernelf�uggv�ennyel
lek�erdezheti, �es ha a ag be van �all��tva, akkor norm�al (alacsony) priorit�as�u �uzeneteket
146 FEJEZET 8. A UNIX SYSTEM V STREAMS PROGRAMOZ�ASA
m�ar nem adhat tov�abb. (Ezeket a saj�at sor�aba visszarakhatja a putbq STREAMS kernel
seg�edf�uggv�ennyel.) A service rutinra csak akkor jut a vez�erl�es, ha az addig �ures sorba
egy �uj �uzenet ker�ult, vagy az alatta k�ovetkez}o modulban el�erte az �uzenetek �altal lefoglalt
byte-ok sz�ama a low water markot. Ezen k��v�ul m�askor is megkaphatja a vez�erl�est, de
err}ol saj�at mag�anak kell gondoskodnia (a qenable �es az enableok STREAMS kernel
seg�edrutinok seg��ts�eg�evel).
service
put
?
service
put
?
?
?
?
service
put
6
service
put
6
6
6
6
-
-
�
�
Driver ioctl rutin
A hagyom�anyos karakteres UNIX device driverekben egy k�ul�on bel�ep�esi pont az ioctl
h��v�asokat feldolgoz�o elj�ar�as. Ezzel szemben a STREAMS device driverek eset�eben az
ioctl h��v�asokat t�obbnyire a stream-fej dolgozza fel, azokb�ol bizonyos t��pus�u �uzeneteket
gener�al, ami le lesz k�uldve a STREAMS drivernek (vagy modulnak). Az I_STR h��v�as
p�eld�aul arra utas��tja a stream-fejet, hogy egy M_IOCTL t��pus�u �uzenetet k�uldj�on le a strea-
men. Ekkor az ioctl h��v�asok feldolgoz�asa az M_IOCTL t��pus�u �uzenetek driveren bel�uli
feldolgoz�as�at jelenti.
8.2.3 Kritikus szakaszok v�edelme
Gyakran sz�uks�eg van arra, hogy am��g egy bonyolultabb adatstruktur�at egy STREAMS
driveren vagymodulon bel�ul megv�altoztatunk, addig letiltsuk a megszak��t�asokat. P�eld�aul
az�ert, mert ha a driver az adatstrukt�ura m�odos��t�as�at nem fejezte be, �es a m}uk�od�es�et
megszak��tja egy m�asik driver, amely az inkonzisztens �allapotban lev}o adatstruktur�at
tudja csak m�odos��tani, akkor az eg�esz rendszer �eps�ege vesz�elyeztetve van. A kritikus
szakasz elej�en az interruptokat az splstr() h��v�assal lehet letiltani, a visszat�er�esi �ert�eket
a kritikus szakasz v�eg�eig kell elt�arolni. A kritikus szakasz v�eg�en vissza kell �all��tani a
processzor interrupt priorit�asi szintj�et az splx() kernel h��v�as seg��ts�eg�evel a kritikus sza-
kaszba bel�ep�es el}otti szintre. Ez v�azlatosan a k�ovetkez}ok�epp oldhat�o meg:
8.2. A STREAMS DRIVEREK FEL�EP��T�ESE 147
rutin()
{
int regispl;
...
regispl=splstr();
...
/* Kritikus szakasz */
...
splx(regispl);
...
}
8.2.4 Fontosabb adatszerkezetek
A k�ovetkez}okben ismertetett adatstruktur�ak �altal�aban minden STREAMS driverben
megvannak. Az�ert fontosak, mert a kernel ezek alapj�an tal�alja meg a driver k�ul�onf�ele
szolg�altat�asait v�egz}o elj�ar�asait.
A modul inform�aci�os struktura
Ez a struktura az egyes stream sorok jellemz}oit tartalmazza. A fel�ep��t�ese a k�ovetkez}o
(ISC UNIX 3.2 alapj�an) :
struct module_info {
ushort mi_idnum;
char *mi_idname;
short mi_minpsz;
short mi_maxpsz;
ushort mi_hiwat;
ushort mi_lowat;
};
Az mi_idnum mez}o tartalmazza a modul azonos��t�osz�am�at. A mi_idname mez}o tar-
talmazhatja a modul nev�ere (egy stringre) mutat�o pointert (a kernel ez alapj�an a n�ev
alapj�an meg tudja tal�alni). A mi_minpsz �es a mi_maxpszmez}ok a modul �altal elfogadott
�uzenetek minim�alis illetve maxim�alis m�eret�et szabj�ak meg. Ezek a mez}ok mindig csak a
stream-fejhez legk�ozelebb lev}o STREAMS moduln�al �erdekesek, mert a STREAM-fej �ugy
fogja a lefel�e k�uld�ott adatokat �uzenetekre sz�etv�agni, hogy az egyes �uzenetek m�erete a
megadott minim�alis �es maxim�alis �uzenetm�eret k�oz�e essen. A legfels}o modul alatti mod-
ulokban megadott maxim�alis �es minim�alis �uzenetm�eretet a STREAMS rendszer nem
haszn�alja semmire, a programoz�o maga d�onti el, hogy valamire akarja-e azt haszn�alni.
A marad�ek k�et mez}o a low ill. high water mark �ert�ekeket tartalmazz�ak. Ezeknek az
�ert�ekeknek a kiv�alaszt�asakor �gyelembe kell venni azt, hogy a stream-fej a 64 byten�al
r�ovidebb �uzeneteknek is 64 byteot foglal le, nehogy a STREAMS rendszer rendelkez�es�ere
�all�o mem�oria t�uls�agosan feldarabol�odjon.
148 FEJEZET 8. A UNIX SYSTEM V STREAMS PROGRAMOZ�ASA
A qinit struktura
Ebben a struktur�aban kell t�arolni azt, hogy az egyes soroknak a szolg�altat�asait melyik
elj�ar�asokban k�odoltuk. A struktura fel�ep��t�ese a k�ovetkez}o :
struct qinit {
int (*qi_putp)(); /* put eljarasra mutat */
int (*qi_srvp)(); /* service eljarasra mutat */
int (*qi_qopen)(); /* open ill I_PUSH eseten meghivva */
int (*qi_qclose)(); /* lezarasnal meghivva */
int (*qi_admin)(); /* 3bnet admin funkcioja */
struct module_info *qi_minfo; /* module_info struktura */
struct module_stat *qi_mstat; /* statisztikai struktura */
};
Ezt a struktur�at a driveren bel�ul nem szabad megv�altoztatni (mivel ez m�asokra
is kihat�assal lenne). Az open �es close rutinokra mutat�o pointerek a read qinit struk-
tur�aban legyenek, mivel a rendszer mindenk�eppen azokat hajtja v�egre. (�Erdemes a write
oldalra a k�onnyebb olvashat�os�ag �erdek�eben ugyanezeket az elj�ar�asokat bejegyezni.)
A streamtab struktura
Ez a struktura tartalmazza a driverek read ill. write queue-jainak a qinit struktur�aira
mutat�o pointert. Fel�ep��t�ese :
struct streamtab {
struct qinit *st_rdinit; /* Felso read queue */
struct qinit *st_wrinit; /* Felso write queue */
struct qinit *st_muxrinit; /* Also read queue */
struct qinit *st_muxwinit; /* Also write queue */
};
Az als�o soroknak csak a multiplexer driverekn�el van szerep�uk.
8.2.5 Tov�abbi hasznos tan�acsok
A k�ovetkez}o szab�alyokat �erdemes betartani a rendszer konzisztenss�eg�enek megtart�asa
�erdek�eben.
STREAMS device driverek k�esz��t�es�en�el
� Azokat az �uzeneteket, amikkel a driver nem tud mit kezdeni, el kell dobni
(freemsg() kernel h��v�as seg��ts�eg�evel).
� A drivernek fel kell dolgoznia minden M IOCTL �uzenetet. Ha ez nem t�ort�enik
meg, akkor a STREAM-fej (esetleg v�egtelen sok�aig) leblokkol, mert hi�aba v�ar az
ioctl() h��v�as nyugt�az�as�ara.
� Ha egy driver nem tud mit kezdeni egy M IOCTL �uzenettel, akkor azt egy
M IOCNAK �uzenettel nyugt�azza. Ez az eset p�eld�aul akkor fordulhat el}o, ha el��r�as
vagy egy�eb felhaszn�al�oi programbeli hib�ak miatt a drivernek rossz (esetleg m�as
drivereknek sz�ant) M IOCTL �uzenetek lesznek �atadva.
8.2. A STREAMS DRIVEREK FEL�EP��T�ESE 149
STREAMS modulok k�esz��t�es�en�el
� Azokat az �uzeneteket, amik nem a modulnak sz�olnak, v�altoztat�as n�elk�ul tov�abb
kell adni.
� Amodulnak sz�ol�o M IOCTL �uzeneteket feldolgoz�asuk ut�an a modulnak nyugt�aznia
kell vagy egy M IOCACK vagy pedig egy M IOCNAK t��pus�u �uzenettel. (Azokat az
M IOCTL �uzeneteket, amelyek nem a modulnak sz�olnak, v�altoztat�as n�elk�ul tov�abb
kell adni.)
Megjegyz�esek a p�eldadriverhez
A driverben csak a write queue-hoz tartoz�o put elj�ar�as van implement�alva - a t�obbi
szolg�altat�as hely�en a nulldev elj�ar�as c��me van. Ez az elj�ar�as a kernelben egy �ures
elj�ar�as. C nyelven kb. a k�ovetkez}o lehet :
nulldev()
{
}
A kernelt disassembl�alva a k�ovetkez}o assembly sorok tartoznak ehhez az elj�ar�ashoz
(INTERACTIVE 3.2 UNIX alapj�an) :
nulldev()
pushl %ebp
movl %esp,%ebp
leave
ret
A nulldev elj�ar�as mellett l�etezik egy nodev nev}u is, amit hasonl�o esetekben
haszn�alhatunk. A kett}o k�oz�ott a k�ul�onbs�eg az, hogy a nulldev- vel k�odolt szolg�altat�ast
kiv�alt�o rendszerh��v�as a sikeres v�egrehajt�as�anak megfelel}o visszat�er�esi �ert�eket ad vissza,
m��g a nodev-vel jel�olt szolg�altat�asokat ig�enybe vev}o rendszerh��v�asok hibak�oddal t�ernek
vissza.
8.2.6 A driver hiba�uzenetei
A device driverekben (��gy a STREAMS driverekben is) a hiba�uzeneteket a cmn_err()
kernel rutin seg��ts�eg�evel lehet ki��rni - ennek r�eszletesebb le��r�as�at l�asd az �altal�anosan
haszn�alhat�o kernel rutinokr�ol sz�ol�o r�eszben. Helyrehozhatatlan hib�ak eset�en ez a rutin
viszi a UNIX rendszert a panic �allapotba, ami v�egs}o soron a processzor shutdown
�allapotba rak�as�at jelenti. A cmn_err() kernel h��v�as szintaxisa a k�ovetkez}o:
#include "sys/cmn_err.h"
int cmn_err(severity, format, arguments)
char *format;
int severity, arguments;
150 FEJEZET 8. A UNIX SYSTEM V STREAMS PROGRAMOZ�ASA
8.2.7 A driver list�aja
#include <sys/types.h>
#include <sys/stream.h>
#include <sys/cmn_err.h>
#define NULL ((char *)(0))
extern nulldev();
static int bcndput(), bcndopen(), bcndclose();
static struct module_info modinfo =
/* A stream queue jellemzoit irja le */
{ 0, /* Modulazonosito szam - itt nem fontos */
(char *)0, /* Modul neve - itt nem fontos */
0, /* Minimalis message-meret */
INFPSZ, /* Maximalis message-meret - INFPSZ=vegtelen */
0, 0 /* High; low water mark; 0=nincs ellenorzes */
};
static struct qinit bcndwinit =
/* "write" queue - lefele halado adatok */
{ bcndput, /* A message feldolgozasat vegzo eljaras */
nulldev, /* Service procedure - itt nincs */
bcndopen, /* open-nel ill. PUSH-nal meghivott rutin */
bcndclose, /* utolso close-nal vagy pop-nal vegrehajtva */
nulldev, /* admin bejegyzes (csak a 3bnet-hez kell) */
&modinfo, /* Modulinformacios struktura */
NULL /* Statisztikakat tartalmazo tablazat */
};
static struct qinit bcndrinit =
/* "read" queue - felfele halado adatok */
{ nulldev, /* Errol a driverrol nem fognak olvasni */
nulldev, /* Service proc. nincs */
bcndopen, /* open-nel, PUSH-nal meghivott rutin */
bcndclose, /* utolso close-nal vagy pop-nal meghivott r. */
nulldev, /* admin bejegyzes */
&modinfo, /* Modulinformacios struktura */
NULL /* Statisztikakat tartalmazo tablazat cime */
};
struct streamtab bcndinfo =
/* A kernel ez alapjan tud tajekozodni a driverben */
{ &bcndrinit, /* Read queue-rol informaciok */
&bcndwinit, /* Write queue-rol informaciok */
NULL, /* Multiplex. read queue */
NULL /* Multiplex write queue */
8.2. A STREAMS DRIVEREK FEL�EP��T�ESE 151
};
static int bcndput(q,mp)
/* "write" rutin */
queue_t *q; /* Pointer a WRITE-queue-ra */
mblk_t *mp; /* Az adatblokkra pointer */
{
cmn_err(CE_CONT, "bcndput... " ); /* Nem lesz ujsor kiirva ... */
freemsg(mp); /* Visszaadjuk a rendszernek a stream-fej altal
az uzenetnek lefoglalt memoriateruletet */
}
static int bcndopen(q, dev, flag, sflag)
queue_t *q;
dev_t dev;
int flag,sflag;
{
cmn_err(CE_NOTE, "bcndopen" );
return 0;
}
static int bcndclose(q)
queue_t *q;
{
cmn_err(CE_NOTE, "bcndclose" );
return 0;
}
8.2.8 A driver kernelbe linkel�ese
A UNIX kernel bizonyos fokig modul�aris szerkezet}u. Van egy (nagy) k�ozponti r�esze
(ennek neve: os.o, m�erete az Siemens i486 Release 4 UNIX eset�en kb. 1.5 MByte),
�es vannak egy�eb kieg�esz��t�esek, ilyenek p�eld�aul a t�obbf�ele (0.5K, 1K, 2K) �lesystemek,
az ATT xt driver. Nem minden UNIX kon�gur�aci�o alatt van sz�uks�eg az �osszes ilyen
kieg�esz��t}o driverre (az xt driverre pl. csak akkor, ha olyan speci�alis termin�alokkal ren-
delkez�unk, ami ezt kihaszn�alhatja). Azt, hogy az aktu�alis UNIX software-kon�gur�aci�o
ezek k�oz�ul mit tartalmaz az �un. master �leokban van le��rva. K�et ilyen master �le van: az
egyik az mdevice, a m�asik az sdevice. Mindkett}o �le a /etc/conf/cf.d directoryban
tal�alhat�o.
Ezeknek a �leoknak a pontos szerkezet�er}ol a man paranccsal nyerhet�unk pontosabb in-
form�aci�okat. Itt csak a legalapvet}obb tudnival�ok lesznek ismertetve, ami a STREAMS
driverekn�el fontos. Az mdevice �le tartalmazza az �osszes l�etez}o driver le��r�as�at, az
sdevice �le pedig az aktu�alis kon�gur�aci�ot ��rja le.
Az mdevice �le
Az mdevice �leb�ol egy r�eszlet (a fejl�ec nem tartozik a �lehoz!):
152 FEJEZET 8. A UNIX SYSTEM V STREAMS PROGRAMOZ�ASA
Device Funkciok Karakte- Prefix Block Char. Min. Max. DMA
name listaja risztika major nr. major nr. unit unit channel
tape ocrwi ioc tape_ 0 41 0 1 -1
ldterm - Si ldtr 0 0 1 32 -1
ptem - Si ptem 0 0 1 32 -1
timod - Si tim 0 0 1 4 -1
tirdwr - Si trw 0 0 1 8 -1
udp I iSco udp 0 29 1 256 -1
� Devicename : Ez a device (vagy a modul) bels}o neve. Maximum 8 karakter hossz�u
lehet.
� Funkciolista : Ez a mez}o egy vagy t�obb karaktert tartalmazhat, amely a megl�ev}o
driver szolg�altat�asokat ��rja le ha egyik szolg�altat�as sem l�etezik, akkor egy mi-
nusz jelet kell ide rakni). A driver szolg�altat�asok t�obbek k�ozt a k�ovetkez}ok (err}ol
r�eszletesebben l�asd a megfelel}o UNIX referencia k�ezik�onyveket) :
{ o : open rutin
{ c : close rutin
{ r : read rutin
{ w : write rutin
{ i : ioctl rutin
{ s : startup rutin
{ I : init rutin
� Karakterisztika : Ez a device egyes jellemz}oit tartalmazza. Itt csak a fontosab-
bak lesznek megeml��tve :
{ i : A device driver install�alhat�o.
{ c : A device egy karakteres el�er�es}u egys�eg.
{ b : A device blokk el�er�es}u.
{ o : Ehhez a devicehoz csak egy sdevice beli sor tartozhat.
{ S : Ez STREAMS jelleg}u driver ill. modul.
{ r : Erre a devicera sz�uks�eg van m�eg a legminim�alisabb kernel kon�gur�aci�oban
is.
A STREAMS device driverekn�el itt az Sc bet�uknek el}o kell fordulniuk. Azokn�al a
STREAMS modulokn�al, amelyek egyben nem device driverek : c bet�u ne forduljon
el}o!
� Prefix : Ez a mez}o tartalmazza azt a sz�oveget, ami alapj�an a kernel megtal�alja a
bel�ep�esi pontokat tartalmaz�o t�abl�azatot. (STREAMS drivern�el: ha a streamtab
struktur�anak a neve (mint a p�eld�aban) : bcndinfo, akkor ez a mez}o bcnd sz�oveget
tartalmaz.
8.2. A STREAMS DRIVEREK FEL�EP��T�ESE 153
� Block major nr. : A legt�obb esetben ennek a mez}onek a tartalma legyen 0, mert
a device numberek az install�al�askor az idinstall v�egrahajt�asakor lesznek kiosztva.
� Char major nr. : Ld. a Block major nr. mez}ot.
� Min. unit : Ez tartalmazza azt a minim�alis sz�amot, amit az sdevice tartalmazhat
az unit mez}oben.
� Max. unit : Ez tartalmazza azt a maxim�alis sz�amot, amit az sdevice maximum
tartalmazhat az unit mez}oben.
� DMA channel : Itt lesz megadva, hogy a device melyik DMA csatorn�at haszn�alja.
Ha a device nem haszn�al DMA csatorn�at, akkor ide -1 ker�ul.
Az sdevice �le
Az sdevice �leb�ol egy r�eszlet (a fejl�ec nem tartozik a �lehoz!):
Device Con Unit Ipl Type Vector SIOA EIOA SCMA ECMA
name figu-
re
tape N 1 0 0 0 0 0 0 0
ldterm Y 16 0 0 0 0 0 0 0
ptem Y 16 0 0 0 0 0 0 0
timod Y 1 0 0 0 0 0 0 0
tirdwr Y 1 0 0 0 0 0 0 0
udp Y 256 0 0 0 0 0 0 0
Ez a �le tartalmazza azt, hogy az mdevice �leban speci�k�alt deviceok k�oz�ul az
aktu�alis kon�gur�aci�oba mely driverek ker�ultek bele, �es melyek nem. Ez a �le az
/etc/conf/sdevice.d directoryban lev}o komponensekb}ol lesz �ossze�all��tva. (A fenti di-
rectoryban lev}o �leokat vagy a rendszerrel sz�all��tott�ak, vagy k�es}obb lett install�alva az
idinstall paranccsal.) A �le bejegyz�esei a k�ovetkez}ok :
� Device name : A driver bels}o nev�et tartalmazza. Valamelyik mdevice bejegyz�es
nev�evel meg kell egyeznie.
� Configure : Ez a mez}o 'Y'-t tartalmazzon akkor, ha install�alni kell a kernelbe,
egy�ebk�ent 'N'-et.
� Unit : Ez az �ert�ek a device driver �altal vez�erelhet}o aldevice-ok sz�am�at tartalmazza.
(Maxim�alis �es minim�alis �ert�eke az mdevice �leban van felt�untetve.)
� Ipl : Ez a mez}o azt hat�arozza meg, hogy a driver interrupt rutinja mely rendszer
ipl (ipl=interrupt priority level) szinten fusson. �Ert�eke 0 �es 8 k�ozt lehet. Ha a
drivernek nincs interrupt rutinja, akkor ebbe a mez}obe 0 ker�ulj�on.
� Type : Ez a mez}o tartalmazza az interruptkioszt�as m�odj�at. �Ert�ekei itt nem lesznek
megnevezve. Ha a driver nem tartalmaz interrupt rutint, akkor ide 0 ker�ulj�on.
154 FEJEZET 8. A UNIX SYSTEM V STREAMS PROGRAMOZ�ASA
� Vector : Ez a mez}o a devicehoz rendelt interrupt vektor (sor-)sz�am�at tartalmazza.
Ha a devicehoz nem tartozik interrupt vektor, akkor e mez}o �ert�eke 0 legyen.
� SIOA : A Start I/O Addresst tartalmazza a mez}o. Ha ilyen dolog nem tartozik a
driverhez, akkor �ert�eke 0 legyen.
� EIOA : Az End I/O Addresst tartalmazza a mez}o. Ha ilyen dolog nem tartozik a
driverhez, akkor �ert�eke 0 legyen.
� SCMA : A Start Controller Memory Addresst tartalmazza a mez}o. Ha ilyen dolog
nem tartozik a driverhez, akkor �ert�eke 0 legyen.
� ECMA : Az End Controller Memory Addresst tartalmazza a mez}o. Ha ilyen dolog
nem tartozik a driverhez, akkor �ert�eke 0 legyen.
8.2.9 Driver install�al�as ISC UNIX alatt
Ha egy device drivert elk�esz��t�unk, akkor azt egy speci�alis (Driver Software Pack-
agenek nevezett) form�aban terjeszthetj�uk p�eld�aul m�agneslemezen. Az INTERAC-
TIVE UNIX az ilyen form�atum�u device drivereket automatikusan tudja install�alni, ez
nagy k�onnyebbs�eg a felhaszn�al�onak. (Err}ol a form�atumr�ol az INTERACTIVE UNIX
le��r�as�aban olvashatunk.) De a driver fejleszt�es�en�el el�eg hosszadalmas munka lenne min-
den egyes tesztverzi�on�al egy DSP form�atum�u lemezt l�etrehozni, ez�ert a k�ovetkez}okben
bemutatjuk a driver install�al�as�anak manu�alis v�altozat�at. Ehhez �altal�aban a root n�even
kell bejelentkezni.
Objectk�od l�etrehoz�asa
Ha a driver�unk forr�ask�odja egyetlen C nyelv}u programb�ol �all (ennek neve legyen most
Driver.c, akkor azt a szok�asos m�odon a
cc -c Driver.c
UNIX parancs seg��ts�eg�evel ford��thatjuk le. (B�armi lehet a driver neve, csak az a
fontos, hogy a keletkezett objectk�od �at legyen majd nevezve a Driver.o n�evre.) Ha
viszont a driver forr�ask�odja t�obb C nyelv}u programb�ol �all, akkor azokat egyenk�ent a
fenti m�odon kell leford��tani, �es az ld -r paranccsal az ��gy keletkezett objecteket lehet
egy modull�a �osszeszerkeszteni, aminek a neve legyen Driver.o.
Master�leok v�altoztat�asa
Adni kell a drivernek egy nevet. (P�eld�aul a master �leokban ez a n�ev fogja azonos��tani a
drivert. A p�eldadriver�unkn�el legyen ez a n�ev:bcnd, ezt a nevet haszn�aljuk a tov�abbiakban
is.)
Kre�alni kell egy system �le bejegyz�est (ez ker�ul az sdevice �leba) a k�ovetkez}ok�epp:
az /etc/conf/sdevice.d directoryban hozzunk l�etre sz�ovegszerkeszt}ovel egy bcnd nev}u
�let. Ebbe ��rjuk a driverhez tartoz�o sdevice bejegyz�est. Legyen ez p�eld�aul a k�ovetkez}o
:
bcnd Y 1 0 0 0 0 0 0 0
8.2. A STREAMS DRIVEREK FEL�EP��T�ESE 155
Az mdevice �let szint�en ki kell eg�esz��teni. Ez �ugy megy, hogy az aktu�alis directoryban
l�etre kell hozni egy Master nev}u �let, ami az �uj mdevice bejegyz�est tartalmazza. Legyen
ez a k�ovetkez}o :
bcnd - Sic bcnd 0 0 1 4 -1
A k�ovetkez}o UNIX shell parancs megv�altoztatja az mdevice �let (�ugy, hogy a Master
�let az aktu�alis directoryb�ol t�orli). (A le��r�asban van az, hogy a Master nev}u �let a
rendszer t�orli az aktu�alis directoryb�ol, amikor a p�eldadrivereket beraktam a rendszerbe,
akkor nekem nem t�or�olte le ezt a �let.)
/etc/conf/bin/idinstall -a -m -k bcnd
Ezut�an az /etc/conf/cf.d/mdevice �leban n�ezz�uk meg a blokk/karakteres major
device numbert, k�es}obb m�eg sz�uks�eg lesz r�a.
Speci�alis �le bejegyz�ese
Kre�alj egy bcnd nev}u �let a /etc/conf/node.d directoryban, �es eg�esz��tsd ki azt a Node
form�atumnak megfelel}oen. (Vagyis 4 mez}o legyen egy rekordban, �es az egyes mez}ok
jelent�ese a k�ovetkez}o :
1.: Driver neve (itt : bcnd)
2.: A device speci�alis �lej�anak a neve
3.: 'b' vagy 'c' bet}u (blokk/character device drivernek)
4.: Minor device number)
A driver�unkn�el ez a k�ovetkez}ok�epp n�ez ki :
bcnd bcndm0 c 0
Tov�abbi �leok kre�al�asa
Ha a drivert letesztelt�uk, �es m�ar hib�atlanul m}uk�odik, akkor a /etc/conf/init.d,
a /etc/conf/rc.d �es a /etc/conf/sd.d directorykat is a sz�uks�eges scriptekkel
kieg�esz��thetj�uk.
A kernel �ujralinkel�ese
Kre�alni kell egy /etc/conf/pack.d/bcnd nev}u directoryt, �es be kell vinni oda a
Driver.o �es a Space.c nev}u �leokat, �es csin�alni kell egy m�asolatot a r�egebbi UNIX
kernelr}ol a k�ovetkez}o paranccsal :
cp /unix /unix.bak
Majd v�egre kell hajtani a /etc/conf/bin/idbuild shell scriptet, ami �ujralinkeli a
kernelt. Ha nem volt hiba, akkor shutdown ut�an a UNIX rendszert �ujra bet�oltve tesztel-
het}o a driver. (A device speci�alis �leok csak a k�ovetkez}o UNIX reboot ut�an lesznek
megkre�alva.)
156 FEJEZET 8. A UNIX SYSTEM V STREAMS PROGRAMOZ�ASA
8.2.10 M�eg egy p�elda: a birka modul
A k�ovetkez}o lista egy "birka" modul list�aj�at tartalmazza. A modul nem b�ant semmit,
ami rajta �atmegy (innen ered a neve is). A modul az �uzenet tov�abb��t�as�ahoz a putnext()
kernel makrot haszn�alja.
#include <sys/types.h>
#include <sys/stream.h>
#include <sys/cmn_err.h>
#define NULL ((char *)(0))
extern nulldev();
static int birkwrite(), birkopen(), birkclose();
static struct module_info modinfo =
/* A stream queue jellemzoit irja le */
{ 0xa0, /* Modulazonosito szam */
"birk", /* Modul neve */
0, /* Minimalis message-meret */
INFPSZ, /* Maximalis message-meret - INFPSZ=vegtelen */
0, 0 /* High; low water mark; 0=nincs ellenorzes */
};
static struct qinit birkwinit =
/* "write" queue */
{ birkwrite, /* A message feldolgozasat vegzo eljaras */
nulldev, /* Service procedure - itt nincs */
birkopen, /* open-nel ill. PUSH-nal meghivott rutin - comment */
birkclose, /* utolso close-nal vagy pop-nal vegrehajtva - comment*/
nulldev, /* admin bejegyzes (csak a 3bnet-hez kell) */
&modinfo, /* Modulinformacios struktura */
NULL /* Statisztikakat tartalmazo tablazat */
};
static struct qinit birkrinit =
/* "read" queue */
{ birkwrite, /* Message feldolgozasa */
nulldev, /* Service proc. nincs */
birkopen, /* open-nel, PUSH-nal meghivott rutin */
birkclose, /* utolso close-nal vagy pop-nal meghivott r. */
nulldev, /* admin bejegyzes */
&modinfo, /* Modulinformacios struktura */
NULL /* Statisztikakat tartalmazo tablazat cime */
};
struct streamtab birkinfo =
/* A kernel ez alapjan tud tajekozodni a driverben */
8.2. A STREAMS DRIVEREK FEL�EP��T�ESE 157
{ &birkrinit, /* Read queue-rol informaciok */
&birkwinit, /* Write queue-rol informaciok */
NULL, /* Multiplex. read queue */
NULL /* Multiplex write queue */
};
static int birkwrite(q,mp) /* "put" rutin */
queue_t *q; /* Pointer a WRITE-queue-ra */
mblk_t *mp; /* Az adatra pointer */
{
putnext(q, mp); /* A megkapott uzenet tovabbitasa */
/*
Ha a fenti sor helyett csak egy
freemsg(mp);
sor lenne, akkor ez a korabbi driver modul megfeleloje lenne
*/
}
static int birkopen(q, dev, flag, sflag)
queue_t *q;
dev_t dev;
int flag,sflag;
{
/*
Mivel minden queuen egyforman nem csinal semmit a modul, ezert
nem kell semmi informaciot elrakni
*/
return 0; /* Minden O.K. */
}
static int birkclose(q)
queue_t *q;
{
return 0; /* Minden O.K. */
}
8.2.11 Egy egyszer}u debug modul
A k�ovetkez}o lista egy "debug"modul list�aj�at tartalmazza. A modul nem v�altoztatja meg
a rajta �atmen}o adatokat, csak egy hexa dumpot ��r ki r�oluk a konzolra. Ha valahol arra
vagyunk k��v�ancsiak, hogy mi megy kereszt�ul egy streamen, akkor a k��v�ant helyre be kell
illeszteni ezt a modult, �es fut�as k�ozben elemezni kell az eredm�enyeket.
#include <sys/types.h>
#include <sys/stream.h>
#include <sys/cmn_err.h>
#define NULL ((char *)(0))
158 FEJEZET 8. A UNIX SYSTEM V STREAMS PROGRAMOZ�ASA
#define P_FELFELE 1
#define P_LEFELE 2
#define L_EGYSOR 16
extern nulldev();
static int dbugwrite(), dbugopen(), dbugclose();
static dumpmsg();
static struct module_info modinfo =
/* A stream queue jellemzoit irja le */
{ 0xa1, /* Modulazonosito szam */
"dbug", /* Modul neve */
0, /* Minimalis message-meret */
INFPSZ, /* Maximalis message-meret - INFPSZ=vegtelen */
0, 0 /* High; low water mark; 0=nincs ellenorzes */
};
static struct qinit dbugwinit =
/* "write" queue - lefele haladnak rajta az adatok */
{ dbuglput, /* Lefele meno adatok feldolgozasa */
nulldev, /* Service procedure */
dbugopen, /* open-nel ill. PUSH-nal meghivott rutin - comment */
dbugclose, /* utolso close-nal vagy pop-nal vegrehajtva - comment */
nulldev, /* admin bejegyzes (csak a 3bnet-hez kell) */
&modinfo, /* Modulinformacios struktura */
NULL /* Statisztikakat tartalmazo tablazat */
};
static struct qinit dbugrinit =
/* "read" queue - felfele haladnak rajta az adatok */
{ dbugfput, /* Felfele meno adatok feldolgozasa */
nulldev, /* Service proc. nincs */
dbugopen, /* open-nel, PUSH-nal meghivott rutin */
dbugclose, /* utolso close-nal vagy pop-nal meghivott r. */
nulldev, /* admin bejegyzes */
&modinfo, /* Modulinformacios struktura */
NULL /* Statisztikakat tartalmazo tablazat cime */
};
struct streamtab dbuginfo =
/* A kernel ez alapjan tud tajekozodni a driverben */
{ &dbugrinit, /* Read queue-rol informaciok */
&dbugwinit, /* Write queue-rol informaciok */
NULL, /* Multiplexer read queue */
NULL /* Multiplexer write queue */
};
8.2. A STREAMS DRIVEREK FEL�EP��T�ESE 159
static int dbugfput(q,mp) /* "put" rutin - felfele */
queue_t *q; /* Pointer a WRITE-queue-ra */
mblk_t *mp; /* Az adatra pointer */
{
dumpmsg(P_FELFELE,mp); /* Hexa dump */
putnext(q, mp); /* A megkapott uzenet tovabbitasa */
}
static int dbuglput(q,mp) /* "put" rutin - lefele */
queue_t *q; /* Pointer a WRITE-queue-ra */
mblk_t *mp; /* Az adatra pointer */
{
dumpmsg(P_LEFELE,mp); /* Hexa dump */
putnext(q, mp); /* A megkapott uzenet tovabbitasa */
}
static int dbugopen(q, dev, flag, sflag)
queue_t *q;
dev_t dev;
int flag,sflag;
{
return 0; /* Minden O.K. */
}
static int dbugclose(q)
queue_t *q;
{
return 0; /* Minden O.K. */
}
static dumpmsg(qdirection,mp)
int qdirection; /* Melyik iranyba megy az uzenet? */
mblk_t *mp; /* Az adatra pointer */
{ mblk_t *aktmess; /* Az aktualis uzenet */
register unsigned char *mitki; /* A kiirando karakterre pointer */
int kiirtak; /* Egy sorba mennyi karaktert irt ki */
aktmess=mp; /* Feltehetjuk, hogy nem NULLpointer */
if (qdirection == P_LEFELE) cmn_err(CE_NOTE,"LEFELE: ");
if (qdirection == P_FELFELE) cmn_err(CE_NOTE,"FELFELE: ");
kiirtak=0; /* Eddig a sorba egy karaktert sem raktunk ki */
while (aktmess != NULL) {
mitki=aktmess->b_rptr; /* Az adatterulet kezdete */
while (mitki < aktmess->b_wptr) { /* Adatterulet vege */
cmn_err(CE_CONT," 0x%b", *mitki);
kiirtak=kiirtak+1;
160 FEJEZET 8. A UNIX SYSTEM V STREAMS PROGRAMOZ�ASA
mitki=mitki+1;
if (kiirtak == L_EGYSOR) { /* Betelt egy sor */
kiirtak=0;
cmn_err(CE_CONT," \n");
}
}
aktmess=aktmess->b_cont; /* Folytatast is ... */
}
}
8.2.12 Flush kezel�ese a driverben
Az M FLUSH �uzenetet minden olyan STREAMS modulnak �es drivernek kezelnie kell,
amely service rutint haszn�al. Az ilyen t��pus�u �uzenetek indulhatnak a stream-fejt}ol,
valamelyik modult�ol vagy a drivert}ol. Az �uzenethez tartoz�o adatblokk els}o byteja a
k�ovetkez}o �ert�ekeket tartalmazhatja :
� FLUSHR : A read queuet kell �ur��teni.
� FLUSHW : A write queuet kell �ur��teni.
� FLUSHRW : Mind a read, mind a write queuet �ur��teni kell.
A driverekben az M FLUSH �uzenetek tov�abb��t�as�ara a k�ovetkez}o szab�alyok vonatkoznak:
ha egy M FLUSH �uzenet �er a driverhez, �es csak a FLUSHW ag van be�all��tva, akkor
a driver eldobhatja az �uzenetet. Ha pedig az �uzenetben be van �all��tva az, hogy a read
queuet �ur��teni kell, akkor a drivernek t�or�olnie kell azt a r�eszt, amely arra utal, hogy a read
queuet �ur��teni kell, �es ��gy kell visszak�uldeni az �uzenetet a read queuera. A stream-fejn�el
minden pontosan az ellenkez}ok�eppen t�ort�enik: ha a read queuen f�olfel�e olyan M FLUSH
�uzenet �erkezik, melyben csak a FLUSHR ag van be�all��tva, akkor a stream-fej eldobja
az �uzenetet. Ha pedig az �uzenet arra utal, hogy a write queuet �ur��teni kell, akkor az erre
utal�o ag t�or�olve lesz, �es a stream-fej az �uzenetet visszak�uldi a write queuen.
8.3 Egy STREAMS loopback driver
Az eddig bemutatott driverek nagyon egyszer}uek voltak. Ezek seg��ts�eg�evel meg lehetett
�erteni, hogy hogyan illeszkednek a kernelbe a driverek, de a debug modul kiv�etel�evel kev�es
haszna van ezeknek a moduloknak. Ebben a fejezetben bemutatunk egy olyan STREAMS
drivert, amelynek a feladata az, hogy a write queuen fel�ulr}ol �erkez}o adatokat visszak�uldje
a read queuen. A k�ovetkez}okben az egyes fejezetek a driver egy-egy r�esz�et mutatj�ak be,
�es az eddig m�eg nem ismertetett, de l�enyeges dolgok meg lesznek magyar�azva, �es egyben
p�eld�at l�athatunk arra, hogy hogyan kell az M FLUSH �uzeneteket a drivereknek kezelni.
A driver bels}o neve lpbk lesz.
8.3.1 Driver interface struktur�ak
#include <sys/types.h>
#include <sys/stream.h>
#include <sys/cmn_err.h>
8.3. EGY STREAMS LOOPBACK DRIVER 161
#include <sys/errno.h>
#include <sys/sysmacros.h>
#define NULL ((char *)(0))
extern nulldev();
static int lpbkwrite(), lpbkopen(), lpbkclose(), lpbkserv();
static struct module_info modinfo =
/* A stream queue jellemzoit irja le */
{ 0, /* Modulazonosito szam */
(char *)0, /* Modul neve */
0, /* Minimalis message-meret */
INFPSZ, /* Maximalis message-meret */
1024, 512 /* High; low water mark; 0=nincs ellenorzes */
};
static struct qinit lpbkwinit =
/* "write" queue - lefele halado uzenetek queueja */
{ putq, /* A message megy a service rutinnak */
lpbkserv, /* Service procedure */
lpbkopen, /* open-nel meghivott rutin */
lpbkclose, /* utolso close-nal lesz vegrehajtva */
nulldev, /* admin bejegyzes (csak a 3bnet-hez kell) */
&modinfo, /* Modulinformacios struktura */
NULL /* Statisztikakat tartalmazo tablazat */
};
static struct qinit lpbkrinit =
/* "read" queue */
{ nulldev, /* Message feldolgozasa */
lpbkserv, /* Service procedure */
lpbkopen, /* open-nel meghivott rutin */
lpbkclose, /* utolso close-nal meghivott rutin */
nulldev, /* admin bejegyzes */
&modinfo, /* Modulinformacios struktura */
NULL /* Statisztikakat tartalmazo tablazat cime */
};
struct streamtab lpbkinfo =
/* A kernel ez alapjan tud tajekozodni a driverben */
{ &lpbkrinit, /* Read queue-rol informaciok */
&lpbkwinit, /* Write queue-rol informaciok */
NULL, /* Multiplexer read queue */
NULL /* Multiplexer write queue */
};
Itt �erdemes megjegyezni azt, hogy ha a driver valamelyik queueja tartalmaz service
162 FEJEZET 8. A UNIX SYSTEM V STREAMS PROGRAMOZ�ASA
rutint, �es a put rutin azon a queuen nem csin�alna semmit az �uzenettel, csak tov�abbadn�a,
akkor az ahhoz a sorhoz tartoz�o qinit struktur�aban put rutink�ent jegyezz�uk be a putq()
kernel seg�edrutint. Itt kihaszn�altuk azt, hogy a putq() egy f�uggv�eny, �es nemmakro, ez�ert
a mem�oriabeli c��m�ere hivatkozhatunk.
8.3.2 Tov�abbi deklar�aci�ok
Az lpbk struktura az egyes minor deviceok aktu�alis �allapot�at tartalmazza. Ennek �ert�ekei
a k�ovetkez}o lehet :
� LPBKOPEN : A minor device m�ar meg van nyitva.
struct lpbk {
unsigned lpbk_state; /* minor device aktualis allapota */
queue_t *lpbk_rdq; /* a minor devicehoz tartozo queue */
};
/* A minor deviceok allapotat leiro konstansok */
#define LPBKOPEN 01
#define NLPBK 16 /* Maximalisan kezelheto minor deviceok szama */
struct lpbk lpbkmdev[NLPBK]; /* Itt vannak az minor deviceok adatai */
/* A minor deviceok szama van itt elrakva */
int lpbkcnt = NLPBK;
/* Loopback driver ioctl kodok */
#define I_NOARG 65
#define I_ERRNAK 66
#define I_ERROR 67
#define I_SETHANG 68
8.3.3 Loopback driver start rutinja
A driver adatstruktur�ait a UNIX rendszer bet�olt�es�en�el inicializ�alni kell. Erre val�o a
device driverek start rutinja. A start rutin nem a STREAMS driverek specialit�asa -
minden drivernek lehet ilyen rutinja. A driver�unkn�el ez a k�ovetkez}ok�eppen n�ez ki:
lpbkstart() /* Nem lehet statikus! */
{
int i;
for (i=0;i<NLPBK;i++) {
lpbkmdev[i].lpbk_state=0;
lpbkmdev[i].lpbk_rdq =NULL;
8.3. EGY STREAMS LOOPBACK DRIVER 163
}
}
Azt a kon�gur�aci�os �leokba is be kell jegyezni, hogy a driverhez egy start rutin is tar-
totik. A device driverekhez tartozhat m�eg inicializ�al�o �ugynevezett init rutin is. A start
�es az init rutin k�ozt a k�ul�onbs�eg az, hogy az init rutin a kernel mem�oria menedzser�enek
(KMA - kernel memory allocator) elindul�asa el}ott lesz v�egrehajtva, ��gy csak a k�uls}o
hardware berendez�es inicializ�al�as�ara haszn�alhat�o. Ezzel szemben a start rutin m�ar a
KMA elindul�asa ut�an lesz v�egrehajtva.
8.3.4 Loopback driver open rutin
lpbkopen(q, dev, flag, sflag)
queue_t *q;
dev_t dev;
int flag,sflag;
{
struct lpbk *mdevp; /* Aktualis minor device strukturara pointer */
if ((sflag != CLONEOPEN) && (sflag != 0))
return(OPENFAIL); /* Csak CLONEOPEN megengedett */
/* Keresni kell egy nem hasznalt minor device numbert */
if (sflag == CLONEOPEN) {
for (dev = 0; dev < lpbkcnt; dev++)
if (!(lpbkmdev[dev].lpbk_state & LPBKOPEN)) /* Ha nem nyitott */
break; /* ... akkor ez kell nekunk */
}
if (sflag == 0) dev=minor(dev);
if ((dev < 0) || (dev >= lpbkcnt)) /* Van meg szabad minor device? */
return(OPENFAIL); /* NINCS ... */
mdevp = &lpbkmdev[dev];
if (!(mdevp->lpbk_state & LPBKOPEN)) {
mdevp->lpbk_rdq = q; /* Ez egy tetsz. felhasznaloi struktura */
q->q_ptr = (caddr_t)mdevp;
WR(q)->q_ptr = (caddr_t)mdevp;
return(dev);
}
else
if (q != mdevp->lpbk_rdq)
return(OPENFAIL); /* Valaki mar megnyitotta es */
/* meg dolgozik ezen a streamen */
}
8.3.5 Loopback driver close rutin
lpbkclose(q)
164 FEJEZET 8. A UNIX SYSTEM V STREAMS PROGRAMOZ�ASA
queue_t *q;
{
/* Allitsuk be, hogy a queue mar nincs hasznalva */
((struct lpbk *)(q->q_ptr))->lpbk_state &= \verb! !LPBKOPEN;
((struct lpbk *)(q->q_ptr))->lpbk_rdq = NULL;
flushq(WR(q), 1);
}
8.3.6 Loopback driver service rutin
A loopback driver service rutinja visszak�uldi az M DATA, M PROTO, M PCPROTO
�uzeneteket, az M IOCTL �uzenetekben megkapott "parancsokat" v�egrehajtja, kezeli az
M FLUSH �uzeneteket, �es az egy�eb �uzeneteket eldobja. Az M IOCTL �uzenetek feldol-
goz�as�at egy k�ul�on elj�ar�as v�egzi.
lpbksrv(q)
queue_t *q;
{
mblk_t *bp;
/* A q pointer mindenkeppen a write queuera mutasson */
q = ((q)->q_flag&QREADR ? WR(q) : q);
while ((bp = getq(q)) != NULL) {
if ((bp->b_datap->db_type) < QPCTL && !canput(RD(q)->q_next) ) {
putbq(q, bp); /* Nincs hely az alacsony priotitasu uzenetnek */
return;
}
switch(bp->b_datap->db_type) {
case M_IOCTL: /* ioctl uzenetek */
lpbkioctl(q, bp);
break;
case M_DATA:
case M_PROTO:
case M_PCPROTO:
qreply(q, bp); /* Vissza a masik queuen */
break;
case M_FLUSH:
if (*bp->b_rptr & FLUSHW) {
flushq(q, FLUSHALL);
*bp->b_rptr &= \verb! !FLUSHW;
}
if (*bp->b_rptr & FLUSHR)
qreply(q,bp);
else freemsg(bp);
break;
8.3. EGY STREAMS LOOPBACK DRIVER 165
default:
freemsg(bp);
break;
}
}
}
lpbkioctl(q, bp)
queue_t *q;
mblk_t *bp;
{
struct iocblk *iocbp;
iocbp = (struct iocblk *)bp->b_rptr;
switch(iocbp->ioc_cmd) {
case I_NOARG:
/*
* Minden OK, csak kuldjunk vissza egy visszajelzo uzenetet
*/
bp->b_datap->db_type = M_IOCACK;
qreply(q, bp);
return;
case I_ERROR:
/*
* Hibakodot is adjunk vissza
*/
iocbp->ioc_error = EPERM;
bp->b_datap->db_type = M_IOCACK;
qreply(q, bp);
return;
case I_ERRNAK:
/*
* Negativ visszajelzest kell generalni ...
*/
iocbp->ioc_error = EPERM;
bp->b_datap->db_type = M_IOCNAK;
qreply(q, bp);
return;
case I_SETHANG:
/*
* Kuldjunk fel egy visszajelzest, majd egy olyan uzenetet,
* amely M_HANGUP tipusu - be fog "fagyni" a stream.
*/
bp->b_datap->db_type = M_IOCACK;
qreply(q, bp);
putctl(RD(q)->q_next, M_HANGUP);
166 FEJEZET 8. A UNIX SYSTEM V STREAMS PROGRAMOZ�ASA
return;
default:
/*
* Negativ visszajelzes - ismeretlen ioctl hivas miatt
*/
bp->b_datap->db_type = M_IOCNAK;
qreply(q, bp);
return;
}
}
8.3.7 Egy loopback drivert haszn�al�o program
A k�ovetkez}o program bemutatja a loopback driver haszn�alat�at, �es az egyes ioctl h��v�asok
eredm�eny�et is lehet vele tesztelni.
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/stropts.h>
/* Loopback driverben is definialt konstansok */
#define I_NOARG 65
#define I_ERRNAK 66
#define I_ERROR 67
#define I_SETHANG 68
#define IOBS 1024
struct strioctl ioc; /* Ide kerulnek az ioctl hivas opcioi */
main()
{
int fd, work;
char buf[IOBS];
if ((fd=open("/dev/lpbk", O_RDWR, 0777)) == -1) {
perror("nem tudtam megnyitni a device drivert\n");
exit(1);
}
printf("Milyen szoveget kuldjek el a loopback drivernek?");
if ((fgets(buf,IOBS,stdin)) == NULL) {
perror("fgets failed");
exit(1);
}
/* devicera iras es onnan olvasas */
8.3. EGY STREAMS LOOPBACK DRIVER 167
lp_wrt(fd,buf);
lp_read(fd);
/* Device ioctl teszt */
ioc.ic_cmd = I_ERRNAK;
ioc.ic_timout = 0;
ioc.ic_len = 0;
ioc.ic_dp = NULL;
if ((work = ioctl(fd,I_STR,&ioc)) < 0) {
perror("Ioctl rendszerhivas sikertelen");
}
printf("Visszateresi ertek ioctl rendszerhivasbol: %d\n",work);
lp_wrt(fd,buf);
lp_read(fd);
close(fd);
}
lp_wrt(fd, s)
int fd;
char *mit;
{
if (write(fd,mit,IOBS) < 0) {
perror("Hiba a wite rendszerhivasnal");
exit(1);
}
}
lp_read(fd)
int fd;
{
char retbuf[IOBS];
if (read(fd,retbuf,IOBS) < 0) {
perror("Hiba a read rendszerhivasnal");
exit(1);
}
printf("A beolvasott szoveg:%s\n",retbuf);
}
Megjegyz�es: ne becs�ulj�uk le a loopback driver lehet}os�egeit! Ezzel lehet}os�eg ny��lik p�eld�aul arra, hogy
egy exec rendszerh��v�as v�egrehajt�asa el}ott a r�a elk�uld�ott adatokat az exec rendszerh��v�assal v�egrehajtott �uj
program megkapja. (Ez azon m�ulik, hogy az exec nem z�ar le minden �ledeszkriptort automatikusan, �es a
STREAMS rendszer teljes eg�esz�eben a UNIX kernelen bel�ul helyezkedik el.) A STREAMS-nek ezt a tula-
jdons�ag�at haszn�alt�ak ki akkor, amikor az ATT UNIX System V rendszeren a Berkeley sockets-eket imple-
ment�alt�ak.
(STREAMS alap�u device driverek fejleszt�es�en�el ez a driver �es a kor�abban bemutatott "debug" modul nagyon
nagy seg��ts�eg!)
168 FEJEZET 8. A UNIX SYSTEM V STREAMS PROGRAMOZ�ASA
8.4 Multiplexer driverek
Az eddig le��rtakon k��v�ul gyakran sz�uks�eg van arra, hogy az azonos helyr}ol j�ov}o ada-
tokat ne mindig ugyanazon az �uton tov�abb��tsuk, hanem az adat jelleg�et}ol f�ugg}oen
(p�eld�aul a benne t�arolt protokoll-inform�aci�ok alapj�an) m�as-m�as ir�anyba tov�abb��tsuk.
Ez gyakran sz�uks�eges p�eld�aul h�al�ozati protokollok k�esz��t�es�en�el. Erre a STREAMS
term�eszetesen lehet}os�eget ad, �es ezt a lehet}os�eget nevezz�uk multiplexel�esnek. A mul-
tiplexel�est a STREAMS rendszerre �ep��tett multiplexer device driverekkel oldhatjuk
meg. (Ezeket a fel�ep��t�es�uk hasonl�os�aga miatt nevezik device drivereknek, de k�uls}o
perif�eri�akkal leggyakrabban nem �allnak k�ozvetlen kapcsolatban.) B�ar a STREAMS egy
teljes eszk�ozt�arat biztos��t multiplexer driverek k�esz��t�es�ere, m�egis gyakran felhaszn�al�oi
szinten implement�alj�ak a multiplexel�est, mivel ��gy a megold�as gyakran egyszer}ubb �es
vil�agosabb.
8.4.1 A multiplexerek elemei
A k�ovetkez}o �abr�an l�athatjuk azokat az elemeket (az eredeti angol nyelv}u nev�ukkel),
amelyekb}ol a multiplexelt streameket lehet �osszerakni.
Many-to-one multiplexer
muxd
One-to-Many multiplexer
muxd
Many-to-Many multiplexer
muxd
A many-to-one multiplexel�es a kl�onol�assal implement�alhat�o. Ez hasznos lehet p�eld�aul
egy termin�alonk�enti t�obbablakos megjelen��t�esn�el, ahol minden egyes fels}o streamhez
k�ul�on-k�ul�on ablak van rendelve. A one-to-many multiplexel�es eset�en egy fels}o streamr}ol
ker�ulnek az adatok az als�o streamek valamelyik�ere. A many-to-many multiplexel�es eset�en
a fels}o streamek valamelyik�en�erkez}o adatok az als�o streamek k�oz�ul valamelyiken ker�ulnek
tov�abb (�es ford��tva).
8.4.2 Egy multiplexer �osszerak�asa
A k�ovetkez}okben l�atni lehet, hogy egy h�al�ozatokn�al is haszn�alhat�o multiplexer kon-
�gur�aci�ot hogyan rakhatunk �ossze. A h�al�ozatokn�al gyakori probl�ema az, hogy egy
csom�opontban lev}o g�epben k�et (k�ul�onb�oz}o) h�al�ozati k�artya van (ez a g�ep k�ot �ossze k�et
alh�al�ozatot). P�eld�aul legyen az egyik egy X.25, a m�asik pedig egy Ethernet k�artya.
Ekkor az internet protokoll feladata az adatok megfelel}o h�al�ozati k�arty�ara k�uld�ese, att�ol
f�ugg}oen, hogy az egyes adatcsomagok rendeltet�esi helye melyik alh�al�ozatban van. Itt
a k�ovetkez}oket csin�alhatjuk : meg kell nyitni az Ethernet �es az X.25 k�artya driver�et
(ezek term�eszetesen STREAMS device driverek; nev�uk legyen rendre /dev/ethernet ill.
/dev/x25), �es meg kell nyitni az internet protokoll multiplexer drivert is (ennek neve
legyen a p�eld�aban /dev/ip). Ezut�an az IP multiplexert �ossze kell kapcsolni (I_LINK
ioctl h��v�assal) a fenti k�et m�asik driverrel. Ennek a C nyelv}u k�odja a k�ovetkez}o :
8.4. MULTIPLEXER DRIVEREK 169
#include <stropts.h> /* Konstansok miatt kell */
#inlcude <fcntl.h>
main() /* STREAMS multiplexer config. */
{
int fdether,fdx25,fdip;
int muxx25,muxether;
/* Driverek megnyitasa : */
if ((fdether=open("/dev/ethernet",O_RDWR)) == -1 )
{ perror("/dev/ethernet"); exit(1); }
if ((fdx25=open("/dev/x25",O_RDWR)) == -1 )
{ perror("/dev/x25"); exit(1); }
if ((fdip=open("/dev/ip",O_RDWR)) == -1 )
{ perror("/dev/ip"); exit(1); }
/* Multiplexer kiepitese : */
if (muxx25=ioctl(fdip,I_LINK,fdx25) < 0)
{ perror("I_LINK ioctl sikertelen"); exit(2); }
if (muxether=ioctl(fdip,I_LINK,fdether) < 0)
{ perror("I_LINK ioctl sikertelen"); exit(2); }
/* Ezutan az also driverek filedesc.-jai lezarhatok */
close(fdether);
close(fdx25);
pause(); /* Mindig fusson, nehogy a rendszer
lezarja a fileokat */
/* Ez nem kell most :
if (ioctl(fdip,I_UNLINK,muxether) < 0)
{ perror("I_UNLINK ioctl sikertelen"); exit(2); }
if (ioctl(fdip,I_UNLINK,muxx25) < 0)
{ perror("I_UNLINK ioctl sikertelen"); exit(2); }
*/
}
Az �osszelinkel�es ut�an az als�o streamek �ledeszkriptorjaikra vonatkoz�o (ez esetben az
fdx25 �es az fdether) b�armilyen �lem}uvelet (a close kiv�etel�evel) hib�aval fog befejez}odni,
vagyis a deszkriptorok haszn�alhatatlanok lesznek, ez�ert �erdemes ezeket lez�arni. Ennek az
is a k�ovetkezm�enye, hogy ha STREAMS modulokat akarunk p�eld�aul az fdx25 �ledeszkrip-
torhoz tartoz�o streamre rakni, akkor azt m�eg az �osszelinkel�es el}ott kell elint�ezni. Ha
ezut�an az IP drivert egy m�asik programb�ol megnyitjuk �es adatcsomagokat ��runk a r�a
vonatkoz�o �ledeszkriptorra, akkor az IP driver ezeket az adatokat sz�etosztja a k�et als�o
driverre. Term�eszetesen az IP drivert �ugy kell meg��rni, hogy felismerje az adatcso-
magokb�ol azok rendeltet�esi hely�et.
8.4.3 Multiplexer ioctl-ek
A k�ovetkez}okben a multiplexerek ki�ep��t�esekor haszn�alt STREAMS ioctl parancsokat, �es
azok param�eterez�es�et ismertetj�uk (ld. ehhez kor�abbi A STREAMS rendszer vez�erl�ese
170 FEJEZET 8. A UNIX SYSTEM V STREAMS PROGRAMOZ�ASA
c��m}u r�eszt) :
� I_LINK : �Osszekapcsol k�et streamet, ahol fd param�eter �ert�eke a multiplexer driver
streamj�enek a �ledeszkriptorj�at tartalmazza, az arg param�eter pedig a multiplexer
driverhez kapcsoland�o stream �ledeszkriptorj�at tartalmazza. Sikeres v�egrehajt�as
eset�en a h��v�as egy multiplexer ID �ert�ekkel t�er vissza, amit a multiplexer kon-
�gur�aci�o le�ep��t�esekor kell megadni, sikertelen v�egrehajt�as eset�en -1-et ad vissza.
Hiba eset�en az errno v�altoz�o lehets�eges �ert�ekei :
{ EINVAL : Az fd stream nem multiplexelhet}o, vagy valami egy�eb okb�ol nem
v�egrehajthat�o az �osszek�ot�es (ld. err}ol r�eszletesebben a streamio(7) le��r�ast).
{ EAGAIN : A v�egrehajt�askor �epp nem volt elegend}o mem�oria.
{ ENXIO : Hangup-ot kapott az fd-vel megadott stream.
{ ETIME : Timeout. Hi�aba v�art a rendszer a multiplexer driver visszajelz�es�ere.
Visszajelz�es nem �erkezett a multiplexert}ol, pedig kellett volna.
Megjegyz�es: az �osszelinkel�es �ugy t�ort�enik, hogy a multiplexer driver streamtab struktur�aj�aban megadott
lower write illetve read queue inform�aci�ok be��r�odnak a driver al�a linkelt stream stream-fej struktur�aj�aba.
Ha alulr�ol egy �uzenet el�erkezik a driver al�a belinkelt stream-fejhez, akkor az �uzenetet megkapja a lower
read queue put rutinja, ami majd tov�abbadhatja azt valamelyik fels}o queuera.
� I_UNLINK : Sz�etkapcsol egy el}oz}oleg I_LINK h��v�assal �osszekapcsolt multiplexer
kon�gur�aci�ot. Itt az fd param�eter a multiplexerhez kapcsolt stream (multi-
plexer oldal�ar�ol n�ezve) �ledeszkriptorj�at, az arg param�eter pedig az el}oz}o pont-
ban eml��tett multiplexer ID-et tartalmazza. (Ha a multiplexel�est l�etrehoz�o pro-
gram fut�asa befejez}odik, akkor minden �altala l�etrehozott multiplexer kapcsolat
automatikusan megsz}unik.) Sikertelen v�egrehajt�as eset�en -1-et ad vissza. Hiba
eset�en az errno v�altoz�o lehets�eges �ert�ekei :
{ EINVAL : Rossz param�etereket adtunk meg fd-ben vagy arg-ban (ld. err}ol
r�eszletesebben a streamio(7) le��r�ast).
{ ENOSR : A v�egrehajt�askor �epp nem volt elegend}o mem�oria (a STREAMSnek
fenntartott mem�oriater�uleten).
{ ENXIO : Hangup-ot kapott az fd-vel megadott stream.
{ ETIME : Timeout. Hi�aba v�art a rendszer a multiplexer driver visszajelz�es�ere.
Visszajelz�es nem �erkezett a multiplexert}ol, pedig kellett volna.
8.4.4 Input/Output esem�enyek �gyel�ese
A STREAMS rendszer �es a UNIX kernel lehet}os�eget ad t�obb stream egyidej}u �gyel�es�ere
is (ez l�enyeg�eben m�as oper�aci�os rendszerek polling lehet}os�egeinek felel meg). Fontos
ehhez egyr�eszt a poll rendszerh��v�as, m�asr�eszt az I_SETSIG STREAMS ioctl h��v�as.
Szinkron I/O polling
A poll rendszerh��v�as haszn�alatakor a programban meg kell adni a �gyelend}o streamek
�ledeszkriptorjait, �es azt, hogy milyen esem�enyre kell v�arni, �es mennyi id}o m�ulva
k�ovetkezzen be a timeout. A rendszerh��v�as kiad�asa ut�an a program fut�asa le�all addig,
8.4. MULTIPLEXER DRIVEREK 171
am��g a timeoutk�ent megadott id}o letelik vagy valamelyik kijel�olt esem�eny bek�ovetkezik.
Szintaxisa :
#include <stropts.h>
#include <poll.h>
int poll(fds,nfds,timeout)
struct pollfd fds[];
unsigned long nfds;
int timeout;
Az egyes param�eterek jelent�ese a k�ovetkez}o :
� fds : Strukturat�omb, amelynek minden egyes eleme megadja egy �gyelend}o stream
�ledeszkriptorj�at, a �gyelend}o esem�enyeket, �es ebbe a t�ombbe ker�ul a visszat�er�es
pillanat�aban �eszlelt esem�eny. A pollfd struktura fel�ep��t�ese a k�ovetkez}o :
int fd; /* Filedeszkriptor */
short events; /* Figyelendo esemenyek */
short revents; /* Eszlelt esemenyek */
Az egyes mez}ok jelent�ese a k�ovetkez}o :
{ fd : Egy megnyitott (�gyelend}o) stream �ledeszkriptorja.
{ events : A �gyelend}o esem�enyeket tartalmaz�o bitmez}o.
{ revents : A visszajelzett esem�enyeket tartalmaz�o bitmez}o.
A �gyel�esre kijel�olhet}o illetve a visszajelzett esem�enyek a k�ovetkez}ok k�oz�ul
ker�ulhetnek ki :
{ POLLIN : Egy �uzenet (nem M_PCPROTO) ker�ult a stream-fej read queuej�anak
az elej�ere. (A visszaadott esem�enyek k�oz�ott ez �es a POLLPRI egyszerre nem
fordulhat el}o.)
{ POLLPRI : Egy magas priorit�as�u �uzenet (M_PCPROTO) ker�ult a stream-fej read
queuej�anak az elej�ere.
{ POLLOUT : A lefel�e men}o streamra lehet ��rni (a rajta lev}o adatok mennyis�ege
m�eg nem �erte el a high water markot).
{ POLLHUP :Nem �gyel�esre kijel�olhet}o esem�eny, csak a visszajelzett esem�enyek
k�ozt fordulhat el}o. Azt jelzi, hogy hangupot kapott a megfelel}o stream.(A
visszaadott esem�enyek k�oz�ott ez �es a POLLOUT egyszerre nem fordulhat el}o.)
{ POLLNVAL : Nem �gyel�esre kijel�olhet}o esem�eny, csak a visszajelzett
esem�enyek k�ozt fordulhat el}o. Azt jelzi, hogy a hozz�a megadott �ledeszkriptor
nem egy megnyitott streamre vonatkozik.
{ POLLERR :Nem �gyel�esre kijel�olhet}o esem�eny, csak a visszajelzett esem�enyek
k�ozt fordulhat el}o. Azt jelzi, hogy egy hiba�uzenet (ld. M_ERROR �uzenett��pus)
�erte el a stream-fejet.
� nfds : Az ellen}orzend}o streamek sz�ama. (Az fds t�omb m�erete.)
172 FEJEZET 8. A UNIX SYSTEM V STREAMS PROGRAMOZ�ASA
� timeout : A msec.-ban megadott timeout-id}o. (Ha ez 0 , akkor a rendszerh��v�as
nem v�arakozik, csak megn�ezi, hogy van-e valami a stream-fejekn�el, ha pedig -1,
akkor nem lesz timeout, a rendszerh��v�as tetsz}olegesen sok�aig fog v�arni.)
A visszat�er�esi �ert�ek jelent�ese a k�ovetkez}o :
� 0 : Timeout.
� x>0 : A visszat�er�esi �ert�ek : x egy pozitiv sz�am, �es megadja, hogy h�any strea-
men t�ort�ent valami. (Vagyis h�any streamnek a revents mez}oje tartalmaz null�at�ol
k�ul�onb�oz}o �ert�eket.)
� -1 : Hiba t�ort�ent. A hiba ok�ar�ol az errno v�altoz�oban tal�alunk inform�aci�ot. Ezek
lehetnek a k�ovetkez}ok :
{ EAGAIN : Valamelyik kernelen bel�uli m}uvelet sikertelen volt, de a h��v�ast
�erdemes m�egegyszer megpr�ob�alni.
{ EFAULT : A param�eterek a fut�o program c��mtartom�any�an k��v�ulre mutatnak.
{ EINTR : A rendszerh��v�as v�egrehajt�asa alatt egy signal �erkezett.
{ EINVAL : Hib�as az nfds param�eter �ert�eke. (Vagy null�an�al kisebb, vagy t�ull�epi
a rendszerben megengedett limitet.)
A k�ovetkez}o program bemutatja a poll rendszerh��v�as haszn�alat�at. A program meg-
nyit k�et streamet, az egyiket az Ethernet h�al�ozati driverhez,a m�asikat pedig az X.25
kontrollerhez, majd mindk�et streamen adatokra v�ar. Ha az egyik streamen adatot kap,
akkor az ott bej�ov}o adatokat a m�asik streamen elk�uldi lefel�e. A programban az open
rendszerh��v�asn�al az O_NDELAY ag azt jelzi, hogy ha a write rendszerh��v�as nem tudja
a sz�uks�eges mennyis�eg}u adatot a drivernek elk�uldeni, akkor a write ne blokkoljon. A
p�eldaprogramban ha a write rendszerh��v�as nem tud minden adatot vissza��rni, akkor a
felhaszn�al�o hibakezel}o rutinja usrherr() lesz megh��vva.
#include <fcntl.h>
#include <poll.h>
main()
{
struct pollfd pollfds[2];
char buf[1024];
int count, i;
if ((pollfds[0].fd = open("/dev/ethernet", O_RDWR | O_NDELAY)) < 0) {
perror("open /dev/ethernet sikertelen");
exit(1);
}
if ((pollfds[1].fd = open("/dev/x25", O_RDWR | O_NDELAY)) < 0) {
perror("open /dev/x25 sikertelen");
exit(2);
}
pollfds[0].events = POLLIN;
8.4. MULTIPLEXER DRIVEREK 173
pollfds[1].events = POLLIN;
while (1) {
if (poll(pollfds, 2, -1) < 0) {
perror("poll rendszerhivas sikertelen");
exit(3);
}
for (i=0;i<2;i++) {
switch (pollfds[i].revents) {
case 0 : /* Semmi sem volt */
break;
case POLLIN : /* Adat erkezett, kuldjuk vissza */
while ((count = read(pollfds[i].fd, buf, 1024)) > 0)
if (write(pollfds[1-i].fd,buf,count) != count)
usrherr();
break;
default:
perror("Erre az esemenyre nem szamitottam!");
exit(4);
break;
} /* switch */
} /* for */
} /* while */
} /* main */
usrherr()
{
...
}
Aszinkron I/O polling - ioctl
A poll rendszerh��v�as mialatt egy esem�enyre v�ar, addig a rendszerh��v�ast kiad�o program
fut�asa gyakorlatilag felf�uggeszt}odik. N�eha ez nem megengedhet}o. Ekkor haszn�alhatjuk
az I_SETSIG STREAMS ioctl rendszerh��v�ast. Ez a h��v�as arra utas��tja a kernelt, hogy
ha adat �erkezik a megadott �ledeszkriptor�u stream stream-fej�ehez, akkor gener�aljon egy
SIGPOLL signalt.
A STREAMS ioctl harmadik param�etere (kor�abban ezt arg jel�olte) tartalmazza azokat az
esem�enyeket, amelyek bek�ovetkez�esekor signalt kell gener�alni. Ez a bitmez}o a k�ovetkez}o
�ert�ekek �osszerak�as�ab�ol �allhat (az �osszerak�as itt a bitenk�enti VAGY m}uveletet jelenti) :
� S_INPUT : Egy alacsony priorit�as�u �uzenet (nem M_PCPROTO) �erkezett az addig �ures
read queuera.
� S_HIPRI : Egy magas priorit�as�u �uzenet (M_PCPROTO) �erkezett a stream read
queuej�ara.
� S_OUTPUT : A stream-fejt}ol lefel�e indul�o write queue m�ar nincs tele - lehet r�a ada-
tokat ��rni.
174 FEJEZET 8. A UNIX SYSTEM V STREAMS PROGRAMOZ�ASA
� S_MSG : Olyan STREAMS �uzenet �erkezett a stream-fejhez, amelynek az a feladata,
hogy SIGPOLL sign�alt k�uldj�on a programnak.
Ha az arg param�eter �ert�eke: 0, akkor a program ezut�an nem kap a kernelt}ol SIGPOLL
signalokat. Hiba eset�en az errno v�altoz�o lehets�eges �ert�ekei :
� EINVAL : Az arg param�eter �ert�eke hib�as. Ez a helyzet akkor is, ha az �ert�eke nulla,
de a nulla �ert�ek nem v�altoztatna a jelenlegi �allapoton.
� EAGAIN : Pillanatnyilag nincs el�eg STREAMS er}oforr�as (mem�oria) a h��v�as
v�egrehajt�as�ahoz, de a h��v�ast �erdemes megism�etelni, h�atha siker�ulni fog.
8.5 A kernel seg�edrutinjai
A k�ovetkez}okben ismertetett kernelrutinok a device driverek fejleszt�es�en�el j�ol fel-
haszn�alhat�ok. Vannak egy�eb kernel rutinok is (az itt felsoroltakon k��v�ul), de azoknak egy
r�esz�et az ATT a k�es}obbi UNIX v�altozatokn�al nem biztos, hogy tov�abbra is t�amogatni
fogja.
8.5.1 STREAMS-speci�kus h��v�asok
Az ebben a fejezetben ismertetett kernel rutinokat kiz�ar�olag STREAMS device driverek-
ben haszn�aljuk. R�eszben az�ert, mert csak a STREAMS queuekon tudunk vel�uk dolgozni,
r�eszben pedig az�ert, hogy STREAMS driverjeink �es moduljaink hordozhat�oak legyenek.
allocb - lefoglal egy �uzenetblokkot
struct msgb *
allocb(size)
register int size;
Ez a f�uggv�eny lefoglal egy �uzenetblokkot a STREAMS adatter�uleten, amelynek a
m�erete legal�abb size byte. Az �uzenet t��pusa M_DATA lesz (ezt a programban k�es}obb meg
lehet v�altoztatni). Ha nincs el�eg mem�oria, akkor az eredm�eny egy NULL pointer.
bufcall - h��vj meg egy elj�ar�ast, ha lesz szabad mem�oria
int bufcall(size, func, arg)
int size;
void (*func)();
long arg;
Ezzel az elj�ar�assal lehet k�erni a kernelt}ol p�eld�aul egy sikertelen allocb() h��v�as ut�an,
hogy ha felszabadul egy legal�abb size m�eret}u mem�oriater�ulet (STREAMS �uzenetek
sz�am�ara), akkor h��vja meg a func param�eterben megadott f�uggv�enyt arg param�eterrel
(ez a (*func)(arg); f�uggv�enyh��v�ast jelenti majd). Ha a kernel a k�er�es�unket tudom�asul
vette, akkor a f�uggv�eny visszat�er�esi �ert�eke 1 lesz, ha ezt a k�er�es�unket visszautas��totta,
akkor 0 lesz a f�uggv�eny visszat�er�esi �ert�eke.
FONTOS: Ha a megadott elj�ar�ast a kernel k�es}obb majd megh��vja, akkor sem lesz
8.5. A KERNEL SEG�EDRUTINJAI 175
garant�alva az, hogy az allocb() h��v�assal tudunk egy megadott m�eret}u ter�uletet
lefoglalni, ugyanis a kernelben m�asoknak is sz�uks�eg�uk lehet mem�ori�ara, �es lehet p�eld�aul
az, hogy az �epp felszabadult mem�ori�at egy nagyobb priorit�as�u driver lefoglalja el}ol�unk.
Megjegyz�es: nagyon gondoljuk meg, hogy mikor haszn�aljuk ezt a kernel rutint, mert ezt a h��v�asi ig�enyt a
Release 3.2 UNIX rendszerekben m�eg nem tudjuk visszamondani. A vesz�ely abban van, hogy el}o�allhat az a
helyzet, hogy egy STREAMS deviceot m�ar lez�artunk, esetleg a queueja m�ar m�as devicenak le lett foglalva, �es
csak ezut�an lesz valamikor megh��vva a megadott f�uggv�eny ...
Ezt a hi�anyoss�agot az ATT is �eszrevette, ez�ert a Release 4.0 UNIX rendszerben m�ar van az unbufcall() kernel
rutin, amellyel egy kor�abban bejegyzett �es a kernel �altal elfogadott bufcall() h��v�as hat�astalan��that�o.
canput - van-e el�eg hely a streamben
int canput(q)
register queue_t *q;
Ez a f�uggv�eny ellen}orzi, hogy van-e m�eg hely a q message queueban. Ha a q queue-
nak nincs service rutinja, akkor a canput() f�uggv�eny megkeresi az adott streamen soron
k�ovetkez}o legels}o olyan modult, amelynek van service rutinja. (Ha nem tal�al ilyen mod-
ult, akkor a keres�es a stream v�eg�en fejez}odik be.) V�eg�ul ha m�eg f�er valami a q queueba,
akkor a f�uggv�eny visszat�er�esi �ert�eke: 1 - ekkor lehet �ujabb �uzenetet rakni a queuera, ha
a queue betelt, akkor pedig 0 a visszat�er�esi �ert�ek, �es ekkor a h��v�o blokkolva lesz. (A
blokkol�as azt jelenti, hogy nem ker�ul r�a a fut�asra k�esz service folyamatok list�aj�ara.)
enableok - egy eddig inaktiv queue aktiviz�al�asa
void enableok(q)
queue_t *q;
A feladata egy kor�abban kiadott noenable() f�uggv�eny hat�astalan��t�asa, ami arra
utas��totta a task schedulert, hogy a q queuet iktassa ki. (Ez nem jelenti azt, hogy a
qenable() kernel f�uggv�enyhez hasonl�oan a sor service rutinja egyb}ol v�egre is lesz ha-
jtva!)
ushq - ush m}uvelet egy queuen
void flushq(q,flag)
register queue_t *q;
int flag;
Ez a f�uggv�eny t�or�ol minden messaget a megadott q queueb�ol, �es felszabad��tja az
�uzenetek �altal lefoglalt ter�uletet a freemsg() f�uggv�ennyel. A flag param�eter �ert�eke, �es
ezek hat�asa (ld. <sys/stream.h> include �let) :
� FLUSHDATA : csak az M_DATA, M_PROTO, M_PCPROTO �es az M_DELAY �uzeneteket
dobja el, a t�obbit meghagyja.
� FLUSHALL : Minden �uzenetet kidob a megadott queueb�ol.
176 FEJEZET 8. A UNIX SYSTEM V STREAMS PROGRAMOZ�ASA
freeb - egy darab �uzenetblokk felsz�amol�asa
void freeb(bp)
register struct msgb *bp;
A freeb f�uggv�eny felszabad��tja a bp pointer �altal mutatott �uzenetblokk �altal lefoglalt
mem�oriater�uletet, a hozz�a tartoz�o adatblokkal egy�utt. (Ha a hozz�a tartoz�o az adatblokk
db_ref r�esz�enek �ert�eke 1-n�el nagyobb, akkor csak ez a sz�aml�al�o fog cs�okkenni, a lefoglalt
adatter�ulet nem lesz felszabad��tva.)
freemsg - egy teljes �uzenet felsz�amol�asa
void freemsg(bp)
register mblk_t *bp;
V�egigmegy a megadott message minden egyes �uzenetblokkj�an, �es felszabad��tja (ha
lehet) a message �altal lefoglalt teljes mem�oriater�uletet. Ha ez nem lehet (mert az adat-
blokk db_ref r�esz�enek �ert�eke 1-n�el nagyobb), akkor ez a sz�aml�al�o eggyel cs�okkenni fog.
(A freemsg() f�uggv�eny v�egigmegy a message minden egyes blokkj�an, �es minden egyes
blokkot felszabad��t a freeb() seg��ts�eg�evel.)
getmid - modul id. lek�erdez�ese
ushort getmid(name)
char *name;
A f�uggv�eny eredm�enye a megadott nev}u modul modul azonos��t�o sz�ama. (Ha nincs
ilyen modul, akkor az eredm�eny: 0).
getq - k�ovetkez}o message leszed�ese a queuer�ol
mblk_t *getq(q)
register queue_t *q;
Leszedi a k�ovetkez}o �uzenetet (ha van) a q message queuer�ol. A f�uggv�eny egy pointert
ad vissza, ami a leszedett message c��m�et tartalmazza. Ha nincs m�ar message a queuen,
akkor a f�uggv�eny visszat�er�esi �ert�eke NULL pointer lesz, �es a rendszer be�all��t a queue
adatstruktur�aj�aban egy QWANTR aget, ami azt jelzi, hogy a queuer�ol olvasni akarnak.
Ha ilyen �allapotban egy �uzenet �erkezik a queuera, akkor a kernel a qenable() f�uggv�eny
megh��v�as�aval automatikusan �ujraind��tja a service rutint.
Ha a getq() rutin leszedett egy �uzenetet a q message queuer�ol, �es ezut�an a queuen
lev}o �uzenetek �osszhossza kisebb, mint a queuehoz megadott low water mark �ert�ek, �es a
queuera m�ar pr�ob�altak kor�abban �uj �uzenetet rakni, de ez sikertelen volt, akkor a q queue
m�og�otti sor service rutinja a qenable() f�uggv�eny megh��v�as�aval �ujra el lesz ind��tva.
noenable - queue inaktiviz�al�asa
void noenable(q)
queue_t *q;
8.5. A KERNEL SEG�EDRUTINJAI 177
A megadott q queuet inaktiv �allapotba hozza - a STREAMS service scheduler
nem adja ennek a sornak a service rutinj�ara t�obbet a vez�erl�est. (Inverz m}uvelete: az
enableok() f�uggv�eny.)
OTHERQ - megadja a queue p�arj�at
#define OTHERQ(q) ((q)->q_flag&QREADR? (q)+1 : (q)-1)
A makro eredm�enye a q queue p�arj�ara mutat�o pointer. (Ha a q a read queue, akkor az
eredm�eny a hozz�a tartoz�o write queuera mutat�o pointer; ha q egy write queuera pointer,
akkor az eredm�eny a read queuera pointer.)
putctl - kontroll-�uzenet tov�abb��t�asa
int putctl(q, type)
queue_t *q;
int type;
A putctl() f�uggv�eny lefoglal egy �uzenet sz�am�ara az allocb() kernelh��v�as
seg��ts�eg�evel mem�ori�at, az �uzenet t��pus�at be�all��tja a type param�eterben megadottra, majd
megh��vja a q param�eter �altal mutatott queue put rutinj�at. A f�uggv�eny visszat�er�esi �ert�eke
1, ha minden rendben ment. Nulla akkor lehet a visszat�er�esi �ert�ek, ha a rendszer nem
tudott lefoglalni az �uzenetblokk sz�am�ara mem�ori�at, vagy a type param�eter �ert�eke az
M_DATA, M_PROTO, M_PCPROTO, vagy M_DELAY �ert�ekek egyike.
putbq - �uzenet visszarak�asa a sorba
int *putbq(q, bp)
register queue_t *q;
register mblk_t *bp;
A putbq() f�uggv�eny a bp �altal mutatott �uzenetet visszarakja a q �altal mutatott queue
elej�ere. (A queuban legel}obbre ker�ulnek a magas priorit�as�u �uzenetek, a norm�al priorit�as�u
�uzenetek pedig a magas priorit�as�u �uzenetek m�og�e, de a kor�abban m�ar ott lev}o alacsony
priorit�as�u �uzenetek el�e ker�ulnek.) A service rutin soha ne rakjon vissza magas priorit�as�u
�uzenetet a saj�at queuej�aba, mert ez v�egtelen ciklust eredm�enyezne a kernelen bel�ul!
Sikeres v�egrehajt�as eset�en a f�uggv�eny visszat�er�esi �ert�eke: 1, sikertelen v�egrehajt�as eset�en
a visszat�er�esi �ert�ek 0 lesz.
putnext - egy �uzenetet a k�ovetkez}o queuera rak
#define putnext(q,mp) ((*(q)->q_next->q_qinfo->qi_putp)((q)->q_next,(mp)))
A putnext() egy makro, amely a q ut�an k�ozvetlen�ul k�ovetkez}o queue put() rutinj�at
h��vja meg, �es �atadja neki az mp �altal mutatott �uzenetet.
178 FEJEZET 8. A UNIX SYSTEM V STREAMS PROGRAMOZ�ASA
putq - egy megadott �uzenetet valamelyik queuera rakja
int *putq(q, bp)
register queue_t *q;
register mblk_t *bp;
A putq() f�uggv�eny a q param�eterben meghat�arozott queura �atadja az mp �altal mu-
tatott �uzenetet.
qenable - queue aktiviz�al�asa
void qenable(q)
register queue_t *q;
Ez a f�uggv�eny a q param�eter �altal meghat�arozott sort a STREAMS schedulernek arra
a list�aj�ara rakja, amely a fut�asra k�esz sorok adatait tartalmazza. Ez azt jelenti, hogy az
adott queue service rutinja r�ovid id}on bel�ul �ujb�ol futni fog.
qreply - �uzenet visszak�uld�ese ellent�etes ir�anyban
void *qreply(q, bp)
register queue_t *q;
mblk_t *bp;
Ez a f�uggv�eny meghat�arozza a q queue p�arj�at (a lefele men}o streamnek a p�arja a felfel�e
men}o, ill. ford��tva), �es azon a putnext() makro m}uk�od�es�ehez hasonl�oan visszak�uldi a
bp pointer �altal meghat�arozott �uzenetet. Ezt a f�uggv�enyt szokt�ak haszn�alni az M_IOCTL
�uzenetekre k�uldend}o v�alasz visszak�uld�es�ere.
RD - megadja a read queuet
#define RD(q) ((q)-1)
A makro param�etere (q) egy write queuera mutat�o pointer, eredm�enye pedig a q
queue p�arj�ara (vagyis a read queuera) mutat�o pointer. Ez a m}uvelet az�ert ilyen egyszer}u,
mert a kernel a queuekat nem egyenk�ent foglalja le, hanem p�aros�aval. Az alacsonyabb
mem�oriac��men van a read queue, a magasabbon pedig a write queue.
splstr - �at�all��tja az interrupt priorit�asi szintet
#define splstr() spltty()
Az splstr() makro az spltty() kernelh��v�as seg��ts�eg�evel be�all��tja a processzor in-
terrupt priorit�asi szintj�et a STREAMS driverek �es modulok interrupt priorit�asi szintj�ere,
a kritikus szakaszok v�edelme �erdek�eben. Ez azt jelenti, hogy az �eppen fut�o driver
m}uk�od�es�et m�as driverek vagy modulok nem tudj�ak megszak��tani. Ez a rutin visszat�er�esi
�ert�ekk�ent az addigi processzor interrupt priorit�asi szintet adja. A kritikus szakasz v�eg�en
az splx() kernelh��v�as seg��ts�eg�evel vissza kell �all��tani a processzor interrupt priorit�asi
szintj�et az el}oz}o �ert�ekre. Ezt a rutint csak igen indokolt esetben haszn�aljuk! Megje-
gyz�es: az Intel 80386-os UNIX rendszerek eset�en ez �altal�aban IPL=7 szintnek felel meg, �es ekkor sem a soros
8.5. A KERNEL SEG�EDRUTINJAI 179
vonalakr�ol j�ov}o megszak��t�asok, sem az �oramegszak��t�asok nem lesznek megengedve. Mivel a rendszer�ora is le
lesz tiltva, ez�ert csak olyan rutinokat v�edj�unk ��gy, aminek a v�egrehajt�asa nem ig�enyel t�obb id}ot, mint k�et
�orainterrupt k�ozti id}o.
unlinkb - egy �uzenet els}o blokkj�at t�orli
mblk_t *
unlinkb(bp)
register mblk_t *bp;
Az unlinkb() f�uggv�eny elv�alasztja a bp param�eter �altal mutatott �uzenet els}o
�uzenetblokkj�at a m�og�otte l�ev}o blokkokt�ol, �es egy pointert ad vissza az �uzenet meg-
marad�o r�esz�ere. Az eredm�enye NULL pointer lesz, ha nem maradt t�obb �uzenetblokk
az �uzenetben. (Az els}o �uzenetblokk nem lesz automatikusan felszabad��tva, ��gy ez a pro-
gramoz�o feladata marad.)
WR - megadja a write queuet
#define WR(q) ((q)+1)
A WR makro param�etere (q) egy read queuera mutat�o pointer, eredm�enye pedig a q
queue p�arj�ara (vagyis a hozz�a tartoz�o write queuera) mutat�o pointer.
8.5.2 �Altal�anosan haszn�alhat�o kernel rutinok
A k�ovetkez}okben ismertetett kernel h��v�asok mind a hagyom�anyos, mind pedig a
STREAMS device driverek k�esz��t�es�en�el j�ol haszn�alhat�oak. Ezek haszn�alata gyakran
sz�uks�eges, de ronthatj�ak a program hordozhat�os�ag�at. (P�eld�aul a Release 4.0 UNIX
m�odos��tott major/minor device number kezel�ese miatt ha �att�er�unk erre a UNIX rendsz-
erre, akkor m�odos��tani kell a drivereknek azt a r�esz�et, amely a minor() vagy major()
rutinokat haszn�alj�ak. Ez term�eszetesen nem nagy munka - baj csak akkor van, ha ezt
elfelejtj�uk.)
cmn err - driver hiba�uzenetek ki��r�asa konzolra
#include "sys/cmn_err.h"
int cmn_err(severity, format, arguments)
char *format;
int severity, arguments;
Figyelmeztet�es: egy hib�asan megadott severity �ert�ek a rendszert azonnal panic
�allapotba viszi.
Az egyes param�eterek jelent�ese a k�ovetkez}o :
� severity : N�egy k�ul�onb�oz}o �ert�eke lehet a hiba s�ulyoss�ag�at�ol f�ugg}oen :
{ CE_CONT : Ez kb. egy printf() h��v�assal egyen�ert�ek}u - nem ��r az �uzenet el�e
semmit.
180 FEJEZET 8. A UNIX SYSTEM V STREAMS PROGRAMOZ�ASA
{ CE_NOTE : Ki��rja a param�eterekben megadott sz�oveget, egy NOTICE: �uzenetet
k�ovet}oen.
{ CE_WARN : Ki��rja a param�eterekben megadott sz�oveget, egy WARNING: �uzenetet
k�ovet}oen.
{ CE_PANIC : Ki��rja a param�eterekben megadott sz�oveget, egy PANIC: �uzenetet
k�ovet}oen, �es a rendszert panic �allapotba viszi. (Ekkor a UNIX azonnal le�all,
�es egy mem�oria dump ker�ul a swap egys�egre.)
� format : Egy printf()-hez hasonl�o form�atumot lehet itt megadni. A stringben
megadhat�o adatform�atumok :
{ %b : K�et hexadecim�alis sz�amjegy (egy byte)
{ %c : Karakteres
{ %d : El}ojeles decim�alis sz�am
{ %o : El}ojel n�elk�uli okt�alis sz�am
{ %s : String (karakter-pointer)
{ %x : Hexadecim�alis (vezet}o null�akkal egy�utt ��rja ki)
Mez}ohossz megad�asa nem megengedett (p�eld�aul a %9d nem adhat�o meg
form�atumk�ent). Ilyen m�odon nem csak a konzolra ��rhatunk ki hiba�uzenetet. Azt,
hogy a ki��rt �uzenet hova ker�ulj�on,a format param�eterben megadott �uzenet els}o
karaktere hat�arozza meg. Ha ott az els}o karakter egy felki�alt�ojel (vagyis: !), akkor
az �uzenet nem ker�ul ki a konzolra. Egy bels}o bu�erben lesz t�arolva, amit a crash
rendszerprogram seg��ts�eg�evel elemezhet�unk. Ha az els}o karakter egy kalap (vagyis:
^), akkor az �uzenet ki lesz��rva a konzolra, de nem ker�ul bele a fent eml��tett bu�erbe.
Ha ezekt}ol elt�er}o karakterrel kezd}odik az �uzenet, akkor a rendszer mind a konzolra,
mind a bels}o bu�er�ebe ki��rja azt. Ha a severity �ert�ek nem CE_CONT, akkor az
�uzenet ki��r�asa ut�an a rendszer m�eg egy �ujsor karaktert is ki��r, m��g CE_CONT severity
�ert�ek megad�asa eset�en ilyen �ujsor karakter nem lesz automatikusan ki��rva.
Megjegyz�es: A ki��rand�o adatok form�atum�anak megad�asa a k�ul�onb�oz}o UNIX rendszerekben elt�er}o lehet,
ez�ert ha az egyik UNIX rendszerre k�esz�ult STREAMS driver�unket �atvissz�uk egy m�asfajta UNIX rend-
szerre, akkor n�ezz�unk ennek ut�ana a UNIX le��r�asban, nehogy valami ilyen jelleg}u hib�at k�ovess�unk el.
� arguments : Opcion�alis argumentek, amit ezzel a rutinnal ki akarunk iratni. A
format param�eterrel ezek az argumentumok �osszhangban legyenek.
major - megadja a major device numbert
#include "sys/sysmacros.h"
int major(dev)
dev_t dev;
Ez a kernel h��v�as arra szolg�al, hogy az open() rutinnak �atadott major �es minor device
numbert tartalmaz�o param�eterb}ol kinyerje a major device numbert. Megval�os��t�asa egyes
UNIX rendszrekben makroval t�ort�enik. A dev param�eterben leggyakrabban az open()
rutinnak �atadott azonos nev}u param�eter lesz megadva. Megjegyz�es:Az ISC 3.2 UNIX rendszer
alatt a dev t t��pus short integer t��pust jel�ol.
8.6. K�ERD�ESEK 181
minor - megadja a minor device numbert
#include "sys/sysmacros.h"
int minor(dev)
dev_t dev;
A minor() kernel h��v�as arra szolg�al, hogy az open() rutinnak �atadott major �es minor
device numbert tartalmaz�o param�eterb}ol kinyerje a minor device numbert. Megval�os��t�asa
egyes UNIX rendszrekben makroval t�ort�enik.
8.6 K�erd�esek
1. Megv�altozhat-e a bemutatott STREAMS loopback drivern�el az �uzenetek vis-
szaad�asi sorrendje a bemen}o sorrendhez k�epest? Ha megv�altozhat, akkor jelenthet-
e ez probl�em�at mondjuk az Internet Protokoll (IP) implement�al�asakor?
2. M�odos��tsuk a kor�abban bemutatott debug modult �ugy, hogy ne csak az �uzenetek
tartalm�at ��rja ki, hanem minden egyes �uzenet elej�en ��rja ki annak t��pus�at is!
3. A STREAMS loopback driver�unk felfel�e halad�o (read) queuej�anak van egy service
rutinja, �es ahhoz a queuehoz nincs de�ni�alva put rutin. Mikor lesz megh��vva a
service rutin a read queue oldal�ar�ol? (Tan�acs: Gondoljon arra, hogy mit csin�al a
getq() kernel rutin!)
4. Mit gondol, hogy egy I LINK ut�an mi�ert lesz a felhaszn�al�oi program sz�am�ara az
a stream haszn�alhatatlan, amit a multiplexer al�a linkelt�unk? (Tan�acs: Gondolja
meg, hogyan m}uk�odik az I LINK ioctl h��v�as!)
5. B}ov��ts�uk ki a STREAMS loopback driver�unket, hogy modulk�ent is lehessen
haszn�alni!
182 FEJEZET 8. A UNIX SYSTEM V STREAMS PROGRAMOZ�ASA
8.7 Aj�anlott irodalom
� 1. M. Ben-Ari: Principles of Concurrent Programming
Englewood Cli�s, Prentice-Hall International, 1982
A k�onyv kiv�al�o st��lusban alapos bevezet�est ny�ujt a p�arhuzamos programoz�asba. Is-
merteti a gyakrabban haszn�alt szinkroniz�aci�os lehet}os�egeket (szemaforok, �uzenetek
�atad�asa, randev�uk, ...), �es ismertebb p�arhuzamos algoritmusokat is bemutat.
� 2. Stephen R. Bourne: The UNIX System Reading, Addison-Wesley, 1982
A k�onyv egy �altal�anos bevezet�est ny�ujt a UNIX rendszer programoz�as�ahoz, is-
merteti a UNIX k�ornyezetet, amit a felhaszn�al�o a g�ep el�e le�ulve l�at.
� 3. Brian W. Kernighan, Rob Pike: The UNIX Programming Environment Engle-
wood Cli�s, Prentice-Hall, 1984 (Magyarul is megjelent)
A k�onyvben a UNIX rendszerek "k�oz�os r�esze" (Version 7 UNIX) van r�eszletesen
(felhaszn�al�oi �es programoz�oi szempontok szerint) ismertetve. A k�onyvet az�ert
is �erdemes elolvasni, mert n�eh�any angol kifejez�est nagyon lehetetlen m�odon
ford��tottak benne magyarra, �es ez t�obbsz�or is megmosolyogtatja az olvas�ot (azt
persze �en (Cs.B.) is elismerem, hogy n�eh�any kifejez�esnek nagyon neh�ez magyar
ford��t�as�at tal�alni, lehet, hogy n�ehol nekem sem siker�ult megtal�alnom az "igazit").
� 4. Brian W. Kernighan, Dennis Ritchie: The C Programming Language Englewood
Cli�s, Prentice-Hall, 1978
Ez a k�onyv ismerteti a legjobban a C nyelvet (nemcsak a UNIX k�ornyezetben
haszn�alhat�o). A k�onyv megjelent magyarul, �es hasznos mindenki sz�am�ara.
� 5. A. S. Tanenbaum: Operating Systems Design and Implementation Englewod
Cli�s, Prentice-Hall, 1987
A k�onyv bemutatja az oper�aci�os rendszerek fel�ep��t�es�et, a k�ovetkez}o pontokra
bontva: rendszerh��v�asok (Version 7 UNIX alapj�an), processzek, input/output,
mem�oriakezel�es �es a f�ajlrendszerek. Kieg�esz��t�esk�ent benne van egy UNIX-szer}u
oper�aci�os rendszernek a teljes forr�ask�odja kommentekkel �es a tervez�es�en�el megho-
zott d�ont�esekkel �es azok indokl�as�aval egy�utt. (MINIX a rendszer neve).
� 6. A. S. Tanenbaum: Sz�am��t�og�ep-h�al�ozatok Novotrade Kiad�o Kft. - Prentice-Hall
k�oz�os kiadv�any, 1992
A k�onyv az OSI h�al�ozati referenciamodellen kereszt�ul ad el�eg absztrakt modellt a
sz�am��t�og�epes h�al�ozatokr�ol (mind a 7 OSI szintet nagyon r�eszletesen ismertetve). A
magyar fordts itt eg�eszen j�ol olvashat�o. A k�onyv nem t�argyalja nagyon r�eszletesen
az oper�aci�os rendszer �es a h�al�ozati szintek k�oz�otti interf�eszt (mint pl. a socket
rendszer), ez�ert csak ez alapj�an nagyon neh�ez lenne "az els}o" h�al�ozati alkalamz�ast
elk�esz��teni.
� 7. AT&T Bell Labs.: UNIX System V Release 4.0 Programmer's Guide AT&T Bell
Labs.: UNIX System V Release 4.0 Programmer's Reference Manual (Prentice-Hall
kiadv�anyok)
8.7. AJ �ANLOTT IRODALOM 183
A UNIX programoz�oknak ny�ujtott lehet}os�egeit ismertetik. Az el}obbi
"szak�acsk�onyvi" szinten, m��g az ut�obbi a rendszerh��v�asok r�eszletes speci�k�aci�oj�at
tartalmazza. (Ez ut�obbi nem igaz�an olvasm�anyos.)
� 8. Maurice Bach: The Design of the UNIX Operating System Englewood Cli�s,
Prentice-Hall, 1987
Kifejtett t�em�ak (a System V UNIX alapj�an): kernel, bu�er cache, f�ajlrendszerek,
folyamatok, mem�oriakezel�es �es az I/O, �es az IPC.
� 9. Myril Clement Shaw, Susan Soltis Shaw: UNIX Internals (A systems operation
handbook) TAB BOOKS, 1987 ISBN 0-8306-2951-3
Ez a k�onyv is a UNIX oper�aci�os rendszer bels}o fel�ep��t�es�et mutatja be k�ul�onf�ele
szempontokb�ol: ismerteti a f�ajlrendszert, i-node-okat, a UNIX folyamatainak a
fogalm�at, az I/O-t �es az eszk�ozmeghajt�okat. Kieg�esz��t�esk�ent tartalmaz n�eh�any fe-
jezetet, melyben �osszefoglalja a UNIX rendszerh��v�asait, a fontosabb UNIX paranc-
sokat valamint tartalmaz egy r�ovid �osszehasonl��t�ast, melyben az AT&T �es a Berke-
ley UNIX-ot hasonl��tja �ossze.
� 10. S. Le�er, M. McKuisk, M. Karels, J. Quaterman: The Design and Implemen-
tation of the 4.3BSD UNIX Operating System Addison-Wesley, 1989
A k�onyv a 4.3BSD UNIX alapj�an bemutatja a UNIX rendszer fel�ep��t�es�et, sz-
erkezet�et. A k�onyv a t�em�at nagyon r�eszletesen kifejti. A szerz}oi maguk is r�eszt
vettek a 4.3BSD rendszer fejleszt�es�eben.