program ozo paterno sz ter

310
PROGRAMOZÓ PÁTERNOSZTER GNU FDL GNU/Lin ux C C++ Java C# TC P/IP CO RBA Swing prog ramozás Linux ker nel G TK+ G NO Hál ó z ati, kon k urens, mob il, GUI, adatbá zis Bátfai Norbert Kezdőknek és haladóknak egyaránt ajánljuk! Megdobogtatja a programozók szívét!

Upload: mtoma73

Post on 23-Nov-2015

49 views

Category:

Documents


1 download

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