program ozo paterno sz ter
TRANSCRIPT
-
PROGRAMOZPTERNOSZTER
GNU
FDL
GNU/
Linux
C C
++ J
ava
C# T
CP/IP
COR
BA S
wing
prog
ramoz
s L
inux k
ernel
GTK
+ GN
OME
Swing
Hlz
ati, k
onku
rens,
mobil
, GUI
, ada
tbzis
BtfaiNorbert
Kezdknek s haladknak egyarnt ajnljuk!
Megdobogtatja a programozk szvt!
-
Gp mell
etti fog
yasztsr
a!
PROGRAMOZ PTERNOSZTERhttp://www.inf.unideb.hu/~nbatfai/ProgramozoPaternoszter.pdf
Belps a gpek mess birodalmbaAjnls s vzi
Az anyagot elssorban felsoktatsbeli informatikus hallgatknak ajnljuk. Vzink, hogy a hallgatk a felsoktatsbl napjainkban kikerlve otthonosan dolgoznak C, C++, Java s C# nyelveken, illetve az egyiken s a hozz kapcsold platformon elmlylt tudssal rendelkeznek. A jegyzet egyben a Debreceni Egyetem Informatikai Karnak Opercis rendszerek I., II., Mobil programozs s Hlzatok laborgyakorlatainak anyagt is rgzti. F clja a GNU/Linux rendszerek szeretetnek tadsa s ltalban a UNIX-tpus rendszerek C programozsnak megismertetse, megszerettetse! Tovbb a Java programozs gyakorlsa.
zelt a tartalombl Unix tpus rendszerek hasznlata (felhasznli, rendszergazdai szint; bash
programozs) C rendszerszint (folyamatok; jelek; szlak; IPC stb.) Hlzati programozs (TCP, UDP kliens-szerver; ICMP ping; RPC; Java
RMI; CORBA, Java IDL, ORBit; Web programozs: Java szervletek, PHP; Java Bluetooth, nem blokkold-multiplexelt, prhuzamos s elosztott pldk stb.)
Konkurens programozs (SVr4 szemaforok; POSIX szlak stb.) C kernelszint (Linux 2.6; kernelmodulok; a Proc fjlrendszer stb.)
A C mellett C++, Java s C# nyelv pldk
Mobil programozs (Java ME; Symbian stb.)
GUI programozs (AWT; Swing; GTK+; GNOME; Java-GNOME stb.) Adatbzis programozs (MySQL; PostgreSQL, libpq; JDBC stb.)
Kvantum szmtsok (ksrletek; qubit; teleportci stb.) Bioinformatika (bioqubit; Penrose-Hameroff 'Orch OR' tudatmodell stb.)
C pldaprogramok, forrsok szma: C++ pldaprogramok, forrsok szma: Java pldaprogramok, forrsok szma: C# pldaprogramok, forrsok szma: Kvantum szmtgpes algoritmusok:
KsznetA Debreceni Egyetem Informatikai Karnak [Egyb/IK] PM, IT, PTM, PTI s MI
szakos hallgatinak, hogy az Opercis rendszerek I., II. s a Mobil programozs, illetve a Hlzatok gyakorlatokon lelkes rszvtelkkel katalizltk az anyag ksztst, illetve, hogy az e formban val kzs felhasznls, feldolgozs sorn keletkezett tapasztalatokat vissza tudtam forgatni az anyag rsba. A Solaris-os s Nokia N-Gage, Nokia 6600, 6131 s a LEGO Mindstorms Robotics Invention System, NXT-s s a 64 bites rendszeres pldk kiprblhatsgrt ksznet az EUROSMOBIL-nak [Egyb/EM].
Debreceni Egyetem Informatikai KarBtfai Norbert
[email protected]: 0.0.247, 2006. november 12.
2
4 db 110 db
40 db 7 db 5 db
-
Copyright 2005, 2006, Btfai NorbertE kzlemny felhatalmazst ad nnek jelen dokumentum sokszorostsra,
terjesztsre s/vagy mdostsra a Szabad Szoftver Alaptvny ltal kiadott GNU Szabad Dokumentcis Licenc 1.2-es, vagy brmely azt kvet verzijnak felttelei alapjn. Nem vltoztathat szakaszok: Ajnls s vzi, Ksznet, Szemlyes ajnls, Mott, Elsz, Elfelttelek, Megjegyzs s FIGYELMEZTETS, A szerzrl, Az anyag szervezse, kivve a Platformok s programok pontot. Cmlap szvegek: Programoz Pternoszter, Btfai Norbert. Htlap szvegek: Programoz Pternoszter, Belps a gpek mess birodalmba, Btfai Norbert.
Copyright 2005, 2006, Norbert BtfaiPermission is granted to copy, distribute and/or modify this document under the terms
of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with the Invariant Sections being Ajnls s vzi, Ksznet, Szemlyes ajnls, Mott, Elsz, Elfelttelek, Megjegyzs s FIGYELMEZTETS, A szerzrl, Az anyag szervezse, kivve a Platformok s programok pontot., with the Front-Cover Texts being Programoz Pternoszter, Btfai Norbert, and with the Back-Cover Texts being Programoz Pternoszter, Belps a gpek mess birodalmba, Btfai Norbert.
A GNU Szabad Dokumentcis licenc az albbi cmen olvashathttp://www.gnu.org/copyleft/fdl.html. A magyarra lefordtott vltozata pedig itt elrhet:http://hu.wikipedia.org/wiki/A_GNU_Szabad_Dokumentcis_Licenc_szvege.
A bortlapon Btfai Mtys Bendegz szerepel, 31. hetes korban, 2005 decemberben. A jegyzetben tallhat programokat s brkat a szerz ksztette.
3
-
Szemlyes ajnlsFelesgem pocakjban a programozssal ismerked kisfiamnak, megnyugvssal annak
tudatban, hogy neki ezt fellapozni mr csakis trtneti visszatekints lesz, nem izgalmas kzelmt, jelen s jv, mint pldul nekem.
MottMi a klnbsg a termszettudsok s a hackerek kztt? Ha a termszettudsokat felfedezknek tekintjk, akkor k mennek s
meghdtjk a Mount Everestet. Ha a hackereket tekintjk felfedezknek, akkor k sszehordjk a Mount
Everestet, aztn meghdtjk.
Szervezsi knyvjelzk A jegyzet pldaprogramjainak sszefoglalst lthatjuk a 8.1 oldal, a Programok s
platformok cm pont tblzatban. A jegyzet anyagnak ms laborgyakorlatokhoz val kapcsolhatsgrl olvashatunk a
12. oldalon, a Feldolgozsi javaslatok cm pontban. A jegyzet hasznlathoz fztt figyelmeztetst olvassuk el a 6.oldalon, a
FIGYELMEZTETS pontban. Elgondolkodtat, programoztat krdseket, feladatokat tallunk az 280. oldalon, a
Gondolkodtat, programoztat krdsek cm fejezetben. Megvannak a vlaszok s nmi segtsg is a vlaszok megadshoz a 287. oldalon, a
Vlaszok a programoztat krdsekre cm fejezetben.
Fbb tartalmi knyvjelzk C rendszerszint, 36. oldal.
Folyamatok, 36. oldal. Jelek, 41. oldal. IPC, 46. oldal.
C kernelszint, 173. oldal. Kernelfordts, 173. oldal. Kernel modulok, 174. oldal. Sajt rendszerhvsok, 179. oldal.
1 Ha a jegyzetet nem papron, hanem pdf-ben hasznljuk, akkor az alhzva s dntve szedett hivatkozsokat mint amilyen ez is knnyen tudjuk kvetni az egrrel!
4
bra 1: Btfai Mtys Bendegz 24 hetes korban, 2005.
oktberben
-
Hlzati programozs, 102. oldal. TCP szerver oldal, 102. oldal., TCP kliens oldal, 132. oldal. UDP kliens-szerver, 148. oldal. Tvoli metdushvs, 160. oldal., Java RMI, 161.oldal, CORBA, 164. oldal. Web programozs, 168. oldal. Java Bluetooth, .oldal.
GUI programozs, 182. oldal. GTK+, 190. oldal. GNOME, 200. oldal. Java-GNOME, 201. oldal. Java AWT, 186. oldal. Java Swing, 182. oldal.
Konkurens programozs, . oldal. SysV szemaforok, . oldal. POSIX szlak, 64. oldal.
Adatbzis programozs, 204. oldal. MySQL, 204. oldal. PostgreSQL, 213. oldal.
Mobil programozs, 216. oldal. Java ME, 217. oldal. Symbian C++, . oldal.
$ szint, 262. oldal. # szint, 270. oldal.
Jval rszletesebb s programozsi nyelvenknti tartalmi bontst tallunk az 8. oldal, a Programok s platformok cm pont tblzatban.
Technikai knyvjelzk A jegyzet pldaprogramjainak fordtsa, futtatsa, 265. oldal. Java SE teleptse, 268.oldal, Java fordts, futtats, 268. oldal. A jegyzettel kapcsolatos GYK, 279. oldal. Felhasznlt s ajnlott irodalom, 293. oldal.
ElszAz anyagnak rsa a Debreceni Egyetem, Informatikai Karnak Opercis rendszerek
I. s II. laborgyakorlata kzben kezddtt meg, s egy rsze a gyakorlat mellett (illetve idkzben a Mobil programozs s a J2SE lzatok laborgyakorlatok mellett), eltt - kzben - utn kszl, gy ksznettel veszem a visszajelzseket, a hibk jelzst, vagy brmely ms szrevtelt elektronikus levlben a [email protected] avagy az [email protected] cmekre.
Az anyag azt felttelezi, hogy a hallgatknak nincs Unix-tpus rendszerekkel gyakorlata s a C programozst is csak ezzel a kurzussal prhuzamosan kezdik meg nkpzs keretben. Ennek ellenre arra btortom az rdekld hallgatsgot, hogy C tanulmnyai mellett kezdjen ismerkedni a C++, Java s a C# nyelvekkel, illetve a kvantum szmtsokkal is ezt a C rendszerszint cm fejezetben s az ezt kvet rszekben C, Java, C++ s C# pldkkal prblom majd segteni. Illetve ennek megfelelen a trgy msodik flve gyakorlatainak pldit a hallgatsg a C mellett ezeken a tovbbi nyelveken is lvezheti.
A jegyzet rsa az Opercis rendszerek laborok mellett a a Mobil programozs s a J2SE - hlzatok cm laborok mellett is folytatdik, ennek megfelelen e gyakorlatok anyaga is itt, a Programoz Pternoszterben kap helyet, tovbbi rszletek tekintetben lsd a 12. oldal, Feldolgozsi javaslatok cm pontjt!
5
-
Elfelttelek :)A Dik-Robot Bartsg lapok: http://www.javacska.hu, [Egyb/DR]A Jvcska Vortl lapjai: http://javacska.lib.unideb.hu, [Egyb/JV]
Megjegyzs s FIGYELMEZTETSAz anyag folyamatosan kszl, a szerepl programokban az tgondolt hibakezelst
elhanyagoljuk, inkbb csak jelezzk, pldul egy kiratssal annak szksgessgt, illetve szmos esetben elfordul, hogy mg ettl is eltekintnk.
A szerz a programok ksztsnl a legjobb tudsa szerint jr el, de lehetnek, bizonyra vannak hibk. Illetve vannak olyan lpsekben fejlesztett pldk, amelyekben a kezd vltozatok eleve hibsak, ezrt nem is rhetk el pldul kln a programok, hanem csak ebbl az anyagbl, azaz ennek az anyagnak a rszeknt.
A jegyzet, a jegyzet programjainak hasznlatbl eredeztethet esetleges krokrt a szerz semmilyen felelssget nem vllal.Ebbl a szempotbl kln is kiemelendk azok a nem felhasznli programok, amik, vagy az amikkel val ksrletezs az egsz rendszert sszeomlaszthatja! A szerz sajat szomor tapasztalatbl :) javasolja, hogy ezeket a programokat olyan gpen prblgassuk, amit ennek tudatban vlasztunk a tanulshoz.
Hasonl vatossgra intnk a jegyzet hlzati programjai kapcsn, ezeket, ezek mdostsait ne az Interneten, hanem a localhost-on, vagy a rendszergazdkkal egyeztetve a loklis bels hlzatainkon teszteljk.
A szerzrlBtfai Norbert 1996-ban szerzett programoz matematikusi, majd 1998-ban kitntetses
programtervez matematikusi oklevelet a Debreceni Egyetemen. 1998-ban megnyerte a Java Szvetsg Java Programozsi Versenyt.
Btfai Erikval kzs mobil-informcitechnolgiai cge, az Eurosmobil [Egyb/EM], msodik helyezst rt el 2004-ben a Motorola JavaJtk Versenyn, ugyancsak az Eurosmobil 2004-ben a Sun s a Nokia kzs Mobil Java Fejleszti Versenyn a Ha hvsz, tmadok! (H.A.H) hlzati (Java EE szerver, Java ME kliens) jtksorozattal els djat nyert.Trsszerzje a Fantasztikus programozs [Egyb/DR, JV] cm ismeretterjeszt kalandregny sorozatnak.
Jelenleg a Debreceni Egyetem Informatikai Karnak munkatrsa is, ahol most Opercis rendszerek gyakorlatokat tart. Oktatsi
tapasztalata az albbi trgyak gyakorlatain alapul: Java esettanulmnyok, J2SE hlzatok, Java appletek, CORBA, Programozs, Hlzatok, Formlis nyelvek s automatk, Algoritmuselmlet, Bevezets az informatikba, Opercis rendszerek, Alkalmazsok fejlesztse WWW-re, Objektumorientlt programozs a kzpiskolban.
Milyen GNU/Linux rendszert hasznlunk mi?2005. november 27., Fedora Core 4, http://fedora.redhat.com/
$ more /etc/redhat-releaseFedora Core release 4 (Stentz)
6
2. bra: A szerz s fia a LOKI plyn!(http://www.dvsc.hu Hajr, LOKI!)
-
Az anyagban az eddig (a pontos rszletek tekintetben lsd a kvetkez pontot) bemutatott pldk legtbbjhez szksges szoftverek rajta vannak a Fedora Core 4 telept lemezn, mint pldul a gcj, a GTK+ vagy akr a Java-GNOME, Tomcat, MySQL, PostgreSQL, stb.
2006. szeptember 18., Fedora Core 4, http://fedora.redhat.com/ $ more /etc/redhat-releaseFedora Core release 5 (Bordeaux)
Az anyag fejldseAz anyag verzitrtnett a dokumentum vgn (290. oldal) tallhatjuk meg, a jelenlegi
llapot: 2006-11-12, Az anyag elkszltsgi foka ~ 42%.A jegyzetet az OpenOffice.org 2.0 Writer szvegszerkesztvel ksztettk/ksztjk:
http://www.openoffice.org (de szintn megtallhat a Fedora Core 4 telept lemezn is).
Oktatspolitikai mellkletA milli programoz orszga: a tmegkpzst gy is fel lehet fogni, mint lehetsget a j programozk tmeges kpzsre.
Oktatsi trtnet 2004/2005 tanv, II. flv: Opercis rendszerek 1. labor, DE IK, IT, PM, PTM1.
Tematika a jegyzet 12.oldal Az Opercis rendszerek 1. labor tematikja c. pontja alapjn.
2005/2006 tanv, I. flv: Opercis rendszerek 2. labor, DE IK, IT, PM, PTI.Tematika a jegyzet 13.oldal Az Opercis rendszerek 2. labor tematikja c. pontja alapjn.
2005/2006 tanv, II. flv: Opercis rendszerek 1. labor, DE IK, MI, PTI.
Tematika a jegyzet 12.oldal Az Opercis rendszerek 1. labor tematikja c. pontja alapjn.
Alkalmazsok fejlesztse WWW-re, DE IK, levelez IT. Tematika a jegyzet 16.oldal Alkalmazsok fejlesztse WWW-re labor tematikja c. pontja alapjn.
2006/2007 tanv, I. flv: Opercis rendszerek 2. labor, DE IK PTM.
Tematika eseti, hibrid (s eleinte csoportbonts), mert a csoportok fele nem e jegyzet alapjn dolgozott az els flvben.
Mobil programozs labor, DE IK, MI, PTI, PTM.Tematika a jegyzet 15.oldal A Mobil programozs labor tematikja c. pontja alapjn.
Alkalmazsok fejlesztse WWW-re, DE IK, levelez IT. J2SE - hlzatok labor, DE IK, MI, PTI, PTM.
Tematika a jegyzet 14.oldal J2SE hlzatok labor tematikja c. pontja alapjn.
1 DE IK: Debreceni Egyetem Informatikai Kar, PM: programoz matematikus, PTM: programtervez matematikus, IT: informatika tanr, PTI: programtervez informatikus, MI: mrnk informatikus.
7
-
I. Az anyag szervezseAz rs sorn igyekeztnk/igyeksznk az anyagot bsgesen elltni
kereszthivatkozsokkal, ezrt javasoljuk az on-line bngszst. gy ahelyett, hogy a megfelel oldalakra prblnnk lapozni, rdemes figyelni a kurzort s egyszeren ugrani, pldul gyakorlskppen ide: 173. oldal, Kernel blog cm pont. Hasonlan a legtbb helyen kirjuk az oldalszmot s a hivatkozott fejezet cmt is, ezeket a rszeket megdntve s alhzva szedjk.
Az anyag feldolgozst szigoran gp mellett ajnljuk! Tbb okbl, de a legpraktikusabb, hogy a legnagyobb rszt kitev C programozssal foglalkoz rszekben folyamatosan hivatkozunk a manul lapokra. Ezrt pldul, a 43. oldalon, a Sigaction cm pontban a jegyzetbe nem vettk be a sigaction struktra lerst, mert feltesszk, hogy az olvas folyamatosan ltja a
$ man sigaction
lapot. Teht lersok helyett inkbb mkd kis pldkat ksztettnk, amit az olvas knnyen t tud vgni kedvenc szvegszerkesztjbe s mris mehet a fordts 265. oldal, Fordts cm pont kiprbls... Hajr!
I.1 Programok s platformokA tblzatban szerepl szmok azt az oldalt jellik, ahol a szban forg programok,
vagy azok els vltozatai tallhatak.Tblzat 1: Programok s platformok (QC=Kvantum szmtgp)
Programok, programcsaldok C C++ Java C# QCBevezets
Bevezets/szhossz 25Bevezets/32, 64 bites rendszerek 26Bevezets/vgtelen ciklus 27Bevezets/cat 30Bevezets/Hell Vilg! 30 31Bevezets/vletlen szmok 32 35
FolyamatokFolyamatok/forkols 36Folyamatok/zombik 38Folyamatok/riaszts 39Folyamatok/nem loklis ugrsok 42Folyamatok/szignlkezels 41Folyamatok/IPC/(SysV)szemaforok 46Folyamatok/IPC/socketek (loklis, anonim) 47Folyamatok/IPC/csvezetkek 52Folyamatok/IPC/(SysV)zenetsorok 55
8
-
Programok, programcsaldok C C++ Java C# QCFolyamatok/IPC/(SysV)zenetsorok plda: a Pi jegyei/BBP algoritmus tbb folyamattal (lsd Tudomnyos szmtsok is)
231
Folyamatok/IPC/(SysV)osztott memria 59Konkurencia
Konkurencia/szlak 64Konkurencia/mutex zrak 66Konkurencia/ebdel filoszok (pthread szemaforok s feltteles vltozk, illetve ltalban a szlak szinkronizlsa)
70 78 79
Konkurencia/CPU id 66Fjlrendszer, fjlkezels
Fjlrendszer/tulajdonsgok 81Fjlrendszer/knyvtrak 81Fjlkezels/binris/szveges kir/beolvas 82 84 86 87Fjlkezels/rendszer statisztika plda 89Fjlkezels/rendszer statisztika/pidcs plda 94
Hlzati programozsHlzati/TCP socket szerverek/soros 102 130 132Hlzati/TCP socket szerverek/soros, IPv6 104Hlzati/TCP socket szerverek/prhuzamos, folyamatokkal 106 130
Hlzati/TCP socket szerverek/prhuzamos, folyamatok sorval 109
Hlzati/TCP socket szerverek/prhuzamos, folyamatok sorval, szemaforral vdett accept 111
Hlzati/TCP socket szerverek/prhuzamos, folyamatok sorval, zrolssal vdett accept 113
Hlzati/TCP socket szerverek/prhuzamos, szlakkal 116
Hlzati/TCP socket szerverek/prhuzamos, szlak sorval 117
Hlzati/TCP socket szerverek/prhuzamos, mutex-el vdett accept 120
Hlzati/TCP socket szerverek/soros, nem blokkold IO multiplexelssel 121 131
Hlzati/TCP socket szerverek/prhuzamos, nem blokkold IO multiplexelssel 123
Hlzati/TCP socket kliensek 132 134 134
9
-
Programok, programcsaldok C C++ Java C# QCHlzati/TCP socket kliensek, IPv6 133Hlzati/nem szlbiztos 129Hlzati/SMTP levl 137 136Hlzati/TCP alap cseveg 138Hlzati/TCP alap cseveg, nem blokkold IO multiplexelssel 141
Hlzati/UDP szerver, kliens 148 156Hlzati/SOCK_RAW, ICMP_ECHO 158 159Hlzati/Java RMI 161Hlzati/CORBA/ORBit/nvszolgltat 164Hlzati/CORBA/Gnorba/nvszolgltat 166Hlzati/Java szervletek 169Hlzati/Bluetooth
Kernel programozsKernel/els kernelmodulok 174Kernel/printk 175Kernel/task_struct 176Kernel/seq_file egyszeren 177Kernel/seq_file kevsb egyszerenKernel/fs/proc/generic.c-ben ajnlottKernel/ue. lapmretnl kevesebb adattal Kernel/a norbi() rendszerhvs 180
GUI programozsGUI/GTK+, ProgPter TCP kliens 190GUI/GNOME, ProgPter TCP kliens felleteGUI/Java-GNOME, ProgPter TCP kliens fellete 201
GUI/AWT, ProgPter TCP kliens fellete 186GUI/Swing, ProgPter TCP kliens 183GUI/Teljes kperny 188
Mobil programozsMobil/Symbian C++ Hell, Erika! 216Mobil/Java ME/MIDlet letciklus 217Mobil/Java ME/Vszon/Plcikaember 1-3 218Mobil/Java ME/Vszon/Plcikaember sprite 225
10
-
Programok, programcsaldok C C++ Java C# QCAdatbzis programozs
Adatbzis/MySQL/JDBC 204Adatbzis/MySQL/PHPAdatbzis/PostgreSQL/libpqAdatbzis/PostgreSQL/JDBC
Web programozsJava szervletek 169PHP
Tudomnyos szmtsokPi jegyei/BBP algoritmus 228Pi jegyei/BBP algoritmus tbb folyamattal (prhuzamos plda) 231
Pi jegyei/BBP algoritmus tbb gppel (elosztott plda) 238
Kvantum algoritmusokKvantum konstans orkulum 254Kvantum srsgi kdols 257Kvantum teleportls 258
11
-
I.2 Feldolgozsi javaslatokAzaz lehetsges vlaszok arra a krdsre, hogy hogyan szervezhetjk a jegyzet
anyagnak elsajttst? Hogyan pthetjk fel r az Opercis rendszerek cm trgy laborgyakorlatait, illetve hogyan kapcsoldhat a jelen anyag ms laborgyakorlatokhoz?
I.2.1 Az Opercis rendszerek 1. labor tematikjaA GNU/Linux rendszert nem felhasznlknt, hanem jval mlyebben,
programozknt, programokon, programozson keresztl ismerjk meg, de mivel a C programozsi kurzus egyszerre indul a jelen kurzussal, gy az els nhny gyakorlaton szoktatjuk a hallgatsg szemt a krlbell a negyedik gyakorlattl beindul tartalmi anyaghoz, a C rendszerszinthez:
A labor rszletes bontsa a C nyelv pldk feldolgozsval a kvetkez lehet:
Gyakorlat Tma1-3. Bevezets: 21. oldaltl.4-6. C rendszerszint/folyamatok: 36. oldaltl.7. C rendszerszint/jelkezels: 41. oldaltl.8. C rendszerszint/IPC: 46. oldaltl.9-10. C rendszerszint/konkurencia: 64. oldaltl,
rszlegesen.11. C rendszerszint/fjlrendszer, fjlkezels:
81. oldaltl.12-14. C rendszerszint/hlzati: 102. oldaltl,
rszlegesen.
Tblzat 2 Opercis rendszerek 1. gyakorlat
I.2.1.1 Javasolt krnyezetGNU/Linux, gcc fordt, manul lapok.
12
bra 3: Opercis rendszerek 1. laborgyakorlat Gantt diagramm
C rend-szer-szint
Bevezets
1 2 3 4 5 6 7 8 9 10 11 12 13 14
Oprendszerek 1. Gantt diagramm
Gyakorlat
-
I.2.1.2 Javasolt feldolgozsA jegyzet alapjn a forrsok celebrlsa, kzben a megfelel manul lapok olvassa, a
programok (parancsok) kiprblsa, illetve tovbbi irnytott ksrletezgets a programokkal.
I.2.2 Az Opercis rendszerek 2. labor tematikjaA C, C++, Java, C#, QC nyelv pldk feldolgozsval:
Gyakorlat Tma1-3. Hlzati programozs folytatsa,
kimertse. 4. Konkurens programozs folytatsa,
kimertse.5-9. C kernelszint.10-11. GUI programozs.12. Web programozs.13. Adatbzis programozs.14. Kvantum szmtsok, tudalmodellek
figyelemfelhv trgyalsa.
Tblzat 3 Opercis rendszerek 2. gyakorlat
I.2.2.1 Javasolt krnyezetGNU/Linux, gcc fordt, manul lapok. Java SE-JDK, NetBeans. GTK+, GNOME,
Java-GNOME. ORBit. Tomcat. MySQL, PostgreSQL.
I.2.2.2 Javasolt feldolgozsA jegyzet alapjn a forrsok celebrlsa, kzben a megfelel manul lapok olvassa, a
programok (parancsok) kiprblsa, illetve tovbbi irnytott ksrletezgets a programokkal.
I.2.3 nll feldolgozsEz esetben javasoljuk, hogy teleptsk fel az otthoni gpnkre a 6. oldal, Milyen
GNU/Linux rendszert hasznlunk mi? cm pontjban ajnlott GNU/Linux rendszert vagy mg inkbb a feldolgozskor ppen aktulis s npszer rendszert, hogy a jegyzet pldit kiprblhassuk.
13
-
I.2.4 Kapcsolat a kiegszt s rpl trgyakkal
I.2.4.1 Programozsrintett tmk
Az anyagban C, C++, Java s C# pldkat tallunk, a forrsok mennyisge is mutatja, hogy a hangslyt a C s a Java forrsokra helyeztk. A pldaprogramok sszefoglalst a 8. oldal, Programok s platformok(QC=Kvantum szmtgp) tblzatban talljuk.
Tblzat 4 Programozs
I.2.4.2 Hlzati programozsrintett tmk
TCP socket programozsi bevezet pldk.UDP socket programozsi bevezet pldk.Raw socket programozsi bevezet pldk.Tvoli metdushvs: RPC, Java RMI, CORBA.Web programozs: Java szervletek, PHP.
Tblzat 5 Hlzati programozs
I.2.4.2.1 J2SE hlzatok labor tematikja
Gyakorlat Tma1-2. TCP/IP, hlzati programozsi pldk C-
ben s Javaban.3-4. Multiplexelt, nem blokkold IO.5-6. Java RMI7-11. CORBA12-14. Java Bluetooth
Tblzat 6 J2SE - hlzatok gyakorlat
I.2.4.3 Mobil programozsrintett tmk
Java ME a 217. oldaltlSymbian OSSymbian C++ figyelemfelkelts a 216. oldaltl
Tblzat 7 Mobil programozs
14
-
I.2.4.3.1 A Mobil programozs labor tematikja
Gyakorlat Tma1. Java ME fejlesztssel kapcsolatos
alapfogalmak. 2-3. NetBeans 5.5 s a NetBeans Mobility
teleptse s hasznlata, pldul obfuscls stb. Bevezet MIDlet pldk, a fejleszts menete, MIDlet letciklus.
4-5. Java ME GUI programozs.6. Java ME multimdia programozs.7. Java ME vsznak s szlak, a jtk
vszon (GameCanvas) hasznlata.8. Java ME adatbzis kezels (RMS).9-12. Java ME hlzatkezels.13-14. Java Bluetooth (JSR 82).
Tblzat 8 A Mobil programozs laborgyakorlat
I.2.4.4 Adatbzis programozsrintett tmk
MySQL a 204. oldaltl.PostgreSQL a 213. ldaltl.
Tblzat 9 Adatbzis programozs
I.2.4.5 Konkurens programozsrintett tmk
SVr4 szemaforok, POSIX szlak, Java szlak, klcsnos kizrs, szemaforok, monitorok, ltalban szlkezels s szlak szinkronizcija.
Tblzat 10 Konkurens programozs
I.2.4.6 Algoritmuselmletrintett tmk
Kvantum szmtsi modellek, kvantum bonyolultsgi osztlyok a 251. oldaltl.
Tblzat 11 Algoritmuselmlet
15
-
I.2.4.7 Alkalmazsok fejlesztse WWW-re labor tematikjaGyakorlat Tma1. alkalom TCP/IP, hlzati programozsi pldk C-
ben, HTTP protokoll. 2. alkalom Hlzati programozsi pldk Java-ban.3. alkalom Mobil (Java ME) programozs vagy Java
szervletek.
16
-
I.3 ttekints
I.3.1 Platformok s nyelvekA jegyzetben hasznlt platformok s nyelvek az albbiak:
I.3.2 Programozsi tmkA jegyzetben hasznlt programozsi tmk az albbiak szerint is csoportosthatak:
A pldk rszletesebb csoportostst lthattuk a 8. oldal, a Programok s platformok cm pont tblzatban.
17
bra 4: Platformok s nyelvek a jegyzetben
GNU/Linux Windows
C C++ Java C#
bra 5: Programozsi tmk a jegyzetben
C#
C++C Hlzatiprogramozs
Mobilprogramozs
Kernelprogramozs
Adatbzisprogramozs
GUIprogramozs
Java
-
I.4 Jellsek
I.4.1 PldaprogramokA jegyzetben szerepl forrskdok legtbbszr teljes, futsra ksz, kis
pldaprogramok. Nyelvek s tovbbi ms szempotok szerint az albbi bontst hasznljuk:
I.4.1.1 C
/* C forrsok, header fjlok halvnysrgban */
I.4.1.2 C++
/* C++ forrsok kkesszrkben */
I.4.1.3 Java
/* Java forrsok narancsban */
I.4.1.4 C#
/* C# forrsok vilgosszrkben */
I.4.1.5 XML
de ilyenben szedjk a HTML fjlokat is.
I.4.1.6 Parancssor$$ ./parancs
vagy kpernykp, pldul egy program kimenete:$ more /proc/versionLinux version 2.6.13.4 ([email protected]) (gcc version 4.0.0 20050519 (Red Hat 4.0.0-8)) #1 Fri Oct 28 18:40:26 CEST 2005
18
-
de ilyenbe illesztnk majd minden tovbbi fjlt, mint pldul a makefile-okat.
I.4.1.7 Parancsllomny#!/bin/bash# parancsllomny vilgoszldben
Nha kombinljuk is:$ more vissza#!/bin/bashexit 5$ ./vissza$ echo $?5
I.4.1.8 Tovbbi szempontokA klnleges jogosultsg birtokban kiprblhat kdokat, parancsokat vilgospirossal
keretezzk:
/* C forrs, a root tudja futtatni a belle fordtott programot */
Parancs, amit a rendszergazdnak kell futtatnia:
## ./parancs
I.4.1.9 Pldapublic class Ford { public static void main(String [] args) { char[] tomb = args[0].toCharArray(); for(int i=tomb.length-1; i>=0; --i) System.out.print(tomb[i]); }}
A krdsekre a vlaszt ezzel a programmal megfordtva, srga dobozban pirossal szerepeltetjk?
.lassorip ,nabzobod agrs ,avtdrofgem ,negI
Ha valamit nagyon meg akarunk magyarzni, akkor szmozott sorokat hasznlunk majd:
1. if ((kapcsolat = accept (kapu_figyelo,2. (struct sockaddr *) &kliens,3. (socklen_t *) &kliensm)) == -1)
19
-
3. Nzzk meg, mit r az accept() harmadik paramterrl a manul.Vastaggal szedve is kiemelnk rszeket, amikkel az adott trgyalsban fontos momentumokra hvjuk fel a figyelmet. Illetve a laborgyakorlatokon segtjk a hallgatsgot a pldaprogramok celebrlsnak1 kvetsben.
I.4.1.10 Kvantum algoritmusokA kvantum szmtgpes programoknak matematikai lerssal vagy kvantum logikai
hlzattal adjuk meg, pldul egy rme feldobsa:
I.4.1.11 Tanri megjegyzsekA letantott laborokon kialakult, hasznlt, elhangz gondolatokat, megjegyzseket
tbbnyire ilyen kkkel, dlten szedve fzzk be az anyagba.
I.4.2 ltalnos jellsekA kocks zrjelek kztt hivatkozsokat kzlnk, a [NB] pldul azt jelenti, hogy a
293. oldal Felhasznlt s ajnlott irodalom cm fejezetben meg kell keresnnk az NB bejegyzst, hogy fel tudjuk oldani a hivatkozst!
Sokszor ebben a keressben segtjk az olvast azzal, hogy [Hlzati/TB] alakban adjuk meg a hivatkozst, ami azonnal megadja, hogy az irodalomjegyzk melyik tematikus rszben tudjuk feloldani a hivatkozst, a pdf-ben a dlt s alhzott rszre (vagy jabban magra a [] hivatkozsra, pldul az itt kvetkez: [PI] hivatkozsra) kattintva azonnal ugorhatunk is erre a megfelel rszre.
I.4.3 A pldaprogramok kiprblsaA forrskdokat jelljk ki a pdf olvas programunkban majd illesszk be kedvenc
szvegszerkesztnkbe. Az Adobe Reader 7.0 pdf olvast s a vi szvegszerkesztt hasznlva ez a mdszer elegnsan mkdik. Viszont ms pdf olvaskat hasznlva elfordult pldul, hogy a tbb oldalas kijellsbe az oldalszmot is belevette, ami a fordtsnl nyilvn hibt okoz. Tovbb az is hiba lehet, ha mi a jegyzetbe illesztett forrsok trdelst tipikusan eszttikai okokbl j sor jelekkel bvtjk s pldul egy ilyen sortrssel kett vgjuk egy printf formtum sztringjt. De ezek az esetlegesen felbukkan szintaktikai hibk gyorsan felderthetek s kijavthatak.
E miatt az utbbi idkben a jegyzetbe illesztett forrsokat nem formzzuk. Javasoljuk, hogy a kedves olvas illessze be ket kedvenc (lehetleg szintaxis kiemelst tmogat) szvegszerkesztjbe, s ott tanulmnyozza ket!
1 A forrs celebrlsa, azaz a program szvegnek bemutatsa, megbeszlse :)
20
H|0>
-
II. Bevezets
II.1 TrtnelemAz ric Lvnez-fle [OS/T] idvonalak tanulmnyozsa.
II.1.1 Feladat opercis rendszer ajnlsa Az idvonalak alapjn mikor szlettek az ltalatok eddig ismert-hasznlt opercis
rendszerek? Egy opercis rendszert ajnlj nhny mondatban a kvetkez szereplk egyiknek:
mikrovllalkozs (tetszleges terleten) vezetje informatikus egyetemista ismers (bart) informatikus egyetemista ismers (kpzelt ellensg) kzpiskolai szakkrvezet gimnziumi dik a Paksi Atomerm
Ismteljk meg a feladat ajnls rszt programozsi nyelvekre is! A megfelel idvonalakat szintn a fent hivatkozott cmen talljuk.
A feladat ponja, hogy a flv vgn jra megoldjuk ezt a feladatot. A flv elejn s vgn bekldtt megoldsok sszehasonltsval a hallgatsg s n is tudom rzkelni, mrni a kurzus hasznossgt.
II.2 Felhasznli szint els tallkozs a GNU/Linux rendszerrelAzaz tallkozs az igazival: nyomjunk Alt+Ctrl+F2-t s felhasznli nevnk,
jelszavunk bersval jelentkezznk be! (Termszetesen kezdhetnnk a grafikus felleten trtn bejelentkezssel is, de hallgassunk rm kezdjnk karakteres konzolon, hogy szrevehessk, feltrulhassanak a rendszer bels rtkei, mr gyis lttuk a felletet, lttuk, hogy gynyr szp, de a tovbbiakban az elejn csak elkalandoztatn a figyelmnket a lnyegrl :) Most mg gyis rok mindent a tblra, a kvetkez gyakorlattl annyibl szerencss a grafikus fellet hasznlata, hogy folyamatosan tudjuk kvetni a labor menett a jelen pdf-bl, ez egyben azt is jelenti, hogy jegyzetelni felesleges!
II.2.1 BevezetsSzimblumok:
$ # . .. ~ / \ & * ? |Billentyk (konzolok):
Alt+Ctrl+F1-F6, Alt+, Alt+Ctrl+F7, Shift+PageUp
Ismerkeds a rendszerrel, kezdjk pldul a kvetkez parancsokkal:
$ uname -a$ last|more$ more /proc/cpuinfo$ more /proc/version$ uptime $ df -h
21
-
Az emltett parancsokhoz a gyakorlatvezet szubjektv lmnyeinek bemutatsa kzben a /proc/cpuinfo BogoMIPS-t kln is lefuttathatjuk: ez esetben ugorjunk a 277. oldal, BogoMIPS c. pontjra!
II.2.2 Alapvet parancsokParancsok:
man1, clear, uname, whoami, who, finger, chfn, passwd, w, last|more, pwd, ls -l, logout
Nhny alapvet s tovbbi parancs tipikus hasznlatt mutatjuk meg a 262. oldalon a Az alapvet parancsok tipikus hasznlata cm pontban.
llomnyok: /, /proc, /proc/meminfo, /home, /tmp
Billentyk: Ctrl+d
II.2.2.1 Fjlokkal kapcsolatos alapvet parancsokA Windows ma mr nagyon sikeresen testesti meg azt a ltomst, hogy brki lel a
grafikus felhasznli interfsz el s tudja hasznlni a szmtgpet! Viszont neknk, mint informatikusoknak termszetes mdon nem szabad csupn ezt a kirlyi utat tudni jrni... Ennek kapcsn lssuk, mit hoztunk a kzpiskolbl! Ez van akinek ijeszt s olyan is, akinek unalmas lesz: mrmint ltrehozni az alma knyvtrat s belemsolni a di.txt fjlt stb., ezrt prblunk kzben nhny izgalmas hrt is megpendteni. De ne aggdjunk nhny gyakorlat mlva eljutunk a 36. oldal C rendszerszint c. fejezetig, ahol is kezdjk az oprendszerek labor valdi tartalmi trgyalst!
Parancsok: ls, ls -l, ls -la, mkdir, cd, cp, mv, rmdir, chmod, ln -s, du, find, grep
$ more /etc/passwdroot:x:0:0:root:/root:/bin/bash...norbi:x:500:500:a:/home/norbi:/bin/bash...$ mkdir elso$ cp /etc/passwd elso/passwd_az_etc-bol$ ls -l elso/passwd_az_etc-bol-rw-r--r-- 1 norbi norbi 1971 dec 14 10:35 elso/passwd_az_etc-bol$ find . -name '*etc-bol'./elso/passwd_az_etc-bol$ grep root `find . -name '*etc-bol'`root:x:0:0:root:/root:/bin/bashoperator:x:11:0:operator:/root:/sbin/nologin$ rm -rf2 elso/
Nzzk meg a jelsz fjl mezit! Az x helyn rgebben a titkostott jelsz volt, mostanban ezeket mr az rnykjelsz fjlban talljuk. Rendszergazdaknt rdekes lehet
1 A q billenty a kilps.2 gy csak akkor hasznljuk az rm parancsot, ha ktszer is tgondoltuk, hogy mit fog trlni!
22
-
ellenrizni, hogy a felhasznlk nem hasznlnak-e tl egyszer jelszavakat. A gyengre vlasztott jelszavak feldertsre szolgl pldul a John the Ripper program [OS/JR]. Az emltett program doksijt kvetve, a jelszofajl fjlt ltrehozva s a John the Ripper programot erre rengedve:$ more jelszofajl...norbi:$1$jmJCcLQX$hzvMzl3tzV0Kj4RIn7c6m0:500:500:a:/home/norbi:/bin/bash...matyi:$1$wZ3bMDHK$Xogj2CHjy4.o3MEB2nhp00:502:502::/home/matyi:/bin/basherika:$1$X0FFXuk6$ikD/PljzJMBzQ05o2slyT.:503:503::/home/erika:/bin/bash$ ./john jelszofajlLoaded 5 password hashes with 5 different salts (FreeBSD MD5 [32/32])...akire5 (erika)matyi2006 (matyi)4depeche (norbi)
$ ./john -show jelszofajlnorbi:4depeche:500:500:a:/home/norbi:/bin/bash...matyi:matyi2006:502:502::/home/matyi:/bin/basherika:akire5:503:503::/home/erika:/bin/bash
5 password hashes cracked, 0 left
Hopp! Magunk is kiprblhatjuk, ha rengedjk a fent mutatott albbi fjlra:
norbi:$1$jmJCcLQX$hzvMzl3tzV0Kj4RIn7c6m0:500:500:a:/home/norbi:/bin/bashmatyi:$1$wZ3bMDHK$Xogj2CHjy4.o3MEB2nhp00:502:502::/home/matyi:/bin/basherika:$1$X0FFXuk6$ikD/PljzJMBzQ05o2slyT.:503:503::/home/erika:/bin/bash
llomnyok: ., .., /etc/passwd, ~/
Krds: hogyan trljk le a vletlenl ltrehozott *.txt nev fjlt?
$ ls*.txt a.txt b.txt$ rm \*.txt$ lsa.txt b.txt
23
-
II.2.3 A Linux/UNIX accountMi az utols mez a /etc/passwd jelszfjlban?
II.2.3.1 A bash parancsrtelmez Kurzor fl, parancsnv-kiegszts a tabultorral.
$ export PS1=[\u@\h]\w>
Prbljuk mg ki, mit eredmnyeznek a kvetkezk: \W, \a, \#, \t
(Ha van accountunk egy olyan tvoli unixos gpre1, ahol megy a levelezs, akkor jelentkeznk be s futassuk ezen a tvoli gpen a pine vagy az elm nev levelez programot s dobjunk is egy levelet valakinek, mondjuk a szomszdunknak! Ha a pine vagy az elm nem akar futni, akkor a TERM=vt100 parancs kiadsa, azaz a TERM vltoz ilyen belltsa segt?)
Parancsok: echo, env, ., source, chmod
llomnyok: /bin/bash, ~/.bash_history, ~/.bash_profile (vagy ~/.profile), ~/.bashrc
A .bash_profile fjl vgre rjuk be az echo "Udv a .bash_profile-bol" parancsot, a .bashrc fjl vgre rjuk be a echo "Udv a .bashrc-bol" parancsot, majd jelentkezznk be jra!
II.2.3.1.1 Az elrsi t belltsalltsuk be a .bash_profile fjlban a szmunkra szimpatikus PS1 vltozt, illetve
vizsgljuk meg a kvetkez pldt: tegyk fel, hogy felhasznlknt, azaz a sajt home knyvtrunkba feltettk a legfrissebb Java fejleszti csomagot (rszletesen lsd a 268. oldalon a A Java fejleszti csomag teleptse cm pontban), ekkor a .bash_profile fjlban rdemes belltani, hol tallhatak a csomag parancsai (pldul a java, a javac stb.) ...export PS1=[\u@\h]\w> export PATH=$HOME/Java/jdk1.5.0_05/bin:$PATH...
Krnyezeti vltozk: PS1, PATH, TERM, HOME, USER, MAIL, MAILCHECK
II.2.3.2 Feladat felhasznli webterletHozzuk ltre a $HOME knyvtrunkban a public_html knyvtrat s benne egy
egyszer index.html fjlt, majd egy bngszbl nzzk meg a kvetkez lapot: http://localhost/~loginnevunk
1 A DE hallgatinak tipikusan van ilyen.
24
-
$ mkdir public_html$ chmod o+x public_html/$ joe public_html/index.html
Hello, X. Y. vagyok. Ez a ~/index.html-em!
$ chmod 644 public_html/index.html
(Persze a sikerhez az is kell, hogy a gpen fusson a webszerver, ha nem futna, akkor a .oldalon, a cm pontban tallunk segtsget.)
II.2.4 A programoz knnyfegyverzeteAzaz egyszer szvegszerkeszt.
II.2.4.1 joeCtrl+kh s mindent tudsz.
II.2.4.2 viEscEsc (pitty utn parancsolgathatunk, klnben szerkesztnk)
Ment s kilp: EscEsc Shift zz!(azaz nem) ment s kilp: EscEsc :q!Bett trl: EscEsc xSort trl: EscEsc ddElz parancsot visszavon: EscEsc uElkezd szerkeszteni: EscEsc iEgy karakterrel jobbra elkezd szerkeszteni: EscEsc a
II.2.4.3 emacsMents: Ctrl x s
Keress: Ctrl sKilps: Ctrl x c
Dolgozzunk egy kicsit pldul a vi-al, nzzk meg a gp szhosszt! Vgjuk be az albbi szveget pldul a szohossz.c nev fjlba:
#include intmain(void){ int h = 0; int n = 0x01; do ++h; while(n
-
$ vi szohossz.c
Aztn i nyomsa utn beillesztjk a fjt, majd EscEsc Shift zz utn:
$ gcc -o szohossz szohossz.c$ ./szohosszA szohossz ezen a gepen: 32 bites
Sokszor elfordul, hogy nem tudunk menteni a szerkesztnkbl, ilyenkor tipikusan az a hiba, hogy valami olyan helyre tvedtnk a fjlrendszerben, ahov nincs rsi jogunk s innen indtottuk a szvegszerkesztnket, ekkor pldul a vi-t hasznlva:Ment: EscEsc w /home/hallgato/ezt_mar_kimenti.c
Parancsok: indent
Billentyk: Ctrl+g, Ctrl+s, Ctrl+q
II.3 ltalnos bevezets
II.3.1 Nhny rvidts s fogalomAmiket rdemes tudni, mert biztosan sszefutunk velk: SVr4, POSIX, BSD, RFC,
ANSI, ...
II.3.1.1 Feladat fussunk ssze velk!Lapozzunk bele nhny manul lapba: stdio, printf(3), socket, read(2)
stb.
$ man stdio$ man 3 printf...
Hol nzhetnk utna egy kvnt RFC-nek? A http://www.ietf.org/rfc lapon. Aki pldul a jegyzet IPv4 hlzati pldit akarja trni IPv6-ra, annak az RFC 2553 [Hlzati/RFC2553] dokumentumot ajnljuk, ezt egybknt mi is megtesszk, a 104. oldal, IPv6 szerver oldal cm s a 133. oldal IPv6 kliens oldal cm pontokban.
II.3.2 32, 64 bites rendszerek
#include int main(){ printf("%d\n", sizeof(char) * 8); printf("%d\n", sizeof(short) * 8); printf("%d\n", sizeof(int) * 8); printf("%d\n", sizeof(long) * 8);
26
-
printf("%d\n", sizeof(char*) * 8); return 0;}
A lelkes manul olvas a *8 helyett *CHAR_BIT-et r:
$ man limits.h
Ezt kapjuk egy 32 bites rendszeren: 816323232
s ezt egy 64 bitesen: 816326464
II.3.3 Pldaprogramok a kurzusban
II.3.3.1 Vgtelen ciklusEgyszer j bart, mskor ellensg! Ki rja a legszebbet, me egy javaslat az [OS/NX]-
bl:
intmain(void){ for(;;) ;}
Billentyk: Ctrl+c
II.3.3.1.1 Folyamatokkal kapcsolatos alapvet parancsokFuttassuk az imnt ltott vgtelen ciklust:
$ gcc -o vegtelen vegtelen.c$ ./vegtelen
27
-
Kzben egy msik konzolon: Alt+ (avagy grafikus felleten: msik ablakban) futtassuk a top1 parancsot! Figyeljk meg, hogy mennyi processzor idt visz el a vegtelen-nek keresztelt folyamatunk? A vgtelen ciklust futtat konzolon a Ctrl+c billentykombi lenyomsval tudjuk megszaktani a folyamat futst, ekkor visszakapjuk a $ promptot.
Futtassuk jra, majd a Ctrl+z billentykombi lenyomsa utn a msik ablakban figyeljk a fut top -u felhasznli_nv parancsot!
$ ./vegtelen[1]+ Stopped ./vegtelen$ ps PID TTY TIME CMD 4969 pts/2 00:00:00 bash 5064 pts/2 00:00:00 bash 6065 pts/2 00:00:01 vegtelen 6068 pts/2 00:00:00 ps$ more /proc/6065/statusName: vegtelenState: T (stopped)...$ bg[1]+ ./vegtelen &$ more /proc/6065/statusName: vegtelenState: R (running)...$ fg./vegtelen
Jl lthat, hogy vgl eltrbe tettk a folyamatot s a a Ctrl+c s a mr ismert billentykombival lttk le, de hasznlhatuk volna a
$ kill 6065
parancsot is. Programozi plyafutsunk sorn bizonyra fogunk olyan megtalkodott programokkal is tallkozni, akik erre nem lesznek hajlandak meghalni, ekkor az ellentmondst nem tr
$ kill -9 6065
parancsot hasznljuk majd! (Kapcsold rszletek, finomsgok majd a 41. oldal, Jelek smegszaktsok cm pontjban.)
1 Magunk is runk majd a top parancshoz hasonl programokat a ksbbiekben, ilyen pldul a 89. oldal, Rendszer statisztika cm pontja.
28
-
$ man nohup$ info coreutils nohup
Ha akkor is szeretnnk futtatni a programunkat, amikor kilpnk, akkor a nohup parancsot rdemes hasznlnunk. Ez hasznos lehet, ha egy olyan szimulcis szmtst futtatunk, ami pldul tbb htig is elszmolgat.
$ nohup ./vegtelen&[1] 6329nohup: appending output to `nohup.out'
Lpjnk ki, majd vissza s lssuk, hogy fut-e mg a programunk:$ ps axu|grep vegtelennorbi 6329 99.2 0.0 2484 260 pts/1 R 13:56 0:59 ./vegtelen
Szmtsainkat rdemes nice-olva futtatnunk:
$ gcc -o v1 vegtelen.c$ gcc -o v2 vegtelen.c$ gcc -o v3 vegtelen.c$ gcc -o v4 vegtelen.c$ nice -n 3 ./v1&[1] 6889$ nice -n 6 ./v2&[2] 6892$ nice -n 9 ./v3&[3] 6893$ nohup nice -n 9 ./v4&[4] 6896nohup: appending output to `nohup.out'$ top -u norbi PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 6889 norbi 28 3 2484 260 200 R 33.8 0.0 0:27.16 v1 6892 norbi 31 6 2488 264 200 R 23.8 0.0 0:18.51 v2 6893 norbi 34 9 2488 264 200 R 19.9 0.0 0:12.74 v3 6896 norbi 34 9 2488 264 200 R 19.9 0.0 0:10.13 v4 . . .$ killall v?
Rgebben nohup-al futtattuk pldul a Seti@HOME klienseket. Aki nem ismeri ezt a projektet, annak a [Egyb/SETI] lapot, illetve a [Egyb/K] film/knyv megnzst/elolvasst ajnljuk. Fontosnak tartom megjegyezni, hogy a knyv mondanivalja jval mlyebb, rdemes elolvasni!
Parancsok: top, ps, bg, fg, jobs, kill, nohup, nice, killall, sleep
llomnyok: /proc/processz_azonost, nohup.out
29
-
II.3.3.2 A pldaprogramok szintjeiMilyen szinten, szinteken tallkozunk majd programokkal a kurzusban?
cat
#include intmain(void){ int c; while((c=getchar())!=EOF) putchar(c); return 0;}
A cat hrom pillanata: a kezd [C, C++/KR, a jelen plda, hasonl a KR 28. oldaln lvhz], a halad [C, C++/KR, 159. oldaln] s a (valdi) a GNU text utilities [C,C++/TU]-bl a cat forrsa. Mi a kurzusban jobbra a halad szinten fogunk majd dolgozni.
Billentyk: Ctrl+d, Ctrl+z
II.3.4 Hell Vilg! stdin, stdout, stderr
$ man stdio
#include intmain(void){ printf("Hello, Vilag!\n"); return 0;}
Fordtsuk, majd futtassuk:
$ gcc -o hello hello.c$ ./helloHello, Vilag!
A main() fggvny kapcsn tanulmnyozzuk a 272. oldal char **environ cm pontjnak programjt!
Mirt nagyon rossz tlet a kvetkez parancs:
$gcc o hello.c hello.c
Prbljuk ki, hogy fut-e a sima
$ hello
parancs? Ha igen, ha nem, mirt? Tanulmnyozzuk a PATH-ot:
30
-
$ echo $PATH
Benne van az aktulis knyvtr?
Mit jelent a program vgn a return 0; utasts? (Lsd mg $ man exit!)
.tlov dnog imalav ygoh ,latu arra ktr zbnlk ltllun a ,tlov nebdner nednim ygoh ,lef rezsdner sicrepo za izlej lekktr 0 a margorp A
Mit r ki az
$ echo $?
Hol talljuk a Linuxunkon az stdio.h-t?
$ find /usr -name 'stdio.h'
Az stdin, stdout, stderr (ha megvan az stdio.h, akkor keressk is meg ezeket a difjnokat benne) s az tirnytsok:
$ man fprintf
Ennek a manul lapnak a kapcsn nzzk meg a 280. oldal const-al kapcsolatos krdst! Majd folytassuk az albbi program kiprblgatsval:
#include intmain(void){ printf("Hello, Vilag!\n"); fprintf(stdout, "STDOUT Hello\n"); fprintf(stderr, "STDERR Hello\n"); return 0;}
tirnytsok:
$ ./hello >stdout.txt 2>stderr.txt$ more stderr.txt$ ./hello &>stdout_es_stderr.txt$ ./hello 1>&2$ ./hello 2> /dev/null
Ugyanezeket prbljuk ki a Hello.java programmal is:
public class Hello { public static void main(String [] args) { System.out.println("Hello, STDOUT!"); System.err.println("Hello, STDERR!"); }}
31
-
Fordtsuk, majd futtassuk:
$ javac Hello.java$ java HelloHello, STDOUT!Hello, STDERR!$ java Hello >stdout.txt 2>stderr.txt. . .
Szimblumok: > < >> >&
llomnyok: /dev/null, /usr/include
II.3.5 Jtk a vletlennel kzben plda az tirnytsokraPrbljuk tbbszr is a kvetkez parancsot:
$ echo $RANDOM$ echo $RANDOM
Kiskoromban leltem a C+4-emmel random szmokat generltatni s kzben ersen arra koncentrltam, hogy befolysoljam akkor ez izgalmasnak tletnek tnt, mirt nem az?
$ man 3 rand
ez alapjn:
#include #include intmain(void){ int i, r; for(i=0; i
- main(void){ int i, r; srand(time(NULL)+getpid()); for(i=0; i
-
alapjn:
$ gcc -lm -o e e.c$ ./e0.1741300.9304330.2444960.2250950.0925021.6217571.0929600.2636671.2809450.590645
Hogyan rjuk ki egy fjlba a szmokat?
$ ./e > szamok.txt$ more szamok.txt0.1741300.930433. . .
Szmoljuk ki a szmok tlagt (tekintve a hasznlt eloszlst, majd 1-et kell kapnunk)
#include #include intmain(void){ int i=0; double r, s=0.0; while(scanf("%lf", &r) > 0) { ++i; s += r; } printf("%lf\n", s/i); return 0;}
Lssuk mkds kzben:
$ gcc -o a a.c$ ./a < szamok.txt0.651663
Emeljk most az elz generl programban a minta #define MINTA 10 nagysgt pldul 10000-re!
$ gcc -lm -o e e.c$ ./e > 10000szam.txt$ ./a < 10000szam.txt1.007993
34
-
Jnak ltszik. tlagl kis programunkat gy is hasznlhatjuk:
$ ./e | ./a1.007993
Hogy mkdik ez? Bcszul nzzk meg, hogy a scanf fggvny mikor ad vissza nullt:
$ man scanf
II.3.5.1.2 JavaHasonl Java nyelven:
public class E { public static final int MINTA = 10; public static void main(String [] args) { for(int i=0; i
-
III. C rendszerszint
III.1 Folyamatok
$ man init$ man proc
Bevezets:init, getty, login, shell
$ man fork$ man getpid
Ltrehozunk egy gyermekfolyamatot:
#include #include #include #include #include intmain(void){ int gyermekem_pid; printf("fork() elott PID: %d\n", getpid()); if((gyermekem_pid = fork()) != -1) { if(gyermekem_pid) { printf("Szulo folyamat PID: %d, gyermekem: %d szulom %d\n", getpid(), gyermekem_pid, getppid()); } else { sleep(1); printf("Gyermek folyamat PID: %d, szulom: %d\n", getpid(), getppid()); } } else { printf("Sikertelen a gyermek folyamat letrehozasa\n"); exit(-1); } printf("fork() utan PID: %d\n", getpid()); return 0;}
Futtassuk:
$ ./gyermek1fork() elott PID: 19859Szulo folyamat PID: 19859, gyermekem: 19860 szulom 19087fork() utan PID: 19859
36
-
Gyermek folyamat PID: 19860, szulom: 1fork() utan PID: 19860
Vegyk szre, hogy a szl folyamat szlje maga a shell, nzzk meg:
$ ps
Hogy lehet, hogy a 19860 gyerek szlje nem a 19859?
.atdagof ebkr tamaylof tini 1 za totamaylof 06891 a ,ttdzejefeb bble rm tamaylof lzs 95891 a treM
Ez a szl megvrja, amg a gyermeke vgez:
#include #include #include #include #include intmain(void){ int gyermekem_pid; int statusz; printf("fork() elott PID: %d\n", getpid()); if((gyermekem_pid = fork()) != -1) { if(gyermekem_pid) { printf("Szulo folyamat PID: %d, gyermekem: %d szulom %d\n", getpid(), gyermekem_pid, getppid()); printf("PID: %d gyermekfolyamat vege\n", wait(&statusz)); } else { sleep(1); printf("Gyermek folyamat PID: %d, szulom: %d\n", getpid(), getppid()); } } else { printf("Sikertelen a gyermek folyamat letrehozasa\n"); exit(-1); } printf("fork() utan PID: %d\n", getpid()); return 0;}
Futtassuk:
$ ./gyermek2fork() elott PID: 20015Szulo folyamat PID: 20015, gyermekem: 20016 szulom 19087Gyermek folyamat PID: 20016, szulom: 20015
37
-
fork() utan PID: 20016PID: 20016 gyermekfolyamat vegefork() utan PID: 20015
Mr nem rva folyamat a 20016.
Mi trtnik, ha a gyermek gon elvgezzk az albbi mdostst:
else { sleep(1); printf("Gyermek folyamat PID: %d, szulom: %d\n", getpid(), getppid()); exit(0); }
Mi trtnik, ha a szl gon elvgezzk az albbi mdostst:
if(gyermekem_pid) { printf("Szulo folyamat PID: %d, gyermekem: %d szulom %d\n", getpid(), gyermekem_pid, getppid()); for(;;) sleep(1); }
(Ha ez utbbi mdostst a korbbi wait-es verziba tesszk, akkor a vgtelen ciklust a wait el tegyk. Akkor vagyunk rendben, ha futtatskor a top-ban egy zombit ltunk majd.)
III.1.1 Zombik!Ez trtnik:
$ top u nbatfaitop - 13:10:55 up 175 days, 2:15, 9 users, load average: ...Tasks: 116 total, 1 running, 114 sleeping, 0 stopped, 1 zombie
Mikor lesz egy folyamat zombi?
.inztguyn atdut men gm tze ejlzs a ed ,tteplik le-tixe rm aH
38
-
Az imnti brt a 41. oldal Jelek s megszaktsok cm rsznek megismerse utn vessk ssze a 44. oldal Jtk zombikkal cm pontjnak brjval! Illetve zombi tmban olvassuk el a Hlzati programozs cm fejezet prhuzamos szerverrel kapcsolatos forkos rszei kapcsn felmerl krdseket, lsd a 108. oldaltl, a Krdsek a prhuzamos szerverrl cm pontot!
Most pedig dolgozzuk fel a 281. oldal, Folyamatokkal kapcsolatos krdsek cm fejezetnek krdseit, mert ezek szorosan kapcsoldnak a forkolshoz.
III.1.2 Riaszts
Mit csinl a kvetkez plda? (Prbljuk ki! Ezzel egyben be is vezetjk a hamarosan kvetkez, Jelek s megszaktsok cm rszt.)
$ man 2 kill
#include #include #include #include #include #include int gyermekem_pid;void riasztas_kezelo(){ printf("Gyermekfolyamat kilovese\n"); kill(gyermekem_pid, SIGKILL);}intmain(void){ int statusz; printf("fork() elott PID: %d\n", getpid()); if((gyermekem_pid = fork()) != -1)
39
bra 6: A szl nem tud wait()-et vgrehajtani...
fork()
Szl g Gyermek g
for(;;)
exit()
ZOMBI
-
{ if(gyermekem_pid) { printf("Szulo folyamat PID: %d, gyermekem: %d szulom %d\n", getpid(), gyermekem_pid, getppid()); signal(SIGALRM, riasztas_kezelo); alarm(5); printf("PID: %d gyermekfolyamat vege\n", wait(&statusz)); } else { printf("Gyermek folyamat PID: %d, szulom: %d\n", getpid(), getppid()); for(;;) sleep(1); } } else { printf("Sikertelen a gyermek folyamat letrehozasa\n"); exit(-1); } printf("fork() utan PID: %d\n", getpid()); return 0;}
III.1.3 A fork() tipikus hasznlata#include #include #include #include #include intmain(void){ int gyermekem_pid; int statusz; if((gyermekem_pid = fork()) == 0) { char *args[] = {"/bin/ls", NULL}; execve("/bin/ls", args, NULL); exit(0); } else if(gyermekem_pid > 0) { wait(&statusz); } else { exit(-1); } return 0;}
40
-
III.1.4 Jelek s megszaktsokBevezets:
$ man 7 signal$ man signal
Prbljuk ki az albbi programot: a SIGINT (Ctrl+c) jelet figyelmen kvl hagyhatjuk (SIG_IGN), vagy kezelhetjk (SIG_DFL) alaprtelmezs szerint:
#include #include intmain(void){ signal(SIGINT, SIG_IGN); sleep(5); signal(SIGINT, SIG_DFL); for(;;) sleep(5); return 0;}
Definilhatunk sajt kezelt is: utolso_tennivalo()
#include #include void utolso_tennivalo(int sig){ printf("Utolso tennivalo kesz, immar kilephetek\a\n"); exit(0);}intmain(void){ if(signal(SIGINT, utolso_tennivalo) == SIG_IGN) signal(SIGINT, SIG_IGN); for(;;) putchar(getchar()); return 0;}
Mondjunk erre a pldra egy rtelmes hasznlati esetet!
Hogyan viszonyulna az albbi szerkezet a pldban szereplhz?
if(signal(SIGINT, SIG_IGN) != SIG_IGN) signal(SIGINT, utolso_tennivalo);
Kapjuk el a Ctrl+c megszaktst:
#include #include void ctrlc_kezelo(int sig){
41
-
signal(SIGINT, ctrlc_kezelo); printf("Megprobaltal megallitani?\a\n");}intmain(void){ if(signal(SIGINT, ctrlc_kezelo) == SIG_IGN) signal(SIGINT, SIG_IGN); for(;;) putchar(getchar()); return 0;}
Akkor mgis hogyan lltsuk meg elegnsan?
$ ./megszakit3Megprobaltal megallitani?Megprobaltal megallitani?Megprobaltal megallitani?Ctrl+z[1]+ Stopped ./megszakit3$ kill %1[1]+ Stopped ./megszakit3$[1]+ Terminated ./megszakit3
III.1.4.1 Nem loklis ugrsokBevezets:
$ man setjmp$ man longjmp
#include #include #include sigjmp_buf jmpbuf;void kezdjuk_ujra(int sig){ signal(SIGINT, kezdjuk_ujra); printf("Megzavartal, ujra kezdjuk\a\n"); siglongjmp(jmpbuf, 0);}intmain(void){ if(signal(SIGINT, kezdjuk_ujra) == SIG_IGN) signal(SIGINT, SIG_IGN); sigsetjmp(jmpbuf, 1); for(;;) putchar(getchar()); return 0;}
42
-
Remek alkalmazst lthatjuk a nem loklis ugrsnak az 45. oldalon a Crashme azopercis rendszer robosztussgnak vizsglata cm fejezetben.
III.1.4.2 SigactionBevezets:
$ man sigaction
Korbbi Ctrl+c elkap programunkat rjuk t a sigaction-t hasznlva:
#include #include void ctrlc_kezelo(int sig){ printf("Megprobaltal megallitani?\a\n");}intmain(void){ struct sigaction sa; sa.sa_handler = ctrlc_kezelo; sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART; sigaction(SIGINT, &sa, NULL); for(;;) putchar(getchar()); return 0;}
Jelen plda egy gyakorlati hasznlatt tallhatjuk az 123. oldalon, a Prhuzamos, IOmultiplexelssel cm fejezet msodik pldjban.
III.1.4.2.1 A riaszts alkalmazsaMit csinl a kvetkez plda?
#include #include #include voidnem_nyomtal (int sig){ printf ("\nNem nyomtal!!!\a\n");}intmain (void){ struct sigaction sa; sa.sa_handler = nem_nyomtal; sigemptyset (&sa.sa_mask); sigaction (SIGALRM, &sa, NULL); printf ("Nyomj egy Enter-t 3 masodpercen belul!\n"); alarm (3);
43
-
getchar (); alarm (0); return 0;}
Jelen plda egy gyakorlati hasznlatt tallhatjuk az 152. oldalon, a A nemmegbzhatsg szimullsa cm pontban.
Remek alkalmazst lthatjuk a riasztsnak a 45. oldalon a Crashme az opercisrendszer robosztussgnak vizsglata cm fejezetben.
III.1.5 Jtk zombikkalVessk ssze az albbi brt s programot!
#include #include #include #include #include #include voidstyx (int sig){ printf("%d\n", wait (NULL)); fflush(stdout);}intmain (void){ int gyermekem_pid; struct sigaction sa; sa.sa_handler = styx; sigemptyset (&sa.sa_mask); sa.sa_flags = SA_RESTART; sigaction (SIGINT, &sa, NULL); if ((gyermekem_pid = fork ()) != -1) { if (gyermekem_pid)
{ printf ("Szulo folyamat PID: %d, gyermekem: %d szulom %d\n",
getpid (), gyermekem_pid, getppid ()); for (;;) { printf ("Alszok...\n"); fflush (stdout); sleep (1); } }
else { printf ("Gyermek folyamat PID: %d, szulom: %d\n", getpid (),
getppid ()); exit (EXIT_SUCCESS); }
}
44
-
else { printf ("Sikertelen a gyermek folyamat letrehozasa\n"); exit (EXIT_FAILURE); } return 0;}
Futtassuk, mikzben egy msik ablakban (pl. top) folyamatosan figyeljnk a zombi megjelensre! Aztn Ctrl+C. Elemezzk a mkdst a kvetkez bra segtsgvel:
III.1.5.1 Feladat SIGCHLDMdostsuk gy az imnti programot, hogy s szl a SIGCHLD jelre wait()-eljen!
Vessk ssze ezt a megoldst a 108. oldal Krdsek a prhuzamos szerverrl cm pontjval!
III.1.6 rdekes pldk
III.1.6.1 Crashme az opercis rendszer robosztussgnak vizsglataA George J Carrette ltal rt Crashme program remek plda az elz kt fejezetben
megismertek gyakorlati alkalmazsra, mert tallunk benne megszakts-kezelst, riasztst, nem loklis ugrst. (A program tanulmnyozsa eltt rdemes megnzni a Vletlen cm fejezetet is.)
45
bra 7: A Jtk zombikkal programjnak magyarz rajza: a Ctrl+c megnyomsval a gyermeket a styx() kezel kiviszi a zombi llapotbl
fork()
Szl g Gyermek g
for(;;)
exit()
wait()
SIGINTZOMBI
-
Letlts:http://packages.debian.org/stable/source/crashme
A mkds vzlata:A badboy_loop() fggvnybeli fciklusbl hvott compute_badboy() fggvny vletlen bjtokkal tlti fel a parancssorban megadott mret memriaterletet, az ide mutat pointert typedef void (*BADBOY)(); fggvnymutatra knyszerti, amit majd egyszeren meghv a kvetkez lpsek elvgzse utn:
setjmp mentst vgez a nem loklis ugrshoz a megfelel jelekre belltja az again_handler megszaktskezelt (ahonnan adott
esetben vgrehajtja majd a nem loklis ugrst) 10 msodperc mlvra kr egy riasztst
(Ha nem fordul le a make-re, akkor a 263. sorban az act.sa_mask = 0; helyett rjuk be, hogy sigemptyset(&act.sa_mask);!)
III.1.7 Folyamatok kommunikcija, IPC
III.1.7.1 SzemaforokNzzk meg a 111. oldal A folyamatok sszehangolsa szemaforral cm pont
pldjt! Ezen az l pldn keresztl tanulmnyozzuk a szemaforok hasznlatt. Fordtsuk, futtassuk, majd a forrs alapjn elemezzk az albbi logolst: (ugyanezt a kimenetet a hivatkozott rszben is kiemeltk, de ott ms rszeit emeltk ki)
$ ./szerver127.0.0.1:2005szemafor: 327688zar elott: 2661zar utan accept elott: 2661zar elott: 2662zar elott: 2663zar elott: 2665zar elott: 2664 127.0.0.1:32884zar elott: 2661zar utan accept elott: 2662...
Kzben adjuk ki a kvetkez parancsot:
$ ipcs------ Shared Memory Segments --------...------ Semaphore Arrays --------key semid owner perms nsems...0xffffffff 327688 norbi 600 1 ------ Message Queues --------.
46
-
..
A /proc fundamentalistk kedvrt:$ more /proc/sysvipc/sem
A szerver lelvse utn trljk a szemafortmbt:ipcrm -s 327688
Parancsok: ipc, ipcrm
llomnyok: /proc/sysvipc/sem
III.1.7.2 SocketekLoklis IPC.
$ man 7 unix
Ebben a pontban a loklis, azaz az ugyanazon a gpen fut folyamatok kztti, socketekkel megvalstott kommunikcival foglalkozunk. Ha a folyamatok klnbz hosztokon vannak, akkor a 102. oldal, Socket programozs cm fejezett javasoljuk az rdekldknek. Egybknt ezt a hivatkozott fejezetet azrt is ajnljuk, mert a szban forg kt esetben a programozs gyakorlatilag ugyanaz. Olyannyira, hogy az itteni pldaprogramokat a hlzati rsz pldinak kis mdostsval ksztjk el. A szervert pldul a 102. oldal, Soros,azaz iteratv cm pont pldjbl:
#include #include #include #include #include #include #include #define SZERVER_SOR_MERET 10#define CTIME_BUFFER_MERET 128intkiszolgal(int kliens){ char buffer[CTIME_BUFFER_MERET] = ""; time_t t = time(NULL); char *ts = ctime_r(&t, buffer); return write(kliens, ts, strlen(ts));}intmain (void){ int kapu_figyelo, kapcsolat, kliensm; struct sockaddr_un szerver, kliens; memset ((void *) &szerver, 0, sizeof (szerver));
47
-
szerver.sun_family = AF_LOCAL; strncpy (szerver.sun_path, "szerver.socket", sizeof (szerver.sun_path)); if ((kapu_figyelo = socket (PF_LOCAL, SOCK_STREAM, 0)) == -1) { perror ("socket"); exit (EXIT_FAILURE); } if (bind (kapu_figyelo, (struct sockaddr *) &szerver,
sizeof (szerver)) == -1) { perror ("bind"); exit (EXIT_FAILURE); } if (listen (kapu_figyelo, SZERVER_SOR_MERET) == -1) { perror ("listen"); exit (EXIT_FAILURE); } for (;;) { memset ((void *) &kliens, 0, (kliensm = sizeof (kliens))); if ((kapcsolat = accept (kapu_figyelo,
(struct sockaddr *) &kliens, (socklen_t *) & kliensm)) == -1)
{ perror ("accept"); exit (EXIT_FAILURE);}
if (kiszolgal (kapcsolat) == -1){ perror ("kiszolgal");}
close (kapcsolat); }}
A klienst pedig a 132. oldal, C socket kliens cm pont pldjbl:
#include #include #include #include #include #include #define BUFFER_MERET 256intmain (void){ int kapu, olvasva; struct sockaddr_un szerver; char buffer[BUFFER_MERET]; memset ((void *) &szerver, 0, sizeof (szerver)); szerver.sun_family = AF_LOCAL; strncpy (szerver.sun_path, "szerver.socket", sizeof (szerver.sun_path)); if ((kapu = socket (PF_LOCAL, SOCK_STREAM, 0)) == -1)
48
-
{ perror ("socket"); exit (EXIT_FAILURE); } if (connect (kapu, (struct sockaddr *) &szerver, sizeof (szerver)) == -1) { perror ("connect"); exit (EXIT_FAILURE); } while ((olvasva = read (kapu, buffer, BUFFER_MERET)) > 0) write (1, buffer, olvasva); exit (EXIT_SUCCESS);}
Mit mond a szerver a kvetkez futtatskor, ha nem trljk a ktskor ltrehozott, albbi socket tpus fjlt?
$ ls -l szerver.socketsrwxrwxr-x 1 norbi norbi 0 Oct 31 20:45 szerver.socket
Kifinomultabb szerkezet szerveroldalrl a mr hivatkozott a 102. oldal, Socketprogramozs cm pontjban olvashatunk.
A
$ man 7 unix
tanulmnyozsa mellett nzzk meg, mi trtnik, ha a szerverben s a kliensben elvgezzk az albbi mdostst:
strncpy (szerver.sun_path, "\0szerver.socket", sizeof (szerver.sun_path));
III.1.7.2.1 Feladat ugyanez UDP-velKsztsk el az elz pont kliens-szerver IPC pldjt, de most UDP-t hasznlva,
segtsgl pldul a 148. oldal UDP szerver, kliens cm pontjt megnzve!
#include #include #include #include #include #include #include #include #include #define SZERVER_PORT 2005#define BUFFER_MERET 64intmain (void){
49
-
int kapu_figyelo, kliensm; char buffer[BUFFER_MERET]; time_t t; struct sockaddr_un szerver, kliens; memset ((void *) &szerver, 0, sizeof (szerver)); szerver.sun_family = AF_LOCAL; strncpy (szerver.sun_path, "szerver.socket", sizeof (szerver.sun_path)); if ((kapu_figyelo = socket (PF_LOCAL, SOCK_DGRAM, 0)) == -1) { perror ("socket"); exit (EXIT_FAILURE); } if (bind (kapu_figyelo, (struct sockaddr *) &szerver,
sizeof (szerver)) == -1) { perror ("bind"); exit (EXIT_FAILURE); } for (;;) { memset ((void *) &kliens, 0, (kliensm = sizeof (kliens)));
if (recvfrom (kapu_figyelo, buffer, BUFFER_MERET, 0, (struct sockaddr *) &kliens, (socklen_t *) & kliensm)
< 0) { perror ("recvfrom"); exit (EXIT_FAILURE); }
t = time (NULL); ctime_r (&t, buffer); if (sendto (kapu_figyelo, buffer, strlen (buffer), 0,
(struct sockaddr *) &kliens, (socklen_t) kliensm) < 0) { perror ("sendto"); exit (EXIT_FAILURE); }
}}
A kliens:
#include #include #include #include #include #include #include #include #include #define SZERVER_PORT 2005#define BUFFER_MERET 64intmain (void){
50
-
int kapu, olvasva, szerverm; struct sockaddr_un szerver, kliens; char buffer[BUFFER_MERET] = "Mennyi az ido?"; memset ((void *) &szerver, 0, (szerverm = sizeof (szerver))); szerver.sun_family = AF_LOCAL; strncpy (szerver.sun_path, "szerver.socket", sizeof (szerver.sun_path)); if ((kapu = socket (PF_LOCAL, SOCK_DGRAM, 0)) == -1) { perror ("socket"); exit (EXIT_FAILURE); } memset ((void *) &kliens, 0, sizeof (kliens)); kliens.sun_family = AF_LOCAL; strncpy (kliens.sun_path, "kliens.socket", sizeof (kliens.sun_path)); if (bind (kapu, (struct sockaddr *) &kliens, sizeof (kliens)) == -1) { perror ("bind"); exit (EXIT_FAILURE); } if (sendto (kapu, buffer, strlen (buffer), 0,
(struct sockaddr *) &szerver, (socklen_t) szerverm) < 0) { perror ("sendto"); exit (EXIT_FAILURE); } if ((olvasva = recvfrom (kapu, buffer, BUFFER_MERET, 0,
(struct sockaddr *) &szerver, (socklen_t *) & szerverm)) < 0)
{ perror ("recvfrom"); exit (EXIT_FAILURE); } printf("%s", buffer); exit (EXIT_SUCCESS);}
Hasonltsu ssze ezt klienst a 148. oldal UDP szerver, kliens cm pontjnak kliensvel! Mi a klnbsg?
III.1.7.2.2 Anonim socketek
$ man socketpair
Az elz ponthoz hasonlan most is egy daytime jelleg pldt ksztnk. A hlzati rszben hasznlt funkcionaltst a 40. oldal, a A fork() tipikus hasznlata cm pontjnak pldjba ntjk:
#include #include #include
51
-
#include #include #include #include #define BUFFER_MERET 256#define CTIME_BUFFER_MERET 128intkiszolgal(int kliens){ char buffer[CTIME_BUFFER_MERET] = ""; time_t t = time(NULL); char *ts = ctime_r(&t, buffer); return write(kliens, ts, strlen(ts));}intmain (){ int gyermekem_pid; int sv[2]; if (socketpair (AF_LOCAL, SOCK_STREAM, 0, sv) == -1) { perror ("socketpair"); exit (EXIT_FAILURE); } if ((gyermekem_pid = fork ()) == 0) { char buffer[BUFFER_MERET]; int olvasva; close (sv[1]); olvasva = read (sv[0], buffer, BUFFER_MERET); write (1, buffer, olvasva); close (sv[0]); } else if (gyermekem_pid > 0) { close (sv[0]); kiszolgal (sv[1]); close (sv[1]); } else { exit (EXIT_FAILURE); } return 0;}
Tovbbi pldt tallunk az anonim socketekre a kvetkez pont sszehasonltsnl.
III.1.7.2.3 Csvezetkek
$ man pipe
A plda megvlasztsnl megint csak az elz ponthoz hasonlan jrunk el.
52
-
#include #include #include #include #include #include #define BUFFER_MERET 256#define CTIME_BUFFER_MERET 128intkiszolgal(int kliens){ char buffer[CTIME_BUFFER_MERET] = ""; time_t t = time(NULL); char *ts = ctime_r(&t, buffer); return write(kliens, ts, strlen(ts));}intmain (){ int gyermekem_pid; int sv[2]; if (pipe (sv) == -1) { perror ("pipe"); exit (EXIT_FAILURE); } if ((gyermekem_pid = fork ()) == 0) { char buffer[BUFFER_MERET]; int olvasva; close (sv[1]); olvasva = read (sv[0], buffer, BUFFER_MERET); write (1, buffer, olvasva); close (sv[0]); } else if (gyermekem_pid > 0) { close (sv[0]); kiszolgal (sv[1]); close (sv[1]); } else { exit (EXIT_FAILURE); } return 0;}
Szinte csak a rendszerhvst rtuk t az elz pldhoz kpest, akkor miben tbb a socketpair() plda, mint a pipe() plda? Ebben:
#include #include #include #include #include #include
53
-
#include #define BUFFER_MERET 256#define CTIME_BUFFER_MERET 128intkiszolgal(int kliens){ char buffer[CTIME_BUFFER_MERET] = ""; time_t t = time(NULL); char *ts = ctime_r(&t, buffer); return write(kliens, ts, strlen(ts));}intmain (){ int gyermekem_pid; int sv[2]; char buffer[BUFFER_MERET]; int olvasva; if (socketpair (AF_LOCAL, SOCK_STREAM, 0, sv) == -1) { perror ("socketpair"); exit (EXIT_FAILURE); } if ((gyermekem_pid = fork ()) == 0) { close (sv[1]); olvasva = read (sv[0], buffer, BUFFER_MERET); write (1, buffer, olvasva); kiszolgal (sv[0]); close (sv[0]); } else if (gyermekem_pid > 0) { close (sv[0]); kiszolgal (sv[1]); olvasva = read (sv[1], buffer, BUFFER_MERET); write (1, buffer, olvasva); close (sv[1]); } else { exit (EXIT_FAILURE); } return 0;}
III.1.7.2.3.a Jtk az tirnytssal
$ man dup
Induljunk ki a 40. oldal, a A fork() tipikus hasznlata cm pontjnak pldjbl: a gyermek ltal indtott program kimenett juttassuk el a szlnek:
54
-
#include #include #include #include #define BUFFER_MERET 256intmain (void){ int gyermekem_pid; int sv[2]; if (pipe (sv) == -1) { perror ("pipe"); exit (EXIT_FAILURE); } if ((gyermekem_pid = fork ()) == 0) { close (1); dup (sv[1]); char *args[] = { "/bin/ls", "-l", NULL }; execve ("/bin/ls", args, NULL); exit (0); } else if (gyermekem_pid > 0) { char buffer[BUFFER_MERET]; int olvasva; close (sv[1]); while ((olvasva = read (sv[0], buffer, BUFFER_MERET - 1)) > 0)
write (1, buffer, olvasva); close (sv[0]); } else { exit (EXIT_FAILURE); } return 0;}
III.1.7.3 zenetsorokNzzk meg a linux/msg.h-ban [OS/KO] az msgbuf s az msg_msg struktrk
deklarcijt! Ugyanitt nzzk meg, hogy mekkora a max zenetmret? (MSGMAX)
Megintcsak a 40. oldal, a A fork() tipikus hasznlata cm pontjnak pldjnak programjbl indulunk ki: a gyermek megrja a szlnek, hny az ra.
55
-
$ man 2 msgget$ man 2 msgop
#include #include #include #include #include #include #include #include #include #define IDO_MERET 48struct ido{ long mtype; char ido[IDO_MERET];};intmain (){ int gyermekem_pid; int uzenetsor; if ((uzenetsor = msgget (ftok (".", 43), IPC_CREAT | S_IRUSR | S_IWUSR)) == -1) { perror ("msgget"); exit (EXIT_FAILURE); } if ((gyermekem_pid = fork ()) == 0) { struct ido ido;
56
bra 8: Az zenetsor megosztsa a pldban.
fork()
Szl g Gyermek g
msgsnd()
msgget()
msgrcv()
-
time_t t = time (NULL); ctime_r (&t, ido.ido); ido.mtype = 42; if (msgsnd (uzenetsor, &ido, sizeof (struct ido) - sizeof (long), 0))
{ perror ("msgsnd"); exit (EXIT_FAILURE); }
exit (EXIT_SUCCESS); } else if (gyermekem_pid > 0) { struct ido ido; if (msgrcv (uzenetsor, &ido, sizeof (struct ido) - sizeof (long), 42, 0) < 0)
{ perror ("msgrcv"); exit (EXIT_FAILURE); }
printf ("%s", ido.ido); } else { exit (EXIT_FAILURE); } if (msgctl (uzenetsor, IPC_RMID, NULL)) { perror ("msgctl"); exit (EXIT_FAILURE); } return 0;}
llomnyok: /proc/sysvipc/msg, /proc/sys/kernel/msgmax
III.1.7.3.1 Feladatrjunk kt programot, az egyik rja be egy zenetsorba az idt, a msik olvassa ki!
Ami kzs, az az zenet, helyezzk pldul az uzenet.h fjlba:#define IDO_MERET 48struct ido{ long mtype; char ido[IDO_MERET];};
A berakst vgz program:
#include #include #include #include #include
57
-
#include #include #include #include #include "uzenet.h"intmain (){ int uzenetsor; struct ido ido; time_t t = time (NULL); ctime_r (&t, ido.ido); ido.mtype = 42; if ((uzenetsor = msgget (ftok (".", 43), IPC_CREAT | S_IRUSR | S_IWUSR)) == -1) { perror ("msgget"); exit (EXIT_FAILURE); } if (msgsnd (uzenetsor, &ido, sizeof (struct ido) - sizeof (long), 0)) { perror ("msgsnd"); exit (EXIT_FAILURE); } exit (EXIT_SUCCESS);}
A kivtelt vgz program:
#include #include #include #include #include #include #include #include #include #include "uzenet.h"intmain (){ int uzenetsor; struct ido ido; if ((uzenetsor = msgget (ftok (".", 43), IPC_CREAT | S_IRUSR | S_IWUSR)) == -1) { perror ("msgget"); exit (EXIT_FAILURE); } if (msgrcv (uzenetsor, &ido, sizeof (struct ido) - sizeof (long), 42,
0) < 0) {
58
-
perror ("msgrcv"); exit (EXIT_FAILURE); } printf ("%s", ido.ido); exit (EXIT_SUCCESS);}
Mi trtnik, ha pldul hromszor futtatjuk a berakst, ngyszer a kivtelt, majd jra a berakst?
Ha vgeztnk a ksrletezssel, ne felejtsk el trlni az zenetsort:
$ ipcs
------ Shared Memory Segments --------key shmid owner perms bytes nattch status
------ Semaphore Arrays --------key semid owner perms nsems
------ Message Queues --------key msqid owner perms used-bytes messages0x2b05582b 32768 norbi 600 0 0$ ipcrm msg 32768resource(s) deleted
Mi trtnik, ha a kt program kzl az egyiket elmsoljuk egy msik knyvtrba s az egyiket innen, a msikat pedig onnan futtatva prbljuk hasznlni az zenetsort?
III.1.7.4 Osztott memriaNzzk meg az asm/shmbuf.h-ban [OS/KO] az shmid64_ds struktra
deklarcijt!
Most is mint az elz pont pldjnl a gyermek megrja a szlnek, hny az ra. Megoldsknt is az emltett, elz pldbl indulunk ki.
59
-
$ man 2 shmget$ man 2 shmop
#include #include #include #include #include #include #include #include #include #include #define IDO_MERET 48voidebreszto (){ printf ("Ebreszto, Neo!\n");}intmain (){
60
bra 9: Az osztott memria megosztsa a pldban.
fork()
Szl g Gyermek g
strncpy()
shmat()
pause() SIGALRM
printf()
shmget()
-
int gyermekem_pid; int osztott_memoria; char *osztott_memoria_terulet; if ((osztott_memoria = shmget (ftok (".", 44), 64, IPC_CREAT | S_IRUSR | S_IWUSR)) == -1) { perror ("shmget"); exit (EXIT_FAILURE); } if ((osztott_memoria_terulet = shmat (osztott_memoria, NULL, 0)) < 0) { perror ("shmat"); exit (EXIT_FAILURE); } if ((gyermekem_pid = fork ()) == 0) { char buffer[IDO_MERET]; time_t t = time (NULL); char *p = ctime_r (&t, buffer); strncpy (osztott_memoria_terulet, p, IDO_MERET); sleep (2); kill (getppid (), SIGALRM); if (shmdt (osztott_memoria_terulet) == -1)
{ perror ("shmdt"); exit (EXIT_FAILURE); }
exit (EXIT_SUCCESS); } else if (gyermekem_pid > 0) { signal (SIGALRM, ebreszto); pause (); printf ("%s", osztott_memoria_terulet); if (shmdt (osztott_memoria_terulet) == -1)
{ perror ("shmdt"); exit (EXIT_FAILURE); }
} else { exit (-1); } if (shmctl (osztott_memoria, IPC_RMID, NULL)) { perror ("shmctl"); exit (EXIT_FAILURE); } return 0;}
lltsuk nagyobbra a gyermekben az alvsi idt s kzben:
$ ipcs
61
-
------ Shared Memory Segments --------key shmid owner perms bytes nattch status0x2c05582b 524290 norbi 600 64 2------ Semaphore Arrays --------key semid owner perms nsems
------ Message Queues --------key msqid owner perms used-bytes messages
llomnyok: /proc/sysvipc/shm
Vlaszoljuk meg a 284. oldal, IPC-vel kapcsolatos krdsek cm fejezetnek krdseit!
III.1.7.4.1 Feladatrjunk kt programot, az egyik rja be az osztott memriatartomnyba az idt, a msik
olvassa azt ki onnan!
Az rst vgz program:
#include #include #include #include #include #include #include #include #include #define IDO_MERET 48intmain (){ int osztott_memoria; char *osztott_memoria_terulet; char buffer[IDO_MERET]; time_t t = time (NULL); char *p = ctime_r (&t, buffer);
if ((osztott_memoria = shmget (ftok (".", 44), 64, IPC_CREAT | S_IRUSR | S_IWUSR)) == -1) { perror ("shmget"); exit (EXIT_FAILURE); } if ((osztott_memoria_terulet = shmat (osztott_memoria, NULL, 0)) < 0) {
62
-
perror ("shmat"); exit (EXIT_FAILURE); } strncpy (osztott_memoria_terulet, p, IDO_MERET); if (shmdt (osztott_memoria_terulet) == -1) { perror ("shmdt"); exit (EXIT_FAILURE); } exit (EXIT_SUCCESS);}
Az olvasst vgz program:
#include #include #include #include #include #include #include #include #define IDO_MERET 48intmain (){ int osztott_memoria; char buffer[IDO_MERET]; char *osztott_memoria_terulet; if ((osztott_memoria = shmget (ftok (".", 44), 64, IPC_CREAT | S_IRUSR | S_IWUSR)) == -1) { perror ("shmget"); exit (EXIT_FAILURE); } if ((osztott_memoria_terulet = shmat (osztott_memoria, NULL, 0)) < 0) { perror ("shmat"); exit (EXIT_FAILURE); } strncpy (buffer, osztott_memoria_terulet, IDO_MERET); buffer[IDO_MERET] = '\0'; printf ("%s", buffer); if (shmdt (osztott_memoria_terulet) == -1) { perror ("shmdt"); exit (EXIT_FAILURE); } return 0;}
63
-
III.1.8 Konkurencia
III.1.8.1 POSIX szlak
#include #include void *szal(void *id){ printf("Szal: %d, %d\n", *(int *)id, pthread_self()); *(int *)id *= 2; return id;}intmain(void){ pthread_t sz1, sz2; int s1 = 1, s2 = 2, *r; if(pthread_create(&sz1, NULL, szal, (void *)&s1)) exit(-1); if(pthread_create(&sz2, NULL, szal, (void *)&s2)) exit(-1); pthread_join(sz1, (void *) &r); printf("%d\n", *r); pthread_join(sz2, (void *) &r); printf("%d\n", *r); return 0;}
Hogyan fordtjuk:
$ gcc -lpthread -o pszal1 pszal1.c
III.1.8.1.1 A fork() s pthread sszehasonltsHasonltsuk ssze az albbi kt programot:
III.1.8.1.1.a fork()A fork()-osat:
#include #include #include #include #define FORKOK_SZAMA 1000intmain(void){ int i; int gyermekem_pid; int statusz; clock_t delta = clock(); for(i=0; i
-
exit(0); } else if(gyermekem_pid > 0) { wait(&statusz); } else { printf("Hiba\n"); exit(-1); } delta = clock() - delta; printf("delta: %f sec\n", (double)delta/CLOCKS_PER_SEC); return 0;}
III.1.8.1.1.b pthread
s a pthread-eset:
#include #include #include #define SZALAK_SZAMA 1000void *szal(void *id){ return id;}intmain(void){ pthread_t sz[SZALAK_SZAMA]; int s[SZALAK_SZAMA], *r, i; unsigned long delta = clock(); for(i=0; i
-
III.1.8.1.1.c CPU id
man clockman times
A clock() s CLOCKS_PER_SEC-et lsd az elz kt pldban!
Hasznljuk most ezt:
#include #include #include #include #define FORKOK_SZAMA 1000intmain(void){ int i; int gyermekem_pid; int statusz; struct tms tmsbuf1, tmsbuf2; times(&tmsbuf1); for(i=0; i 0) { wait(&statusz); } else { printf("Hiba\n"); exit(-1); } times(&tmsbuf2); printf("%d\n", tmsbuf2.tms_utime-tmsbuf1.tms_utime +tmsbuf2.tms_stime-tmsbuf1.tms_stime); return 0;}
III.1.8.1.2 Pthread-es mutex zrakHogy ltvnyosabb eredmnyeket produkljunk, ennek a fejezetnek a pldit egy tbb
processzoros, az albbi rendszerben futtatjuk. Rszlet a $ top -u nbatfai bl:
Cpu0 : 0.0% user, 0.4% system, 0.0% nice, 99.6% idle Cpu1 : 3.2% user, 0.4% system, 0.0% nice, 96.4% idle Cpu2 : 1.3% user, 0.7% system, 0.0% nice, 98.1% idle Cpu3 : 3.6% user, 0.4% system, 0.0% nice, 96.0% idle Cpu4 : 0.0% user, 1.0% system, 0.0% nice, 98.9% idle
66
-
Cpu5 : 0.7% user, 0.7% system, 0.0% nice, 98.5% idle
Futtassuk s hasonltsuk ssze az albbi kt programot:
III.1.8.1.2.a Zr nlkl
#include #include #include #define SZALAK_SZAMA 100int szamlalo = 0;voidvar(void){ int i, r = 1+(int) (10000.0*rand()/(RAND_MAX+1.0)); for(i=0; i
- } for(i=0; i
- fflush(stdout); var(); pthread_mutex_lock(&szamlalo_zar); szamlalo = szamlalo - 1; pthread_mutex_unlock(&szamlalo_zar); } return id;}intmain(void){ pthread_t sz[SZALAK_SZAMA]; int s[SZALAK_SZAMA], *r, i; for(i=0; i
-
IV. Konkurens programozs
IV.1 Szemaforok
IV.1.1 Programozzunk az ebdel filozfusokkalA feladat [OS/OS 93. oldal, vagy a FG elads] elrendezst a kvetkez bra mutatja:
IV.1.1.1 C-ben szlakkalA kvetkezkben megismerkednk a pthread szemaforokkal s a feltteles vltozkkal
kapcsolatos fggvnyekkel.Kezdjnk el foglalkozni a feladattal, egy filozfust egy szllal jelkpezve:
#include #include #define FILOSZOK_SZAMA 5void *egy_filosz(void *id){ printf("%d. filosz jelen.\n", *(int *)id); fflush(stdout); return id;}intmain(void){ pthread_t filosz_szal[FILOSZOK_SZAMA]; int filosz_szal_arg[FILOSZOK_SZAMA]; int i, *r; for(i=0; i
-
} return 0;}
Hasznljunk POSIX szemaforokat!
man sem_init
A villkhoz rendelt szemaforokkal jelezzk, hogy szabadok-e:
#include #include #include #define FILOSZOK_SZAMA 5sem_t villa[FILOSZOK_SZAMA];void *egy_filosz(void *id){ int sorszam = *(int *)id; printf("%d. filosz jelen.\n", sorszam); fflush(stdout); for(;;) { sem_wait(villa+sorszam); sem_wait(villa+((sorszam+1) % FILOSZOK_SZAMA)); printf("%d. filosz ebedel.\n", sorszam); fflush(stdout); sem_post(villa+sorszam); sem_post(villa+((sorszam+1) % FILOSZOK_SZAMA)); } return id;}intmain(void){ pthread_t filosz_szal[FILOSZOK_SZAMA]; int filosz_szal_arg[FILOSZOK_SZAMA]; int i, *r; for(i=0; i
-
$ gcc -lpthread -o filo filo2f.c...3. filosz ebedel.2. filosz ebedel.1. filosz ebedel.0. filosz ebedel.0. filosz ebedel.4. filosz ebedel.
egy darabig elfutkrozik, de aztn lemerevedik s tbb nem ezzel a programmal mr nem esznek a filoszok! Mi okozza a problmt?Mi trtnik, ha mind az t filosz megszerzi az els villja szemaforjt? Tapasztaljuk is meg ezt a szitucit:
sem_wait(villa+sorszam); printf("%d. filosz a 2. sem elott.\n", sorszam); fflush(stdout); sem_wait(villa+((sorszam+1) % FILOSZOK_SZAMA));
Lssuk:
.
.
.2. filosz 2 sem elott.4. filosz 2 sem elott.1. filosz 2 sem elott.3. filosz 2 sem elott.0. filosz 2 sem elott.
Sikerlt elkapnunk egy pomps kimenetet (persze az is elfordulhat, hogy az t X. filosz 2 sem elott. nem ilyen szpen a vgn sorakozik, akkor a hinyzkat fljebb talljuk). Rajzoljuk most le, amit ez a kimenet mutat:
IV.1.1.1.1.a Holtpont
72
bra 11 Ebdel filoszok holtpont
0.
1.
2.
3.
4.1.
2.
0.
3.
4.Ebdlasztal
wait(2.)
wait(3.)
wait(4.)
wait(0.)
wait(1.)
-
(Egy msik krds, hogy mirt nem dolgozzuk be a sem_init-et tartalmaz ciklust a mr meglvbe?)
Prblkozzunk a problma megoldsval:
#include #include #include #define FILOSZOK_SZAMA 5sem_t villa[FILOSZOK_SZAMA];pthread_mutex_t villak_zar;void *egy_filosz(void *id){ int sorszam = *(int *)id; printf("%d. filosz jelen.\n", sorszam); fflush(stdout); for(;;){ pthread_mutex_lock(&villak_zar); sem_wait(villa+sorszam); sem_wait(villa+((sorszam+1) % FILOSZOK_SZAMA)); pthread_mutex_unlock(&villak_zar); printf("%d. filosz ebedel.\n", sorszam); fflush(stdout); sem_post(villa+sorszam); sem_post(villa+((sorszam+1) % FILOSZOK_SZAMA)); } return id;}intmain(void){ pthread_t filosz_szal[FILOSZOK_SZAMA]; int filosz_szal_arg[FILOSZOK_SZAMA]; int i, *r; for(i=0; i
-
0. filosz ebedel.4. filosz ebedel.2. filosz ebedel.3. filosz ebedel.1. filosz ebedel.0. filosz ebedel.4. filosz ebedel.2. filosz ebedel.0. filosz ebedel.3. filosz ebedel....
Elemezzk ezt az imnti megoldst! Mi a hibja? Nzzk meg a bevezet brt s folytassik az albbi gondolatmenetet! Tegyk fel, hogy a 0. filosz ebdel s kzben az 1. filosz belp a mutex-el vdett kritikus szakaszba, de a 0. filosz sokig ebdel, gy a 1. villra sokat kell vrni... pedig kzben pldul a 2. filosz ebdelhetne, (persze ha az 1. s 3. ppen nem ebdel.). Tapasztaljuk is meg ezt a szitucit, tartson az ebd 10 msodpercig s rjuk ki, ha egy filosz be/kilpett a kritikus szakaszba/bl:
void *egy_filosz(void *id){ int sorszam = *(int *)id; for(;;){ pthread_mutex_lock(&villak_zar); printf("%d. filosz belepett a kritikus szakaszba.\n", sorszam); fflush(stdout); sem_wait(villa+sorszam); sem_wait(villa+((sorszam+1) % FILOSZOK_SZAMA)); pthread_mutex_unlock(&villak_zar); printf("%d. filosz kilepett a kritikus szakaszbol.\n", sorszam); fflush(stdout); printf("%d. filosz ebedel...\n", sorszam); fflush(stdout); sleep(10); printf("%d. filosz megebedelt.\n", sorszam); fflush(stdout); sem_post(villa+sorszam); sem_post(villa+((sorszam+1) % FILOSZOK_SZAMA)); } return id;}
s valban tapasztaljuk is a fent elgondolt szitucit:
0. filosz belepett a kritikus szakaszba.0. filosz kilepett a kritikus szakaszbol.0. filosz ebedel...1. filosz belepett a kritikus szakaszba.
Itt telik a 10 msodperc...
0. filosz megebedelt.1. filosz kilepett a kritikus szakaszbol.
74
-
1. filosz ebedel...2. filosz belepett a kritikus szakaszba.
1. filosz megebedelt.2. filosz kilepett a kritikus szakaszbol.2. filosz ebedel...3. filosz belepett a kritikus szakaszba....
Prbljuk ezt a problmt megoldani a sem_trywait() hasznlatval:
man sem_trywait
void *egy_filosz(void *id){ int sorszam = *(int *)id; int nincsmeg_ket_villa = 0; for(;;){ do { pthread_mutex_lock(&villak_zar); nincsmeg_ket_villa = sem_trywait(villa+sorszam); if(nincsmeg_ket_villa == 0) { nincsmeg_ket_villa = sem_trywait(villa+((sorszam+1) % FILOSZOK_SZAMA)); if(nincsmeg_ket_villa != 0) sem_post(villa+sorszam); } pthread_mutex_unlock(&villak_zar); } while (nincsmeg_ket_villa); printf("%d. filosz ebedel...\n", sorszam); fflush(stdout); sleep(10); printf("%d. filosz megebedelt.\n", sorszam); fflush(stdout); sem_post(villa+sorszam); sem_post(villa+((sorszam+1) % FILOSZOK_SZAMA)); } return id;}
Immr egyik filosz sem birtokolja flslegesen a kritikus szakasz zrjt, de a mellett, hogy kt szlunk folyamatosan eszik, a msik hrom prblkozsai felemsztik az sszes prociidt.
.
.
.2. filosz megebedelt.2. filosz ebedel...4. filosz megebedelt.4. filosz ebedel...
2. filosz megebedelt.1. filosz ebedel...4. filosz megebedelt.4. filosz ebedel...
75
-
1. filosz megebedelt.1. filosz ebedel...4. filosz megebedelt.4. filosz ebedel......
Gondolkodjunk egy proci kml megoldson! Feltteles vltozkkal:
man pthread_cond_wait
#include #include #include #include #define FILOSZOK_SZAMA 5sem_t villa[FILOSZOK_SZAMA];pthread_mutex_t villak_zar = PTHREAD_MUTEX_INITIALIZER;pthread_cond_t villak_letetele = PTHREAD_COND_INITIALIZER;void *egy_filosz(void *id){ int sorszam = *(int *)id, r; int nincsmeg_ket_villa = 0; for(;;){ do { pthread_mutex_lock(&villak_zar); nincsmeg_ket_villa = sem_trywait(villa+sorszam); if(nincsmeg_ket_villa == 0) { nincsmeg_ket_villa = sem_trywait(villa+((sorszam+1) % FILOSZOK_SZAMA)); if(nincsmeg_ket_villa != 0) sem_post(villa+sorszam); } if(nincsmeg_ket_villa) { printf("%d. filosz villara var...\n", sorszam); fflush(stdout); pthread_cond_wait(&villak_letetele, &villak_zar); } pthread_mutex_unlock(&villak_zar); } while (nincsmeg_ket_villa); r = 1+(int) (5.0*rand()/(RAND_MAX+1.0)); printf("%d. filosz ebedel... %d secig\n", sorszam, r); fflush(stdout); sleep(r); printf("%d. filosz megebedelt.\n", sorszam); fflush(stdout); sem_post(villa+sorszam); sem_post(villa+((sorszam+1) % FILOSZOK_SZAMA)); pthread_mutex_lock(&villak_zar); pthread_cond_broadcast(&villak_letetele); pthread_mutex_unlock(&villak_zar); r = 1+(int) (5.0*rand()/(RAND_MAX+1.0)); printf("%d. filosz gondolkodik... %d secig\n", sorszam, r); fflush(stdout); sleep(r);
76
- printf("%d. filosz megehezett.\n", sorszam); fflush(stdout); } return id;}intmain(void){ pthread_t filosz_szal[FILOSZOK_SZAMA]; int filosz_szal_arg[FILOSZOK_SZAMA]; int i, *r; for(i=0; i
-
IV.1.1.3 Java-banrjuk t az elz fejezet pldjt Java nyelvre:
import java.util.concurrent.Semaphore;class Asztal { int hanySzemelyes; Semaphore villak[]; public Asztal(int hanySzemelyes) { this.hanySzemelyes = hanySzemelyes; villak = new Semaphore[hanySzemelyes]; for(int i=0; i
- catch(InterruptedException e){}; } }}public class EbedeloFiloszok { public static void main(String args[]) { Asztal asztal = new Asztal(5); Filosz [] filoszok = { new Filosz(0, asztal), new Filosz(1, asztal), new Filosz(2, asztal), new Filosz(3, asztal), new Filosz(4, asztal), }; for(int i=0; i
- Monitor.Exit(this); } public void villakLe(int ki) { Monitor.Enter(this); villak[ki].Release(); villak[(ki+1)%hanySzemelyes].Release(); Monitor.PulseAll(this); Monitor.Exit(this); }}class Filosz{ int sorszam; Asztal asztal; public Filosz(int sorszam, Asztal asztal) { this.asztal = asztal; this.sorszam = sorszam; } public void run() { for(;;) { asztal.villakFel(sorszam); Console.WriteLine(sorszam+". ebedel..."); Thread.Sleep(5000); asztal.villakLe(sorszam); Console.WriteLine(sorszam+". gondolkodik..."); Thread.Sleep(5000); } }}class EbedeloFiloszok{ static void Main() { Asztal asztal = new Asztal(5); Filosz [] filosz = { new Filosz(0, asztal), new Filosz(1, asztal), new Filosz(2, asztal), new Filosz(3, asztal), new Filosz(4, asztal), }; ThreadStart [] threadStart = new ThreadStart[filosz.Length]; Thread [] filoszok = new Thread[filosz.Length]; for(int i=0; i
-
V. Fjlrendszer
V.1 Fjlok s knyvtrak
V.1.1 Infk a fjlokrl
man 2 stat
Figyeljk meg a stat struktra st_size tagjt!
#include #include long int meret(char *nev){ struct stat s; if(stat(nev, &s) == -1) return -1; return s.st_size; // man stat: off_t st_size}int main(int argc, char *argv[]){ while(argc--) printf("%s : %d\n", argv[argc], meret(argv[argc])); return 0;}
Fordtsuk, futtassuk!
$ gcc -o meret meret.c$ ls -ltotal 24-rwxrwxr-x 1 norbi norbi 7209 Oct 30 09:21 meret-rw-rw-r-- 1 norbi norbi 306 Oct 30 09:16 meret.clrwxrwxrwx 1 norbi norbi 7 Oct 30 09:19 meret.c.forrasa -> meret.c$ ./meret meret.c meret.c.forrasa nincs /etc/passwd /boot/vmlinuz-2.6.13.4/boot/vmlinuz-2.6.13.4 : 1943304/etc/passwd : 1816nincs : -1meret.c.forrasa : 306meret.c : 306./meret : 7209
V.1.2 Knyvtrak
man readdir
Figyeljk meg a dirent struktra d_name tagjt!
#include #include #include #include
81
-
intmain(int argc, char *argv[]){ DIR *dirp; struct dirent *direntp; if(dirp = opendir(".")) { while(direntp = readdir(dirp)) printf("%s\n", direntp->d_name); } else { perror("opendir"); exit(EXIT_FAILURE); } closedir(dirp); exit(EXI