linux programozas

of 610 /610
Második, átdolgozott kiadás Asztalos Márk Bányász Gábor Levendovszky Tihamér Alkalmazott informatika sorozat

Author: koati

Post on 26-Dec-2015

365 views

Category:

Documents


12 download

Embed Size (px)

DESCRIPTION

Könyvünk első kiadása óta a Linux fejlődése töretlen. A beágyazott szoftverrendszerek egyre nagyobb térhódításának köszönhetően a Linux népszerűsége is egyre nő, ezen belül számos mobileszköz – köztük okostelefonok – operációsrendszerévé vált. Ezzel együtt az operációs rendszer programozási felülete is sokat fejlődött.

TRANSCRIPT

  • Msodik, tdolgozott kiads

    Asztalos Mrk Bnysz Gbor

    Levendovszky Tihamr

    Alkalmazott informatika sorozat

  • Asztalos Mrk Bnysz Gbor Levendovszky

    Tihamr programozs

  • Asztalos Mrk Bnysz Gbor Levendovszky Tihamr

    Linux programozs

    Msodik, tdolgozott kiads

  • Asztalos Mrk

    Bnysz Gbor

    Levendovszky Tihamr

    Lin ux programozs

    Msodik, tdolgozott kiads

    2012

  • Linux programozs Msodik, tdolgozott kiads Asztalos Mrk, Bnysz Gbor, Levendovszky Tihamr

    Alkalmazott informatika sorozat

    Budapesti Mszaki s Gazdasgtudomnyi Egyetem Villamosmrnki s Informatikai Kar Automatizlsi s Alkalmazott Informatikai Tanszk Alkalmazott Informatika Csoport

    C Asztalos Mrk, Bnysz Gbor, Levendovszky Tihamr, 2012.

    Sorozatszerkeszt: Charaf Hassan Lektor: Vlgyesi Pter

    ISBN 978-963-9863-29-3 ISSN 1785-363X

    Minden jog fenntartva. Jelen knyvet, illetve annak rszeit a kiad enge-dlye nlkl tilos reproduklni, adatrgzt rendszerben trolni, brmi-lyen formban vagy eszkzzel elektronikus ton vagy ms mdon kzlni.

    SZAK Kiad Kft. Az 1795-ben alaptott Magyar Knyvkiadk s Knyvterjesztk Egyeslsnek a tagja 2060 Bicske, Difa u. 3.

    Tel.: 36-22-565-310 Fax: 36-22-565-311 www.szak.hu e-mail: [email protected] http://www.facebook.com/szakkiado Kiadvezet: Kis dm, e-mail [email protected] Fszerkesz-t: Kis Balzs, e-mail: [email protected]

  • Tartalomjegyzk

    Elsz a msodik kiadshoz ....................................... xv 1. Bevezets .......................................................... 1

    1.1. A Linux ................................................................................................. 1 1.2. A szabad szoftver s a Linux trtnete ........................................ 2

    1.2.1. FSF ................................................................................................ 2 1.2.2. GPL ................................................................................................ 3 1.2.3. GNU ............................................................................................... 4 1.2.4. Linux-kernel .................................................................................. 4 1.2.5. A Linux rendszer .......................................................................... 6 1.2.6. Linux-disztribcik ....................................................................... 6

    1.3. Informciforrsok ........................................................................... 8

    2. Betekints a Linux-kernelbe ................................. 11

    2.1. A Linux-kernel felptse .............................................................. 11 2.2. A Linux elindulsa .......................................................................... 13 2.3. Processzek ......................................................................................... 14

    2.3.1. A Linux-processzekhez kapcsold informcik ....................... 15 2.3.2. A processz llapotai .................................................................... 17 2.3.3. Azonostk ................................................................................... 18 2.3.4. Processzek ltrehozsa s terminlsa ..................................... 19 2.3.5. A programok futtatsa ............................................................... 20 2.3.6. temezs ..................................................................................... 21

    2.3.6.1. Klasszikus temezs .......................................................... 21 2.3.6.2. Az O(1) temezs ................................................................ 23 2.3.6.3. Teljesen igazsgos temez ............................................... 24 2.3.6.4. Multiprocesszoros temezs .............................................. 25

    2.3.7. Megszaktskezels .................................................................... 25 2.3.8. Valsidejsg .............................................................................. 26 2.3.9. Id s idztk ............................................................................. 26

    2.4. Memriakezels ............................................................................... 27 2.4.1. A virtulismemria-kezels ........................................................ 27 2.4.2. Lapozs ........................................................................................ 28

  • Tartalomjegyzk

    vi

    2.4.3. A lapozs implementcija a Linuxon ....................................... 29 2.4.4. Igny szerinti lapozs ................................................................. 31 2.4.5. Lapcsere ...................................................................................... 32 2.4.6. Megosztott virtulis memria .................................................... 34 2.4.7. Msols rskor (COW technika) ............................................... 34 2.4.8. A hozzfrs vezrlse ................................................................ 35 2.4.9. A lapkezels gyorstsa .............................................................. 35

    2.5. A virtulis llomnyrendszer ....................................................... 36 2.5.1. Az llomnyabsztrakci .............................................................. 36 2.5.2. Specilis llomnyok .................................................................. 38

    2.5.2.1. Eszkzllomnyok .............................................................. 38 2.5.2.2. Knyvtr ............................................................................. 40 2.5.2.3. Szimbolikus hivatkozs ...................................................... 40 2.5.2.4. Csvezetk .......................................................................... 40 2.5.2.5. Socket .................................................................................. 41

    2.5.3. Az inode ....................................................................................... 41 2.5.4. Az llomnylerk ....................................................................... 44

    2.6. A Linux programozsi fellete ..................................................... 44

    3. Programknyvtrak ksztse ............................... 47

    3.1 . Statikus programknyvtrak ...................................................... 47 3.2. Megosztott programknyvtrak .................................................. 55

    3.2.1. Megosztott programknyvtr ksztse ..................................... 56 3.2.2. Megosztott programknyvtrak hasznlata ............................. 60 3.2.3. Megosztott programknyvtrak dinamikus betltse .............. 63

    3.3. Megosztott knyvtrak C++ nyelven .......................................... 69 3.3.1. Programknyvtrbeli C++-osztlyok hasznlata ...................... 69 3.3.2. C++-objektumok dinamikus betltse

    programknyvtrbl ................................................................... 72 3.4. A megosztott knyvtrak mkdsi mechanizmusai ............. 77

    3.4.1. A betlttt program .................................................................... 78 3.4.2. Statikus knyvtrat tartalmaz program linkelse s

    betltse ...................................................................................... 80 3.4.3. Megosztott knyvtr linkelse s betltse ............................... 83

    3.4.3.1. A cmtartomny kezelse ................................................... 83 3.4.3.2. A megosztott knyvtrak megvalstsnak

    alapkoncepcii ..................................................................... 85 3.4.3.3. A megosztott knyvtrakkal kapcsolatos

    linkels s betlts .............................................................. 87 3.4.3.4. Dinamikusan linkelt megosztott knyvtr

    linkelse s betltse .......................................................... 89 3.4.4. A programknyvtrak hasznlatnak optimalizlsa ............. 89

  • Tartalomjegyzk

    vii

    4. llomny- s I/O kezels ..................................... 95

    4.1. Egyszer llomnykezels ............................................................ 95 4.1.1. Az llomnyler ......................................................................... 96 4.1.2. llomnyok megnyitsa ............................................................. 97 4.1.3. llomnyok bezrsa .................................................................. 98 4.1.4. rs, olvass s pozicionls az llomnyban ........................... 99 4.1.5. Rszleges s teljes olvass ........................................................ 101 4.1.6. Az rsmvelet finomhangolsa ............................................... 103 4.1.7. llomnyok rvidtse .............................................................. 106 4.1.8. llomnyok tirnytsa .......................................................... 106

    4.2. Inode-informcik ........................................................................ 108 4.2.1. Inode-informcik lekrdezse ................................................. 109 4.2.2. Jogok lekrdezse ..................................................................... 110 4.2.3. Jogok lltsa ............................................................................ 111 4.2.4. Tulajdonos s csoport belltsa .............................................. 112 4.2.5. Az idblyeg belltsa ............................................................. 112

    4.3. Tovbbi llomnymveletek...................................................... 113 4.3.1. Eszkzllomnyok s pipe bejegyzsek ltrehozsa ............... 113 4.3.2. Merev hivatkozs ltrehozsa .................................................. 114 4.3.3. Szimbolikus hivatkozs ltrehozsa ........................................ 115 4.3.4. llomnyok trlse ................................................................... 116 4.3.5. llomnyok tnevezse ............................................................ 116

    4.4. Knyvtrmveletek ..................................................................... 117 4.5. Csvezetkek ................................................................................. 120

    4.5.1. Nvtelen csvezetkek .............................................................. 121 4.5.2. Megnevezett csvezetkek ........................................................ 123

    4.6. Blokkolt s nem blokkolt I/O ..................................................... 126 4.7. A multiplexelt I/O mdszerei ..................................................... 129

    4.7.1. Multiplexels a select() fggvnnyel ........................................ 129 4.7.2. Multiplexels a poll() fggvnnyel ........................................... 134 4.7.3. A multiplexelsi mdszerek sszehasonltsa ......................... 139

    4.8. llomnyok lekpezse a memriba ...................................... 139 4.9. llomnyzrols ........................................................................... 143

    4.9.1. Zrolllomnyok ..................................................................... 144 4.9.2. Rekordzrols ........................................................................... 145 4.9.3. Ktelez zrols ........................................................................ 148

    4.10. Kapcsolat a magas szint llomnykezelssel .................... 149 4.11. Soros kommunikci ................................................................. 150

    4.11.1. Kanonikus feldolgozs ............................................................ 151 4.11.2. Nem kanonikus feldolgozs .................................................... 154

  • Tartalomjegyzk

    viii

    5. Prhuzamos programozs .................................. 157

    5.1. Processzek ...................................................................................... 157 5.2. Processzek kztti kommunikci (IPC) ................................ 165

    5.2.1. Szemaforok ................................................................................ 166 5.2.2. zenetsorok .............................................................................. 178 5.2.3. Megosztott memria ................................................................. 185

    5.3. Processzek a Linux rendszerben .............................................. 189 5.3.1. Feladatvezrls ......................................................................... 191 5.3.2. Dmonok .................................................................................... 193 5.3.3. Programok indtsa shellbl ..................................................... 197 5.3.4. Jogosultsgok ............................................................................ 198 5.3.5. Felhasznli nevek s csoportnevek ........................................ 200

    5.4. Szlak .............................................................................................. 202 5.4.1. Szlak ltrehozsa .................................................................... 203 5.4.2. Szlak ltrehozsa C++ nyelven .............................................. 207 5.4.3. Szlak attribtumai ................................................................. 210 5.4.4. Szlbiztos fggvnyek .............................................................. 212 5.4.5. Szl lelltsa ............................................................................ 217 5.4.6. Szlak s a fork/exec hvsok .................................................. 220

    5.5. POSIX-szinkronizci .................................................................. 221 5.5.1. Klcsns kizrs (mutex) ........................................................ 221 5.5.2. Feltteles vltozk .................................................................... 227 5.5.3. Szemaforok ................................................................................ 233 5.5.4. Spinlock ..................................................................................... 236 5.5.5. Tovbbi lehetsgek: POSIX megosztott memria s

    zenetsorok ............................................................................... 238 5.6. Jelzsek ........................................................................................... 238

    5.6.1. A jelzsklds s -fogads folyamata ....................................... 239 5.6.2. Jelzsek megvalstsa ............................................................. 245 5.6.3. A jelzskezel s a fprogram egymsra hatsa ..................... 247 5.6.4. Jelzsek s a tbbszl processz .............................................. 250 5.6.5. Jelzsek programozsa ............................................................. 250

    5.6.5.1. Jelzsek kldse ............................................................... 251 5.6.5.2. Jelzsek letiltsa s engedlyezse.

    Fggben lv jelzsek ..................................................... 253 5.6.5.3. A jelzsek kezelse ........................................................... 254 5.6.5.4. Szinkron jelzskezels ...................................................... 258

    5.6.6. A SIGCHLD jelzs .................................................................... 262

  • Tartalomjegyzk

    ix

    6. Hlzati kommunikci ..................................... 265

    6.1. A socket ........................................................................................... 265 6.2. Az sszekttets-alap kommunikci ................................... 267

    6.2.1. A kapcsolat felptse ............................................................... 268 6.2.2. A socket cmhez ktse ............................................................. 268 6.2.3. Vrakozs a kapcsoldsra ...................................................... 269 6.2.4. Kapcsolds a szerverhez ......................................................... 269 6.2.5. A kommunikci ....................................................................... 270 6.2.6. A kapcsolat bontsa .................................................................. 270 6.2.7. Tovbbi kapcsolatok kezelse a szerverben ............................ 271

    6.3. Az sszekttets nlkli kommunikci ................................. 272 6.3.1. A kommunikci ....................................................................... 273 6.3.2. A connect() hasznlata .............................................................. 274 6.3.3. A socket lezrsa ...................................................................... 275

    6.4. Unix domain socket ..................................................................... 275 6.4.1. Unix domain socket cmek ....................................................... 275 6.4.2. Unix domain socket adatfolyam szerveralkalmazs .............. 276 6.4.3. Unix domain socket adatfolyam kliensalkalmazs ................. 278 6.4.4. Unix domain socket datagram kommunikci ........................ 280 6.4.5. Nvtelen Unix domain socket .................................................. 280 6.4.6. A Linux absztrakt nvtere ....................................................... 280

    6.5. IP ...................................................................................................... 282 6.5.1. Rviden az IP-hlzatokrl ...................................................... 282 6.5.2. Az IP protokoll rtegzdse ...................................................... 284 6.5.3. IPv4-es cmzs ........................................................................... 285 6.5.4. IPv4-es cmosztlyok ................................................................ 286 6.5.5. IPv4-es specilis cmek ............................................................. 287 6.5.6. IPv6-os cmzs ........................................................................... 288 6.5.7. Portok ........................................................................................ 289 6.5.8. A hardverfgg klnbsgek feloldsa .................................... 290 6.5.9. A socketcm megadsa .............................................................. 290 6.5.10. Loklis cm megadsa ............................................................ 293 6.5.11. Nv- s cmfelolds ................................................................. 294

    6.5.11.1. A getaddrinfo() fggvny ................................................ 294 6.5.11.2. A getnameinfo() fggvny ............................................... 298

    6.5.12. sszekttets-alap kommunikci ...................................... 302 6.5.12.1. TCP kliens-szerver plda ............................................... 304 6.5.12.2. TCP szerver alkalmazs ................................................ 308 6.5.12.3. TCP-kliensalkalmazs ................................................... 315

    6.5.13. sszekttets nlkli kommunikci .................................... 317 6.5.13.1. UDP-kommunikci-plda ............................................. 317 6.5.13.2. Tbbes klds ................................................................. 320

  • Tartalomjegyzk

    x

    6.6. Socketbelltsok ......................................................................... 326 6.7. Segdprogramok ........................................................................... 330 6.8. Tvoli eljrshvs ....................................................................... 331

    6.8.1. Az RPC-modell .......................................................................... 332 6.8.2. Verzik s szmok ..................................................................... 332 6.8.3. Portmap ..................................................................................... 333 6.8.4. Szllts ..................................................................................... 333 6.8.5. XDR ........................................................................................... 333 6.8.6. rpcinfo ........................................................................................ 334 6.8.7. rpcgen ........................................................................................ 334 6.8.8. Helyi eljrs talaktsa tvoli eljrss ................................ 335

    7. Fejleszts a Linux-kernelben .............................. 339

    7.1. Verzifggsg .............................................................................. 340 7.2. A kernel- s az alkalmazsfejleszts eltrsei ....................... 341

    7.2.1. Felhasznli zemmd kernelzemmd ............................. 342 7.3. Kernelmodulok ............................................................................. 343

    7.3.1. Hello modul vilg ...................................................................... 344 7.3.2. Fordts ..................................................................................... 346 7.3.3. A modulok betltse s eltvoltsa ......................................... 347

    7.3.3.1. insmod/rmmod ................................................................. 347 7.3.3.2. modprobe ........................................................................... 347

    7.3.4. Egymsra pl modulok ......................................................... 348 7.4. Paramtertads a modulok szmra ..................................... 351 7.5. Karakteres eszkzvezrl ........................................................... 353

    7.5.1. F- s mellkazonost (major s minor number) ................... 354 7.5.2. Az eszkzllomnyok dinamikus ltrehozsa ......................... 355 7.5.3. llomnymveletek .................................................................. 356 7.5.4. Hasznlatszmll .................................................................... 357 7.5.5. Hello vilg driver ................................................................... 358 7.5.6. Az open s a release fggvnyek ............................................... 362 7.5.7. A mellkazonost (minor number) hasznlata ...................... 363 7.5.8. Az ioctl() implementcija ........................................................ 366

    7.6. A /proc llomnyrendszer ........................................................... 370 7.7. A hibakeress mdszerei ............................................................ 375

    7.7.1. A printk() hasznlata ................................................................ 375 7.7.2. A /proc hasznlata ................................................................... 376 7.7.3. Kernelopcik ............................................................................. 377 7.7.4. Az Oops zenet .......................................................................... 378

    7.7.4.1. Az Oops zenet rtelmezse kernel esetben............... 379 7.7.4.2. Az Oops zenet rtelmezse kernelmodul

    esetben ............................................................................. 380

  • Tartalomjegyzk

    xi

    7.7.5. Magic SysRq .............................................................................. 381 7.7.6. A gdb program hasznlata ....................................................... 382 7.7.7. A kgdb hasznlata .................................................................... 382 7.7.8. Tovbbi hibakeressi mdszerek ............................................. 383

    7.8. Memriakezels a kernelben ..................................................... 384 7.8.1. Cmtpusok ................................................................................ 384 7.8.2. Memriaallokci ...................................................................... 384

    7.9. A prhuzamossg kezelse ......................................................... 386 7.9.1. Atomi mveletek ....................................................................... 387 7.9.2. Ciklikus zrols (spinlock) ....................................................... 389 7.9.3. Szemafor (semaphore) .............................................................. 391 7.9.4. Mutex ......................................................................................... 392 7.9.5. Olvas/r ciklikus zrols (spinlock) s szemafor

    (semaphore) ............................................................................... 393 7.9.6. A nagy kernelzrols ................................................................ 394

    7.10. I/O mveletek blokkolsa ......................................................... 395 7.10.1. Elaltats .................................................................................. 396 7.10.2. Felbreszts ............................................................................. 397 7.10.3. Plda ........................................................................................ 398

    7.11. A select() s a poll() tmogatsa .............................................. 403 7.12. Az mmap tmogatsa ................................................................. 404 7.13. I/O portok kezelse ..................................................................... 407 7.14. I/O memria kezelse ................................................................. 408 7.15. Megszaktskezels .................................................................... 410

    7.15.1. Megszaktsok megosztsa .................................................... 412 7.15.2. A megszaktskezel fggvnyek megktsei ....................... 412 7.15.3. A megszakts tiltsa s engedlyezse ................................ 412 7.15.4. A szoftvermegszakts ............................................................ 413 7.15.5. A BH-mechanizmus ................................................................ 414

    7.15.5.1. A kisfeladat (tasklet) ...................................................... 414 7.15.5.2. Munkasor ........................................................................ 417

    7.16. A kernelszlak ............................................................................. 421 7.17. Vrakozs ..................................................................................... 423

    7.17.1. Rvid vrakozsok .................................................................. 423 7.17.2. Hossz vrakozs ................................................................... 424

    7.18. Idztk ......................................................................................... 425 7.19. Eszkzvezrl modell ................................................................ 426

    7.19.1. A busz ...................................................................................... 426 7.19.2. Eszkz- s eszkzvezrl lista ................................................ 428 7.19.3. sysfs .......................................................................................... 429 7.19.4. Buszattribtumok exportlsa .............................................. 429

  • Tartalomjegyzk

    xii

    7.19.5. Az eszkzvezrl ..................................................................... 430 7.19.6. Eszkzvezrl attribtumok exportlsa .............................. 433 7.19.7. Az eszkz ................................................................................. 433 7.19.8. Az eszkz attribtumainak exportlsa ................................ 435 7.19.9. Plda ........................................................................................ 436

    7.20. Tovbbi informcik ................................................................. 438

    8. A Qt keretrendszer programozsa ........................ 439

    8.1. Az X Window rendszer ................................................................. 439 8.1.1. Az X Window rendszer felptse ............................................. 439 8.1.2. X Windows kliensalkalmazsok ............................................... 440 8.1.3. Asztali krnyezet ...................................................................... 441

    8.2. Fejleszts Qt alatt ......................................................................... 442 8.2.1. Hello Vilg! ................................................................................ 443 8.2.2. Projektllomnyok .................................................................... 447 8.2.3. A QObject szolgltatsai ........................................................... 448 8.2.4. A QtCore modul ......................................................................... 449

    8.3. A Qt esemnykezels-modellje .................................................. 450 8.3.1. Szignlok ltrehozsa ............................................................... 452 8.3.2. Szlotfggvnyek ltrehozsa .................................................... 454 8.3.3. Szignlok s szlotok sszekapcsolsa ...................................... 455 8.3.4. Szlot az tmeneti objektumokban ............................................ 457 8.3.5. A Meta Object Compiler ........................................................... 458

    8.4. Ablakok s vezrlk ..................................................................... 459 8.4.1. Dialgusablakok ksztse ....................................................... 460 8.4.2. A Qt vezrlkszlete ................................................................. 466 8.4.3. Sajt alkalmazsablakok ......................................................... 467 8.4.4. A fablak programozsa ........................................................... 469 8.4.5. Lokalizci ................................................................................ 479 8.4.6. Sajt vezrlk ksztse ............................................................ 483

    8.5. A dokumentum/nzet architektra .......................................... 489 8.5.1. Az alkalmazs szerepe .............................................................. 491 8.5.2. A dokumentumosztly .............................................................. 493 8.5.3. A nzetosztlyok ....................................................................... 497 8.5.4. Tovbbi osztlyok ..................................................................... 503

    8.6. Tovbbi technolgik .................................................................. 509 8.6.1. Tbbszl alkalmazsfejleszts ............................................... 509 8.6.2. Adatbziskezels ....................................................................... 516 8.6.3. Hlzati kommunikci ............................................................ 521

    8.7. sszefoglals ................................................................................. 530

  • Tartalomjegyzk

    xiii

    A fggelk: Fejleszteszkzk ................................. 533 A.1. Szvegszerkesztk ....................................................................... 533

    A.1.1. Emacs ........................................................................................ 533 A.1.2. vi (vim) ...................................................................................... 534 A.1.3. nano (pico) ................................................................................ 534 A.1.4. joe .............................................................................................. 534 A.1.5. mc .............................................................................................. 534 A.1.6. Grafikus szvegszerkesztk ..................................................... 535

    A.2. Fordtk ......................................................................................... 535 A.2.1. GNU Compiler Collection ........................................................ 536 A.2.1. gcc .............................................................................................. 536 A.2.3. LLVM ........................................................................................ 540

    A.3. Make ................................................................................................ 541 A.3.1. Megjegyzsek ............................................................................ 542 A.3.2. Explicit szablyok .................................................................... 542 A.3.3. Hamis trgy .............................................................................. 544 A.3.4. Vltozdefincik ...................................................................... 545 A.3.5. A vltoz rtkadsnak specilis esetei ................................ 546 A.3.6. Tbbsoros vltozk definilsa ................................................ 547 A.3.7. A vltoz hivatkozsnak specilis esetei .............................. 547 A.3.8. Automatikus vltozk .............................................................. 548 A.3.9. Tbbszrs cl ........................................................................... 549 A.3.10. Mintaszablyok ...................................................................... 550 A.3.11. Klasszikus ragozsi szablyok .............................................. 551 A.3.12. Implicit szablyok .................................................................. 552 A.3.13. Specilis trgyak .................................................................... 553 A.3.14. Direktvk ............................................................................... 554

    A.4. Make alternatvk ........................................................................ 554 A.4.1. Autotools ................................................................................... 555 A.4.2. CMake ....................................................................................... 555 A.4.3. qmake ........................................................................................ 555 A.4.4. SCons ........................................................................................ 556

    A.5. IDE ................................................................................................... 556

    B fggelk: Hibakeress ......................................... 557

    B.1. gdb ................................................................................................... 557 B.1.1. Plda a gdb hasznlatra ........................................................ 558 B.1.2. A gdb leggyakrabban hasznlt parancsai ............................... 561 B.1.3. A gdb indtsa .......................................................................... 561 B.1.4. Trspontok: breakpoint, watchpoint, catchpoint ................... 562 B.1.5. Data Display Debugger (DDD) ................................................ 566 B.1.6. Az IDE-k beptett hibakeresje ............................................. 567

  • Tartalomjegyzk

    xiv

    B.2. Memriakezelsi hibk .............................................................. 568 B.2.1. Malloc hibakeresk .................................................................. 569

    B.2.1.1. Memriaterlet tlrsa .................................................. 570 B.2.1.2. Elrs .............................................................................. 571 B.2.1.3. Felszabadtott terlet hasznlata ................................... 571 B.2.1.4. Memriaszivrgs ............................................................ 571 B.2.1.5. A malloc hibakeresk korltai ........................................ 571

    B.2.2. Electric Fence ............................................................................ 572 B.2.2.1. Az Electric Fence hasznlata ........................................... 572 B.2.2.2. A Memory Alignment kapcsol ........................................ 574 B.2.2.3. Az elrs .......................................................................... 574 B.2.2.4. Az Electric Fence tovbbi lehetsgei ............................. 575 B.2.2.5. Erforrsignyek .............................................................. 575

    B.2.3. DUMA ....................................................................................... 576 B.3. Valgrind ......................................................................................... 576

    B.3.1. Memcheck .................................................................................. 577 B.3.1.1. A memcheck modul mkdse ......................................... 578

    B.3.2. Helgrind .................................................................................... 580 B.4. Rendszerhvsok monitorozsa: strace .................................. 582 B.5. Knyvtrfggvnyhvsok monitorozsa: ltrace ................. 582 B.6. Tovbbi hasznos segdeszkzk .............................................. 582

    Trgymutat ........................................................ 585

    Irodalomjegyzk ................................................... 593

  • Elszamsodikkiadshoz

    Knyvnk els kiadsa ta a Linux fejldse tretlen. A begyazott szoftver-rendszerek egyre nagyobb trhdtsnak ksznheten a Linux npszersge is egyre n, ezen bell szmos mobileszkz kztk okostelefonok opercis rendszerv vlt. Ezzel egytt az opercis rendszer programozsi fellete is sokat fejldtt. Ezrt dntttnk gy, hogy a knyv els kiadsa alapos tdol-gozsra, illetve kiegsztsre szorul. Munknk sorn csaknem minden fejeze-tet trtunk, aktuliss tettnk, a kernel programozsval kapcsolatos rszt teljesen jrartuk.

    A Linux a kzelmltban volt hszves, az interneten nagyon sok cikk, pl-daprogram s kzssgi oldalak llnak rendelkezsre. A Linux nagyon sokban kveti a POSIX-szabvnyt, amely szmos tovbbi dokumentciforrst jelent. gy vlemnynk szerint egy Linuxrl szl knyv akkor a leghasznosabb, ha rendszerezi a programozshoz szksges ismereteket, a rendszer mkdst mutatja be, s a programozs logikja vezeti a trgyalst. Knyvnkben gy prblunk hathats segtsget nyjtani: az olvast bevezetjk a rendszer m-kdsbe, nemcsak a mit? s hogyan? krdsekre adunk vlaszt programrszle-tekkel illusztrlva, hanem a mirt? krdsre fektetjk a hangslyt, s arra ptve mutatjuk be a tbbit. A legtbb esetben egy plda motivlja a bemuta-tand megoldst, amelyet kln kiemelnk.

    Feladat Ksztsnk megosztott knyvtrat a kerektst vgz fggvnynkkel.

    A klnsen fontos kvetkeztetseket, j tancsokat tmutatkban ssze-gezzk.

    tmutat Ha a programozs szmunkra tbb mint ksz pldakdok sszefslse, majd azok prblkozssal trtn kijavtsa, s idt sznunk a mkds megrtsre, sokkal bonyolul-tabb hibkat sokkal elbb szrevesznk, ez kpess tesz minket Linux alatti szoftver terve-zsre is.

    Az els hat fejezet a Linux rendszer C nyelven hvhat alapfunkciit trgyalja, egy fejezet a kernelmodulok ksztsrl szl, mg az utols fejezet az XWindow rendszer programozst mutatja be C++ nyelven Qt-krnyezetben. A knyv alapjt a Budapesti Mszaki s Gazdasgtudomnyi Egyetem Villamosmr-nki s Informatikai Karn vlaszthat Linux-programozs tantrgy el-

  • Elszamsodikkiadshoz

    xvi

    adsai s laborfoglalkozsai kpezik. A knyv els fejezetei azt felttelezik, hogy az olvas tisztban van a C s C++ nyelvek alapjaival, az alapvet adat-struktrkkal, s rendelkezik az elemi programozstechnikai ismeretekkel, amelyek pldul az [1,2,3] irodalmi hivatkozsnak megfelel knyv feldolgo-zsnak eredmnyeknt szerezhetk meg. Olyan olvaskra is szmtunk, akik Linux alatt prblnak elszr komolyabban programozni, ezrt a fonto-sabb fejleszteszkzket s magt az opercis rendszert teljesen az alapoktl trgyaljuk, s a fggvnyhvsokat olyan rszletessggel mutatjuk be, hogy azokat kzvetlenl fel lehessen hasznlni. Ahol csak tehettk, az egyes funk-cikat egyszer pldkkal illusztrltuk. Remnyeink szerint azok, akik fel-dolgozzk a knyv els hat fejezett, kpesek lesznek arra, hogy nllan megtalljk s rtelmezzk azokat a tovbbi Linuxszal kapcsolatos inform-cikat, amelyekre szksgk van a fejleszts sorn. Ebben a kiadsban kl-nsen a szoftvertervezket prbljuk segteni: bemutatjuk, hogy a Linux ltal biztostott megoldsok milyen logikt kvetnek, melyek a jrhat utak, s mik ezek elnyei/htrnyai, valamint melyik mdszer mikor hatkony.

    Azok szmra, akik ipari projektet indtannak, bemutatunk nhny olyan eszkzt (grafikus fejleszti krnyezet A fggelk, a memriaszivr-gst feldert programok, hibakeresk B fggelk), amelyek nlkl hosz-szabb programok rsa nehzkes s hosszan tart volna.

    A grafikus fejleszts bemutatsakor dntennk kellett, hiszen a szmos eszkzkszlet mindegyikt nem mutathatjuk be. Vlasztsunk a Qt-re esett mivel elterjedt mind asztali, mind begyazott krnyezetben, valamint jl strukturlt fejleszti eszkzkszlet.

    gy gondoljuk, hogy a grafikus felhasznli fellet programozsa s terve-zse ma mr kiforrottnak mondhat, gy ha valaki egy krnyezetet megismer, gyakorlatt minimlis vltoztatsokkal ms rendszerekben is alkalmazni tud-ja. A Qt alatti programozssal foglalkoz rszek halad C++-programozi szin-tet feltteleznek. A C++ nyelv szksges elemeit a [2] irodalmi hivatkozs els 12 fejezete, illetve a [3] hivatkozs ismerteti.

    A knyvet tanknyvknt hasznlk szmra a kvetkez fejezetek feldol-gozst javasoljuk:

    Linuxot hasznl C kurzus: A fggelk, (bevezets a nyelvi elemek-be, szabvnyos knyvtri fggvnyek, pldul [1] alapjn): 4, 5, 6.

    Opercis rendszerek alapjai kurzus gyakorlati illusztrlsa: 15. Linux-programozsi kurzus: A fggelk , B fggelk, 18.

    Tovbbra is igyekeztnk, hogy az egyes fejezetek a lehetsgekhez mrten s a tma jellegtl fggen nll egszet alkossanak, esetleges rvidebb ismt-lsek rn is.

    Az itt lert tananyag szmonkrse a tma jellege miatt klnsen nehz-kes. Ezt megknnytend a szmon krhet fogalmakra, valamint a fontosabb mondanivalra vastag betkkel hvtuk fel a figyelmet. A foly szvegben

  • Elszamsodikkiadshoz

    xvii

    gyakran hivatkozunk a programkdban szerepl vltozkra, konstansokra, makrkra stb. Ezeket dlt betkkel szedtk az elklnthetsg miatt. A prog-ramrszleteket, a parancssorba beviend parancsokat s szkripteket szrke httr jelzi.

    A szerzk trekedtek arra, hogy a knyvben szerepl kdrszek elektroni-kusan is hozzfrhetk legyenek, ezek a pldk az albbi oldalon rhetk el: http://szak.hu/linux.

    Jelen munkban felhasznltuk a Linux sajt dokumentciit, gy az info s a man oldalakat, a POSIX-szabvnyokat. Az egyes forrsokat a knyv jel-lege s a trgyals folyamatossga miatt nem jelltk kln, az irodalomjegy-zkben sszegeztk ket.

    Az egyes j fogalmaknak magyar megfeleli mellett kerek zrjelben k-zljk azok angol megfelelit a tovbbi tjkozds megknnytshez.

    Elsknt szeretnnk megksznni Vlgyesi Pternek klnsen gondos lektori munkjt s rtkes tancsait. Ksznjk Lattman Zsolt, Szilvsi Sndor, Horvth Pter s Babjk Benjamin visszajelzseit s a kzirat egyes rszeinek tolvasst. Ksznjk tovbb Laczk Krisztina olvas-szerkeszti munkjt, amely jelentsen nvelte a kzirat szvegnek ignyes-sgt s rthetsgt, valamint Mamira Gyrgynek a kzirat trdelst.

    Ksznetnket szeretnnk kifejezni Szilvsi Sndornak a fedlbort kls megjelensnek az elksztsrt, az Institute for Software Integrated Systems kutatintzetnek (Vanderbilt Egyetem, Nashville, Tennessee, USA), valamint az Automatizlsi s Alkalmazott Informatikai Tanszk (Budapesti Mszaki s Gazdasgtudomnyi Egyetem) Alkalmazott Informatika Csoport-jnak, hallgatinknak s a SZAK Kiad munkatrsainak.

    Vgl pedig tovbbra is bzunk abban, hogy ez a knyv sokak szmra lesz megbzhat segtsg tanulmnyaik s munkik sorn, s remnyeink szerint akad nhny olyan olvas, aki szabadidejt nem kml, lelkes tagja lesz a szabad szoftverek nkntes fejlesztgrdjnak.

    Budapest, 2012. oktber

    A szerzk

  • ELS FEJEZET

    Bevezets

    1.1. A Linux

    A Linux sznak tbb jelentse is van. Mszaki rtelemben pontos defincija a kvetkez:

    A Linux szabadon terjeszthet, Unix1-szer opercisrendszer -kernel.

    A legtbb ember a Linux sz hallatn azonban a Linux-kernelen alapul tel-jes opercis rendszerre gondol. gy ltalban az albbiakat rtjk rajta:

    A Linux szabadon terjeszthet, Unix-szer opercis rendszer, amely tartalmazza a kernelt, a rendszereszkzket, a programokat s a teljes fejleszti krnyezetet.

    A tovbbiakban mi is a msodik jelentst vesszk alapul, vagyis a Linuxot mint opercis rendszert mutatjuk be.

    A Linux kivl, ingyenes platformot ad a programok fejlesztshez. Az alapvet fejleszteszkzk a rendszer rszt kpezik. Unix-szersgbl ad-dan programjainkat knnyen tvihetjk majdnem minden Unix- s Unix-szer rendszerre. Tovbbi elnyei a kvetkezk:

    A teljes opercis rendszer forrskdja szabadon hozzfrhet, hasz-nlhat, vizsglhat s szksg esetn mdosthat.

    Ebbe a krbe beletartozik a kernel is, gy komolyabb, a kernel mdos-tst ignyl problmk megoldsra is lehetsgnk nylik.

    A Unix egy 1960-as vekben keletkezett tbbfelhasznls opercis rendszer, amelynek nagy rszt C nyelven rtk az AT&T cgnl. vtizedekig a legnpszerbb opercis rendszerek egyike volt. A System V az AT&T ltal fejlesztett Unix alapverzijnak a ne-ve. A msik jelents vltozat a kaliforniai Berkeley Egyetemhez ktdik, ez a Berkeley Software Distribution, rviden BSD.

  • 1. fejezet: Bevezets

    A Linux fejlesztse nem profitorientlt fejlesztk kezben van, gy fej-ldsekor csak mszaki szempontok dntenek, marketinghatsok nem befolysoljk.

    A Linux-felhasznlk s -fejlesztk tbora szles s lelkes. Ennek k-vetkeztben az interneten nagy mennyisg segtsg s dokumentci tallhat.

    Az elnyei mellett termszetesen meg kell emltennk a htrnyait is. A de-centralizlt fejleszts s a marketinghatsok hinybl addan a Linux nem rendelkezik olyan egysges, felhasznlbart kezeli fellettel, mint a ver-senytrsai, belertve a fejleszti eszkzk fellett is. Ennek ellenslyozsra az egyes disztribcik kszti tbbnyire trekednek arra, hogy a kezkbl kiadott rendszer egysges, jl hasznlhat felletet nyjtson. m a disztrib-cik mennyisge ugyanakkor megneheztheti a fejlesztk dolgt, ha minden rendszeren tmogatni szeretnk a programcsomagjukat. 2

    Mindezek figyelembevtelvel azonban a Linux gy is kivl lehetsgeket nyjt a fejlesztsekhez, elssorban a grafikus felhasznli fellettel nem ren-delkez programok terletn, de hathats tmogatst biztost grafikus kli-ensalkalmazsok szmra is.

    A Linux rendszerek hasznlata a begyazott eszkzk terletn a legjelen-tsebb. Szmos olyan eszkzt tallhatunk manapsg az otthonokban, amelyek-rl sokszor nem is tudjuk, hogy rajtuk egy Linux rendszer teszi a httrben a dolgt (pldul otthoni router, DVD felvev/lejtsz, fnykpezgpek stb.).

    A begyazott alkalmazsok egy kln csoportjt alkotjk a mobiltelefo-nok. A Linux rendszer szmos mobiltelefon opercis rendszernek is az alapja. Ezek egy rsze lnyegben csak a kernelt s a fbb fejleszti knyvtrakat hasznlja (pldul az Android), de tallhatunk olyat is, amelyik szinte egy teljes linuxos szmtgpnek felel meg.

    1.2. A szabad szoftver s a Linux trtnete

    1.2.1. FSF

    A szmtstechnika hajnaln a cgek kis jelentsget tulajdontottak a szoft-vereknek. Elssorban a hardvert akartk eladni, a szoftvereket csak jrul-kosan adtk hozz, zleti jelentsget nem tulajdontottak neki. Ez azt ered-mnyezte, hogy a forrskdok, az algoritmusok szabadon terjedhettek.

    2 A klnbz disztribcik okozta problmban segtsget nyjt a ksbb emltett LSB-projekt.

    2

  • 1.2. A szabad szoftver s a Linux trtnete

    m ez az idszak nem tartott sokig, a gyrtk hamar rjttek a szoftver-ben rejl zleti lehetsgekre, s ezzel beksznttt a zrt forrskd progra-mok korszaka. Ez lnyegben azt jelenti, hogy a szoftverek forrskdjt, mint szellemi termkeket, a cgek levdik, s zleti titokknt szigoran rzik.

    Ezek a vltozsok nem nyertk el az akkoriban a Massachusettsi Msza-ki Egyetemen (Massachusetts Institute of Technology, MIT) dolgoz Richard Stallman tetszst. gy megalaptotta a Free Software Foundation (FSF) el-nevezs szervezetet a massachusettsi Cambridge-ben. Az FSF clja a szaba-don terjeszthet szoftverek fejlesztse lett.

    1.2.2. GPL

    Az FSF nevben a free" szabadsgot jelent, nem ingyenessget. Stallman hi-te szerint a szoftvernek s a hozztartoz dokumentcinak, forrskdnak szabadon hozzfrhetnek s terjeszthetnek kell lennie. Ennek elsegtsre megalkotta (nmi segtsggel) a General Public License-t (GPL, magyarul: l-talnos felhasznli licenc), amelyet 1989-tl hasznltak.

    A GPL hrom f irnyelve a kvetkez:

    1. Mindenkinek, aki GPL-es szoftvert kap, megvan a joga arra, hogy in-gyenesen tovbbadja a forrskdjt. (Leszmtva a terjesztsi klts-geket.)

    2. Minden szoftver, amely GPL-es szoftverbl szrmazik, szintn GPL-es kell, hogy legyen.

    3. A GPL-es szoftver birtokosnak megvan a joga ahhoz, hogy a szoftve-reit olyan felttelekkel terjessze, amelyek nem llnak konfliktusban a GPL-lel.

    A GPL egyik jellemzje, hogy nem nyilatkozik az rrl. Vagyis a GPL-es szoft-vertermkeinket szabadon rtkesthetjk. Egyetlen kikts az, hogy a forrs-kd ingyenesen jr a szoftverhez. A vev ezutn azonban szabadon terjesztheti a programot s a forrskdjt. Az internet elterjedsvel ez azt eredmnyezte, hogy a GPL-es szoftvertermkek ra alacsony lett (sok esetben ingyenesek), de lehetsg nylik ugyanakkor arra is, hogy a termkhez kapcsold szolgl-tatsokat, tmogatst trts ellenben nyjtsk.

    A GPL licenc 2-es verzija 1991 nyarn szletett meg, s a szoftverek je-lents rsze ezt hasznlja.

    Mivel a megktsek nagyon szigornak bizonyultak a fejleszti knyvt-rakkal kapcsolatban, ezrt megszletett az LGPL licenc (eredetileg Library General Public License, ksbb GNU Lesser General Public License) krlbell a GPLv2-vel egy idben. Az LPGL els vltozata a 2-es verziszmot kapta.

    3

  • 1. fejezet: Bevezets

    Idkzben azonban megjelentek olyan gyrtk, akik kreatvan" rtelmez-tk a GPLv2 licencet. A szveget betartottk, m az alapelvet megsrtettk. 3 A problmk orvoslsra 2007 nyarn jelent meg a GPLv3. A GPLv3 fogadta-tsa azonban vegyes volt, ezrt sokan maradtak a GPLv2-nl.

    A GPLv3-mal prhuzamosan egy j licenc is szletett reaglva a kor kih-vsaira, nevezetesen a hlzaton fut alkalmazsokra, ilyenek pldul a webes alkalmazsok. Ez az j licenc az AGPLv3 (Affero General Public License).

    1.2.3. GNU

    Az FSF ltal tmogatott legfbb mozgalom a GNU's Not Unix (rviden GNU) projekt, amelynek az a clja, hogy szabadon terjeszthet Unix-szer opercis rendszert hozzon ltre. Ez a projekt nagyon sokat adott hozz a Linux rend-szerhez. Csak a legfontosabbakat emltve: a C fejleszti knyvtr, a GNU Compiler Collection, amely a legelterjedtebb fordt eszkzcsomag, a GDB, amely a f hibakeres program, tovbb szmos, a rendszer alapjaknt szol-gl segdprogram.

    1.2.4. Linux-kernel

    A Linux-kernel trtnete 1991-re nylik vissza. Linus Torvalds, a helsinki egyetem dikja ekkor kezdett bele a projektbe. Eredetileg az Andrew S. Ta-nenbaum ltal tanulmnyi clokra ksztett Minix opercis rendszert hasz-nlta a gpn. A Minix az opercis rendszerek mkdst, felptst volt hivatott bemutatni, ezrt egyszernek, knnyen rtelmezhetnek kellett ma-radnia Emiatt nem tudta kielgteni Linus Torvalds ignyeit, aki ezrt bele-vgott egy sajt, Unix-szer opercis rendszer fejlesztsbe.

    Eredetileg a Linux-kernelt gyenge licenccel ltta el, amely csak annyi korltozst tartalmazott, hogy a Linux-kernel nem hasznlhat fel zleti c-lokra. m ezt rvidesen GPL-re cserlte. A GPL felttelei lehetv tettk ms fejlesztknek is, hogy csatlakozzanak a projekthez. 4 A MINIX kzssg jelen-ts mrtkben tmogatta a munkt. Abban az idben nagy szksg volt egy szabad kernelre, mivel a GNU-projekt kernelrsze mg nem kszlt el, a BSD rendszerrel kapcsolatban pedig jogi problmk merltek fel. A pereskeds k-zel kt vig gtolta a szabad BSD-vltozatok fejlesztst. Ez a krnyezet nagyban hozzjrult a Linux megszletshez.

    Egyes cgek, br betartottk a GPLv2 licencet, s kiadtk az ez al tartoz forrskdo-kat, a hardverben azonban olyan trkkket alkalmaztak, mint a digitlis alrst, amely-lyel megakadlyoztk, hogy rajtuk kvl brki ms j szoftververzit fordthasson s telepthessen az eszkzre. A szakzsargonban ez a mdszer tivoization" nven terjedt el, mivel a TiVo cg alkalmazta elszr.

    4 A Linux-kernel jelenleg a GPLv2 licencet hasznlja.

    4

  • 1.2. A szabad szoftver s a Linux trtnete

    A Linux-kernel fejldsnek llomsai a kvetkezk:

    1991. szeptember: a Linux 0.01-es verzija megjelent az ftp.funet.fi szerveren, amely a finn egyetemi hlzat llomnyszervere.

    1991. oktber: Linux 0.02.

    1991. december: Linux 0.11 az els nhord Linux. Vagyis a Linux-kernel ettl kezdve fordthat a Linux rendszeren. A korbbi fejlesz-tsek Minix alatt trtntek.

    1992. februr: Linux 0.12 az els GPL licences kernel.

    1992. mrcius: Linux 0.95 az X Windows rendszert tltettk Li-nuxra, gy mr grafikus felletet is kapott.

    1994. mrcius: Linux 1.0.0 a gyors fejldst ltva hamarabb vrta mindenki, de kellett mg nhny fejleszti verzi, mire elg rett vlt a rendszer. Ez a kernel is mg csak egy processzort s csak i386-os architektrt tmogatott.

    1995. mrcius: Linux 1.2.0 a Linux megrkezett ms architektrk-ra is. Az Alpha, az SPARC s a MIPS rendszerek is bekerltek a t-mogatott platformok kz.

    1996. jnius 9: Linux 2.0.0 megjelent a tbbprocesszoros rendszerek tmogatsa (SMP).

    1999. janur 25: Linux 2.2.0 javult az SMP tmogatsa, megjelent a tmogatott rendszerek kztt az m68k s a PowerPC.

    2001. janur 4: Linux 2.4.0 megjelent az ISA PnP-, az USB- s a PC-krtya- (PC card) tmogats. Tovbb a tmogatott architektrk k-z bekerlt a PA-RISC. Ez a verzi abban is ms a korbbiaknl, hogy a felgyorsult fejlds hatsra mr a stabil vltozatnak is egyre tbb jdonsgot kellett tvennie, ilyen pldul a Bluetooth, az LVM, a RAID, az ext3 llomnyrendszer.

    2003. december 17: Linux 2.6.0 megvltozott, felgyorsult a fejleszt-si modell. Nincs kln stabil s fejleszti vonal, hanem sokkal rvi-debb ciklusokban ebbe a vonulatba kerl bele minden jts. Emellett szmos jtst s j architektrk tmogatst hozta ez a verzi, ezrt ezek felsorolsra jelen keretek kzt nem vllalkozunk.

    2011. jlius 22: Linux 3.0 a Linux 20 ves vfordulja alkalmbl je-lent meg. A verzivlts jelkpes, mivel a fejlesztsek folyamatosan belekerltek a 2.6.x kernelekbe. gy az j verzi technikai jtst nem hozott a 2.6.39-es verzihoz kpest. Megvltozott a verziszm felp-tse, mivel a fejlesztsi modell szksgtelenn tette a hrom szintet.

    5

  • 1. fejezet: Bevezets

    1.2.5. A Linux rendszer

    A Linux-projekt mr a kezdetektl szorosan sszefondott a GNU-projekttel. A GNU-projekt forrskdjai fontosak voltak a Linux-kzssg szmra a rendszerk felptshez. A rendszer tovbbi jelents rszletei a kaliforniai Berkley Egyetem nylt Unix-forrskdjaibl, illetve az X konzorciumtl szr-maznak.

    A klnbz Unix-fajtk egysgestett programozi felletnek ltrehoz-sra szletett meg a C nyelven definilt POSIX- (Portable Operating System Interface) szabvny a sz vgn az X a Unix vilgra utal , amelyet a Li-nux implementlsakor is messzemenkig figyelembe vettek.

    Szintn a Unix-fajtk egysgestsre jtt ltre a SUS (Single UNIX Spec-ification), amely egy szabvnygyjtemny. A SUS aktulis verziinak a mag-jt a POSIX-szabvnyok alkotjk. A SUS definilja a headerllomnyokat, a rendszerhvsokat, a knyvtri fggvnyeket s az alapvet segdprogramo-kat, amelyeket egy Unix rendszernek nyjtania kell. Emellett informcikat tartalmaz a szabvnyok mgtt ll megfontolsokrl is. 6

    A Linux hasonlan ms nylt opercis rendszerekhez nem rendelkezik a SUS Unix tanstvnyval. Ennek oka rszben a tanstvny megszerzs-nek kltsge, msrszt a Linux gyors fejldse, amely tovbbi extrakltsget jelentene a tanstvny megtartshoz. Ugyanakkor a rendszer fejleszti tre-kednek a SUS-szabvnyok teljestsre. Ezen okokbl a Linuxra a Unix-szer (Unix-like) jelzt hasznljuk.

    1.2.6. Linux-disztribcik

    Az els Linux-disztribci (terjesztsi csomag) megjelense eltt, ha valaki Linux-hasznl akart lenni, akkor jl kellett ismernie a Unix rendszereket, a Linux felptst, konfigurlst, elindulsnak a folyamatt. Ennek az az oka, hogy a hasznlnak kellett a komponensekbl felptenie a rendszert. Belthatjuk, hogy ez jelents akadlyt jelentett a rendszer elterjedsben, hi-szen a kezdknek nem sok eslyk volt megismerni a rendszert.

    Ezrt, amint a Linux rendszert a Linux-fejlesztin kvl msok is elkezdtk hasznlni, megjelentek az els disztribcik. A korai disztribcik tbbnyire lelkes egynek csomagjai voltak. Nhny a korai disztribcikbl: Boot-root, MCC Interim Linux, TAMU, SLS, Yggdrasil Linux/GNU/X.

    5 Jelenleg a POSIX-szabvny az IEEE Std 1003.1-2008 szabvnyt jelenti, amelyet POSIX.1- 2008-knt rvidtenek. A POSIX-implementcik eltrhetnek, ugyanis a szabvny csak fe-lletet hatroz meg, nem megvalstst. Legegyszerbben a man oldalak vgn talljuk meg egy adott fggvny POSIX-kompatibilitst.

    6 Jelenleg a SUS 3-as verzija a legelterjedtebb, amely a POSIX:2001-es szabvnyon alapul. Az a rendszer amelyik ezt teljesti az jogosult a UNIX 03 cmke hasznlatra. A POSIX:2008 a SUSv4 alapjt szolgltatja.

    6

  • 1.2. A szabad szoftver s a Linux trtnete

    Az els jelents disztribci az 1993-ban megjelent Slackware volt, amelyet az SLS-disztribcibl alaktott ki Patrick Volkerding. A Slackware tekinthet az els olyan csomagnak, amelyet mr komolyabb httrtuds nlkl is lehetett installlni s hasznlni. Megszletse nagyban elsegtette a Linux terjedst, npszersgnek a nvekedst.? A Slackware egyben az alapjt szolgltatta tbb ksbbi rendszernek is, pldul a Red Hatnek s a SuSE-nek.

    A Slackware mellett azonban az SLS miatti elgedetlensg egy msik disztribci megszletshez is hozzjrult. Ian Murdock elindtotta a Debian projektet (a disztribci neve a felesge, Debra s sajt keresztnevnek ssze-olvasztsa). A Debian szintn 1993-ban szletett, m az els 1.x verzi csak 1996 nyarn jelent meg. A Debian szmos tovbbi disztribci alapjaknt szolglt s szolgl mai is.

    A Red Hat Linux-disztribci 1994 novemberben jelent meg az 1.0-s ver-zival. Ez volt az els olyan disztribci, amely az RPM csomagkezeljt hasznlta. Ez nagy elrelpst jelentett, ugyanis sokkal knnyebb tette a szoftvercsomagok adminisztrlst, teleptst, frisstst. Ez is hozzjrult a Linux tovbbi elterjedshez, mert felhasznlbart, teljes rendszert bizto-stott. Emellett a Red Hat cg olyan szint tmogats nyjtott a termkhez, amely lehetv tette, hogy a cgek is komolyan fontolra vegyk a rendszer hasznlatt. 2003-ban a Red Hat Linux ebben a formjban megsznt. He-lyette a Red Hat Enterprise Linux (RHEL) rendszert ajnlja a cg vllalati krnyezetbe, illetve letre hvta s tmogatja a Fedora Projectet, amely a Fe-dora disztribcit tartja karban. Az zleti vilgban az RHEL az egyik legnp-szerbb disztribci.

    Napjaink egyik leggyakrabban hasznlt Linux-disztribcija a Debian-alap Ubuntu. A disztribci egy dl-afrikai humanista filozfirl kapta a nevt, amelynek lnyege a msok irnti embersgessg: azrt vagyok az, aki vagyok, amirt mi mindannyian azok vagyunk, akik vagyunk". A rendszert a dl-afrikai Mark Shuttleworth alaptotta Canonical Ltd. fejleszti, amely a termktmogatst pnzrt rulja, ugyanakkor az opercis rendszer ingye-nes. Az els verzi 2004 oktberben jelent meg.

    Az eddig emltett disztribcikat szmos jabb is kvette, amelyek kln-bz clok mentn fejldtek. gy lehetsgnk van kicsi s gyors, nagy s ltv-nyos, stabil s kevsb aktulis vagy nem annyira stabil, de minden jdonsgot tartalmaz rendszert is vlasztani. A disztribcik listja rendkvl hossz, gy nem is vllalkozunk a felsorolsukra. Az interneten megtallhatjuk a neknk legszimpatikusabbat.

    m ha magyar nyelv s magyarok ltal gondozott disztribcit szeret-nnk, akkor erre is van lehetsgnk az UHU Linux- (http: / / uhulinux.hu) disztribci rvn. Az oktatsi intzmnyek szmra kifejlesztett SuliX (http: / / www.sulix.hu) szintn ebbe a kategriba tartozik.

    7 Jelen rs szerzje is a Slackware disztribcija rvn tallkozott elszr a Linux rend-szerrel 1993 vgn.

    7

  • 1. fejezet: Bevezets

    A Linux-disztribcik ltalban a fejleszti knyvtrakat, a fordtkat, az rtelmezket, a parancsrtelmezket, az alkalmazsokat, a segdprogramo-kat, a konfigurcis s csomagkezel eszkzket s mg sok ms komponenst is tartalmaznak a Linux-kernel mellett. Az alapelemek tbbnyire megegyeznek a disztribcikban, csak eltr verzikkal, illetve kisebb-nagyobb mdostsok-kal tallkozhatunk. Az opcionlis fejleszti knyvtrak mr nem minden diszt-ribciban lelhetk fel, de forrsbl lefordthatjuk ket hozzjuk. 8

    Mivel a klnbz Linux-disztribcik nagymrtkben eltrhetnek egyms-tl, ezrt felhasznlk s a fejlesztk szmra jelents problmt jelenthet a klnbzsgek kezelse. Felismerve a problmt a Linux-disztribcik ksz-ti ltrehoztk az LSB (Linux Standard Base) projektet, amelynek clja a rend-szerstruktra egysgestse s szabvnyostsa. Ennek eredmnye az is, hogy a klnbz Linux rendszereken nagyjbl egysges knyvtrstruktrkkal ta-llkozunk. Az LSB a korbban emltett POSIX- s SUS-specifikcikat veszi alapul, illetve ezek mellett szmos nylt szabvnyra is pt. Fejlesztknt az LSB-projekt hatalmas segtsget nyjt neknk, mivel gy egysgesen kezel-hetjk a Linux rendszert, s a szoftvereink szmos disztribcin lesznek m-kdkpesek.

    A knyv tematikjnak kialaktsakor trekedtnk arra, hogy lehetsg szerint disztribcifggetlenek legynk. gy a trgyalt tmakrk minden disztribci esetn alkalmazhatk, illetve a fejleszti eszkzket is gy v-lasztottuk ki, hogy lehetleg ltalnosan elrhetk legyenek. m a pldaprog-ramok fordtsakor idnknt tallkozhatunk azzal a problmval, hogy egyes disztribcik esetben a knyvtrstruktra eltrhet. Viszont az LSB-t kvet disztribciknl ennek minimlis az eslye.

    1.3. Informciforrsok

    A Linux trtnete sorn mindig is ktdtt az internethez. Internetes kzs-sg ksztette, fejlesztette, terjesztette, gy a dokumentcik nagy rsze is az interneten tallhat. Ezrt a legfbb informciforrsnak is az internetet te-kinthetjk.

    A Linux-vilg egyik klasszikus informciforrsa a Linux Documentation Project (Linux dokumentcis projekt, LDP). Az LDP elsdleges feladata magas szint, ingyenes dokumentcik fejlesztse a GNU/Linux opercis rendszer szmra. Cljuk minden Linuxszal kapcsolatos tmakr lefedse a megfelel dokumentumokkal. Br sok dokumentum nem teljesen aktulis, ennek elle-

    8 Gyakran elhangzik a krds: melyik a legjobb disztribci? Szerintnk ilyen nincs, csak olyan, amely elg kzel ll a felhasznl egyni ignyeihez, s mr nem kell olyan sokat dolgoznia rajta, hogy teljesen a sajt kpre alaktsa. Ha rosszul vlaszt kiindulsi ala-pot, akkor tbb munkja lesz vele.

    8

  • 1.3. Informciforrsok

    nre is az egyik legjelentsebb informciforrsnak tekinthet. Az egyes Li-nux-disztribtorok sokszor nagyon komoly s jl hasznlhat dokumentcit ksztenek. m ezek a dokumentcik tbbnyire az adott disztribci haszn-latrl, adminisztrlsrl szlnak. Szoftverfejlesztsrl ritkn tallunk do-kumentcikat. Az LDP ltal elksztett dokumentumok a kvetkez cmen tallhatk meg: http:/ / www.tldp.org / .

    A kziknyvoldalak (manual page, rvidtve man page) a Unix klasszi-kus elektronikus dokumentcis formja, amelyet a Linux is rklt. Ezek az oldalak eredetileg a man segdprogrammal jelenthetk meg, de manapsg HTML s egyb formtumban is elrhet. Emiatt magyarul szmos elnevez-sk van, legtbben az angol elnevezst hasznljk, rott formban sokszor csak kziknyv" hasznlatos. Az els kziknyveket a Unix szerzi rtk a hetvenes vek legelejn. A tagolsa egysges, a POSIX-szabvny is ezzel a felptssel r-ja le az egyes interfszeket, ezek a lersok kziknyvek formjban is ren-delkezsre llnak sokszor kiegsztve az adott platformra jellemz tovbbi informcival, esetleg eltrsekkel. Ez a mai napig az egyik legfontosabb do-kumentci. Az info formtumot a GNU vezette be, ez kpes linkeket s egyb formzsokat is kezelni.

    A HOWTO-k egy-egy konkrt problma megoldst nyjtjk. Szmos formtumban (HTML, PostScript, PDF, egyszer szveg) elrhetk. Az t-mutat (guide) kifejezs az LDP ltal ksztett knyveket jelli. Ezek egy-egy tmakr bvebb kifejtst tartalmazzk.

    Fejlesztknt a fejleszti knyvtrak dokumentciinak vehetjk a leg-nagyobb hasznt. Minden fejleszti knyvtr honlapjn tallunk minimlisan egy API-dokumentcit. Gyakran tallkozhatunk azonban komoly lersok-kal, gyakorlpldkkal is.

    Az LWN (http:/ / lwn.net) a Linux-vilg hrlapja. Igyekszik sszegyjteni minden jdonsgot a Linux vilgbl. Az ltalnos hrek mellett a Develop-ment rovatbl tjkozdhatunk a legjabb fejleszti hrekrl, mg a Kernel rovat a kernelfejleszts irnt rdekldknek szolgl friss informcikkal.

    Ha a feladatunkkal elakadnnk, szmos frumot tallhatunk az interneten, ahol feltehetjk a krdseinket. Radsul sokszor az is elfordul, hogy

    msok mr feltettk a krdst, s mr meg is vlaszoltk. gy ha elakadunk, akkor gyakran a legnagyobb segtsget a webes keresk jelentik, amelyek megtalljk a kvnt frumbejegyzseket, st a kziknyvek s a howtok k-ztt is kpesek keresni.

    9

  • MSODIK FEJEZET

    Betekints a Linux- kernelbe

    Ebben a fejezetben a Linux-kernel egyes rszeivel ismerkednk meg. A kvet-kez ismeretek nem elengedhetetlenek ahhoz, hogy a knyv tovbbi fejezetei-ben tallhat pldaprogramokat kzvetlenl felhasznljuk, a fejezetek megr-tshez azonban igen. Ezek a tudnivalk megvilgtjk, hogy mi zajlik le a rendszer bels magjban a programunk futsa kzben, gy hasznos httr-informcit szolgltathatnak a fejlesztk szmra. Ez a fejezet teht egyfajta ttekintst kvn nyjtani. A tovbbi, specializlt rszekben sokszor rszlete-sebben trgyaljuk az itt bemutatottakat.

    2.1. A Linux-kernel felptse

    Egy opercis rendszer magjnak strukturlis felptsnl kt alapvet szls-sges vlasztsunk van. Vlaszthatunk a mikrokernel- s a monolitikus-kernel-struktra kztt. A lnyegi klnbsg a kett kztt az, hogy milyen szolgltatsokat valstanak meg a felhasznli cmtrben, illetve a kernel cmterben. A mikrokernel csak a legszksgesebb opercisrendszer-szolgl-tatsokat futtatja a kernelben, mg a tbbit a rugalmassg rdekben a fel-hasznli cmtartomnyban implementlja. Ezzel szemben a monolitikus kernelben a legtbb szolgltats a kernel rszeknt fut a nagyobb teljest-mny rdekben. A kett kztt flton a hibrid kernel tallhat. Vegytiszta megoldsok egyre kevsb vannak: a mikrokernel-architektrkon a jobb tel-jestmny miatt bizonyos alacsony szint szolgltatsokat thelyeznek a ker-nelbe (pl. a grafikusvezrlk). A monolitikus kernel esetben rszben a rugalmassg, rszben a teljestmnymaximalizls rdekben tesznek t funkcikat a felhasznli tartomnyba. A Linux a monolitikuskernel-megkze-ltshez ll kzelebb, a gykerei oda nylnak vissza.

  • 2. fejezet: Betekints a Linux-kernelbe

    A mikrokernel s monolitikus kernel kategritl fggetlenl a modern opercis rendszerek kernele dinamikusan betlthet modulokbl pl fel, gy hasznlat kzben az ignyeknek megfelelen bvthet vagy cskkenthet.

    A struktrk alapjainak megismerse utn nzzk meg, milyen rszekre oszthatjuk fel a Linux-kernelt. (Ez a feloszts vzlatos, a knnyebb rthetsg rdekben nem tr ki a rendszer minden rszletre.)

    Felhasznli processzek

    Fejleszti knyvtrak (pl glibc)

    Kernel

    Rendszerhvsok

    Processzkezel

    llomnyrendszerek

    temez

    Hlzati rteg

    Memria- kezel

    Egyb alrendszerek )

    IPC

    Perifrik kezelse

    Hardver

    2.1. bra. A kernel vzlatos felptse

    A felhasznli programok a rendszerhvsokon keresztl krhetik a kerneltl a kvnt szolgltatsokat. Ezeket a rendszerhvsokat a programok ltalban a rendszerknyvtrak segtsgvel rik el.

    A fjlrendszerek magasabb szint absztrakcit nyjtanak a perifrik kezelsre. Ennek az alrendszernek a segtsgvel kezelhetnk llomnyokat, knyvtrakat az egyes eszkzkn (ilyen llomnyrendszerek az ext4, a proc, az MSDOS, az NTFS, az iso-9660, az NFS stb.), de a fjlkezes mveleteivel frhetnk hozz pldul a soros portokhoz is.

    A hlzati rteg a klnbz hlzati protokollok implementcijt tar-talmazza (IPv4, IPv6 IPX, Ethernet stb.).

    12

  • 2.2. A Linux elindulsa

    A perifriakezel alrendszer az eszkzk alacsony szint kezelst va-lstja meg. Hozztartozik a httrtrolk, az I/O eszkzk, a soros/prhuza-mos s az egyb portok kezelse.

    A folyamatkezel alrendszer tbb, a processzek kezelsvel kapcsolatos funkcit valst meg:

    A Linux tbbfeladatos (multitask) rendszer, ez azt jelenti, hogy tbb processzt futtat prhuzamosan (tbbprocesszoros rendszer) vagy kv-zi prhuzamosan, vltogatva (egyprocesszoros rendszer). Azt, hogy az egyes processzek mikor jussanak a processzorhoz, az temez dnti el.

    A processzeknek ltalban szksgk van arra, hogy egymssal kom-munikljanak. Ezt az IPC- (Interprocess Communication, processzek kztti kommunikci) alrendszer teszi lehetv.

    A fizikai memria kiosztst a processzek kztt a memriakezel al-rendszer vgzi el.

    A kvetkez fejezetekben fknt a processzkezel alrendszer egyes rszeivel, az temezs mkdsvel, illetve a memriakezels elmletvel ismerkednk meg. Az IPC-alrendszerre nem trnk ki; lehetsgeit, hasznlatt ksbb trgyaljuk.

    2.2. A Linux elindulsa

    Egy opercis rendszer betltdse, elindulsa els pillantsra mindig kicsit rejtlyes dolognak tnik. ltalban ha egy, a httrtroln lv programot szeretnnk betlteni, lefuttatni, akkor berjuk a nevt a parancsrtelmezbe, vagy rkattintunk az ikonjra, s az opercis rendszer elindtja. m hogyan trtnik mindez, amikor a gp indulsakor magt az opercis rendszert sze-retnnk betlteni, elindtani?

    A Linux-kernel betltst s elindtst az gynevezett kernelbetlt vg-zi el. Ilyen program a LILO (The Linux Loader), a LOADLIN, a Grub s mg sorolhatnnk. A program betltshez szksg van egy kis hardveres segt-sgre is. ltalban a gp csak olvashat memrijban van egy kis program (az x86-os architektra esetben ennek a neve BIOS vagy (U)EFI), amely megtallja, betlti s futtatja ezt a kernelbetltt. Vagyis sszegezve: egy rvid, begetett program lefut, s elindt egy valamivel nagyobb betltprog-ramot. Ez a betltprogram pedig elindt egy mg nagyobb programot, neve-zetesen az opercis rendszer kernelprogramjt. 9

    9 Lehetsg van arra, hogy a betltprogramokat mg tovbb lncoljuk. Ezltal lehetv vlik a tbb opercis rendszert tartalmaz gpeken, hogy indulskor kivlaszthassuk a szmunkra szksgeset.

    13

  • 2. fejezet: Betekints a Linux-kernelbe

    A kernel manapsg ltalban tmrtett formban van a lemezeken, s kpes nmagt kitmrteni. gy az els lps a kernel kitmrtse, majd a kd feldolgozsa a kitmrtett kernel kezdcmtl folytatdik. Ezt kveti a hardver inicializlsa (memriakezel, megszaktstblk stb.), majd az els C-fggvny (start_kernel()) meghvsa. Ez a fggvny, amely egyben a 0-s azonostj processz belpsi pontja, inicializlja a kernel egyes rszeit. Az inicializci vgn a 0-s processz elindt egy kernelszlat (a neve nit), majd egy resjrati ciklusba (idle loop) kezd, gy a tovbbiakban a 0-s pro-cessz szerepe mr elhanyagolhat.

    Az nit kernelszlnak vagy processznek a processzazonostja az 1. Ez a rendszer els igazi processze. Elvgez mg nhny belltst (elindtja a fjl-rendszert szinkronizl s lapcserekezel folyamatokat, felleszti a rendszer-konzolt, felcsatolja [mount] a gykr-llomnyrendszert [root file system]), majd lefuttatja a rendszerinicializl programot (nem keverend a korbban emltett processzel). Ez a program az adott disztribcitl fggen a kvetke-zk valamelyike: /etc/init, /bin/init, /sbin/init.10 Az nit program az /etc/ inittab11

    konfigurcis llomny segtsgvel j, immr felhasznli processze-ket hoz ltre, s ezek tovbbi j processzeket. Pldul a getty processz ltrehozza a login processzt, amikor a felhasznl bejelentkezik. Ezek a processzek mind az nit kernelszl leszrmazottai.

    2.3. Processzek

    A processz egy mkds kzbeni program. Ebbl addan a programkdot s a hozztartoz erforrsokat tartalmazza.

    A processzek meghatrozott feladatokat hajtanak vgre az opercis rendszeren bell. A feladat lersa az a program, amely gpi kd utastsok s adatok egyttesbl ll. Ezeket a lemezeken troljuk, gy a program nma-gban passzv entits.

    Ezzel szemben a processz mr dinamikus entits. Folyamatosan vltozik, ahogy a processzor egyms utn futtatja az egyes utastsokat. A program kdja s adatai mellett a processz tartalmazza a programszmllt, a CPU-regisztereket, tovbb a processz vermt, amely az tmeneti adatokat (fgg-vnyparamterek, visszatrsi cmek, elmentett vltozk) trolja.

    10 Ha egyik helyen sem tallja meg a rendszer az nit programot, akkor megprblja feldol-gozni az /etc/rc llomnyt, s elindt egy shellt, hogy a rendszergazda megjavthassa a rendszert.

    11 A Linux rendszereken elterjedben van az esemnyalap, upstart nev nit implement-ci. Ez a megolds a hagyomnyos System V nit programhoz kpest eltr konfigurcis megoldsokat alkalmaz.

    14

  • 2.3. Processzek

    A Linux tbbfeladatos (multitask) opercis rendszer, a processzek sajt jogokkal rendelkez elklntett feladatok (task), amelyeket a Linux prhu-zamosan futtat. Egy processz sszeomlsa nem okozza a rendszer ms pro-cesszeinek az sszeomlst. Minden klnll processz a sajt virtulis cm-tartomnyban fut, s nem kpes ms processzekre hatni. Kivtelt kpeznek ez all a biztonsgos, kernel ltal kezelt mechanizmusok, amelyekkel a pro-cesszek magvalsthatjk az egyms kztti kommunikcit.

    letciklusa sorn egy processz szmos rendszererforrst hasznlhat (CPU, memria, llomnyok, fizikai eszkzk stb.). A Linux feladata az, hogy ezeket a hozzfrseket knyvelje, kezelje, s igazsgosan elossza a konkurl processzek kztt.

    2.3.1. A Linux-processzekhez kapcsold informcik

    A Linux minden processzhez hozzrendel egy ler adatstruktrt, 12 az eb-ben szerepl adatok jellemzik az adott processzt, s befolysoljk a mkdst. Ez a feladatokat ler adatstruktra nagy s komplex, m feloszthat nhny funkcionlis terletre:

    llapot A processz a futsa sorn a krlmnyektl fggen klnbz llapo-tokba kerlhet, ezeket az llapotokat a 2.3.2. alfejezetben trgyaljuk.

    Azonostk A rendszerben minden processznek van egyedi azonostja. Ezen tl minden processz rendelkezik felhasznli s csoportazonostkkal. Ezek szablyozzk az llomnyokhoz s az eszkzkhz val hozzf-rst a rendszerben. (Bvebben lsd a 2.3.3. alfejezetben.)

    Kapcsolatok A Linuxban egyetlen processz sem fggetlen a tbbitl. Az nit pro-cesszt leszmtva minden processznek van szlje. Az j processzek nem ltrejnnek, hanem a korbbiakbl msoldnak, klnozdnak. Minden processzler adatstruktra tartalmaz hivatkozsokat a sz-lprocesszre s a leszrmazottakra. Ezt a kapcsoldsi ft a pstree pa-ranccsal nzhetjk meg.

    temezsi informci Az temeznek szksge van bizonyos informcikra: priorits, sta-tisztikai informcik stb., hogy igazsgosan dnthessen, hogy melyik processz kerljn sorra. Az temezst a 2.3.6. alfejezet trgyalja.

    1, A ler adatstruktra tpusa megtallhat a kernelforrsban. A neve task_struct, s az include/linux/sched.h llomnyban tallhat.

    15

  • 2. fejezet: Betekints a Linux-kernelbe

    Memriainformcik A processz memriafoglalsval kapcsolatos informcik (kd-, adat-, veremszegmensek) tartoznak ide.

    Fjlrendszer A processzek megnyithatnak s bezrhatnak llomnyokat. A pro-cesszler adatstruktra tartalmazza az sszes megnyitott llomny lerjt, tovbb az aktulis, gynevezett munkaknyvtrnak (working directory) a mutatjt.

    Processzek kztti kommunikci A Linux tmogatja a klasszikus Unix IPC-mechanizmusokat (jelz-sek, csvezetkek, szemaforok) s a System V IPC-mechanizmusokat is (megosztott memria, szemafor, zenetsor). Egy kifejezetten a Unix opercis rendszerekre jellemz processzek kzti aszinkron kommu-nikcis forma a jelzs (signal). A jelzst kld processz nem vrako-zik a kzbestsre, klds utn folytatja futst. Jelzs rkezsekor a fogad processz norml futsa megszakad, s vagy a processz ltal megadott, vagy az alaprtelmezett jelzskezel fggvny fut le. Ezek utn a processz ott folytatja a futst, ahol abbahagyta. A futs meg-szaktst, a jelzskezel futtatst, majd a futs folytatst a kernel teljes mrtkben kezeli. A jelzshez tartozik egy egsz szm, amely a jelzs kivltsnak okt adja meg. Ezt az egsz szmot szimbolikus konstanssal adjuk meg, rtke a signal.h llomnyban tallhat. A szimbolikus konstansok SIG eltaggal kezddnek. Pldul nullval val oszts esetn a kernel SIGFPE jelzst kld a mveletet futtat processznek, illetve akkor, ha egy processz futst azonnal meg sze-retnnk szaktani, SIGKILL jelzst kldnk neki.

    Id s idztk A kernel naplzza a processzek ltrehozsi s CPU-felhasznlsi ide-jt. A Linux tmogatja tovbb az intervallumidztk hasznlatt a processzekben, amelyeket belltva jelzseket kaphatunk bizonyos id elteltvel. Ezek lehetnek egyszeri vagy periodikusan ismtld rtes-tsek. (Bvebben lsd a 2.3.8. alfejezetben.)

    Processzorspecifikus adatok (Context) A folyamat a futsa sorn hasznlja a processzor regisztereit, a ver-met stb. Ez a processz krnyezete, s amikor feladatvltsra kerl sor, ezeket az adatokat le kell menteni a processzt ler adatstrukt-rba. Amikor a processz jraindul, innen lltdnak vissza az adatok.

    16

  • Esemny

    bekvetkezik Esemnyre

    vr

    Ltrehozs

    Jelzs Jelzs

    Megsznik

    Futs vge

    2.3. Processzek

    2.3.2. A processz llapotai

    A futs sorn a processzek klnbz llapotokba juthatnak. Az llapot fgg-het a processz aktulis teendjtl s a kls hatsoktl. A processz aktulis llapott a processzhez rendelt ler struktra llapotler vltozja trolja.

    Linux alatt egy processz lehetsges llapotai a kvetkezk:

    A processz ppen fut az egyik processzoron. (Az llapotvltoz rtke: RUNNING.)

    A processz futsra ksz, de msik foglalja a processzort, ezrt vra- kozik a listban. (Az llapotvltoz rtke ilyenkor is: RUNNING.)

    A processz egy erforrsra vagy esemnyre vrakozik. Ilyenkor attl fggen kap rtket az llapotvltoz, hogy a vrakozst megszakthat-ja egy jelzs (INTERRUPTABLE), vagy sem (UNINTERUPTABLE). A jelzssel nem megszakthat llapot egyik alesete az, amikor a kriti-kus, a folyamat lellst eredmnyez jelzsek mg megszakthatjk a vrakozst (KILLABLE).

    A processz felfggesztve n, ltalban a SIGSTOP jelzs kvetkezt-ben. Ez az llapot hibajavtskor jellemz, de a terminlban futtatott folyamatnl a CTRL + Z billenty kombincival szintn elrhetjk. (Az llapotvltoz rtke: STOPPED.)

    A processz ksz az elmlsra (mr nem l, de mg nem halott: zom-bi), de valami oknl fogva mg mindig foglalja a ler adat struktr-jt. (Az llapotvltoz rtke: ZOMBIE.)

    Az llapotok kapcsolatait a 2.2. bra szemllteti:

    2.2. bra. A processz llapotatmenet -diagramja

    17

  • 2. fejezet: Betekints a Linux-kernelbe

    A processzeket a fenti llapotdiagram szerint az temez (scheduler) kezeli. Az temezsi algoritmusokat s a processzekhez tartoz adatterleteket a 2.3.6. alfejezetben trgyaljuk bvebben.

    2.3.3. Azonostk

    A Linux-kernel minden processzhez egy egyedi azonostt rendel: pid (process ID). Ksbb ezzel az azonostszmmal hivatkozhatunk a processzre.

    Minden folyamat egy processzcsoport tagja, amelynek azonostjt a pgid (process group ID) mez tartalmazza. Amikor a folyamat ltrejn, a szlfo-lyamat pgid azonostjt rkli, m ez ksbb mdosthat. A processzcsoport arra hasznlhat, hogy tagjainak egyszerre kldjnk jelzseket, vagy valame-lyik tagjnak befejezdsre vrakozzunk.

    A konvenci szerint a pgid azonost szmrtke a csoport els tagjnak pid rtkvel egyezik meg. j csoportot is gy tudunk ltrehozni, ha a pgid rtkt a folyamat pid rtkre lltjuk. Ekkor a folyamatunk a csoport veze-tje lesz. A csoport vezetjnek szerepe annyiban specilis, hogy ha vget r, akkor a csoport tbbi tagja egy SIGHUP jelzst kap. (Bvebben lsd az 5.6. Jelzsek cm alfejezetben.) A jelzs hatsra a folyamatok dnthetnek arrl, hogy lellnak-e (alaprtelmezett), vagy folytatjk a futsukat.

    Tbb processzcsoport sszekombinlhat egy munkamenett (session). Minden folyamatnak a munkameneten bell azonos a sessionid rtke.

    Linux alatt a szlak specilis folyamatoknak szmtanak. Ezrt fontos a rendszer szmra annak knyvelse, hogy mely szlak tartoznak egybe, egy folyamathoz. Az sszetartoz szlakat a szlcsoportok tartalmazzk. A folya-mat szlcsoport-azonostja a tgid.

    A Linux, mint minden ms Unix rendszer, felhasznli- s csoportazono-stkat hasznl az llomnyok hozzfrsi jogosultsgnak az ellenrzsre. A Linux rendszerben minden llomnynak van tulajdonosa s jogosultsgi belltsai. A legegyszerbb jogok a read, a write s az execute. Ezeket rendel-jk hozz a felhasznlk hrom osztlyhoz: ezek a tulajdonos, a csoport s a rendszer tbbi felhasznlja. A felhasznlk mindhrom osztlyra kln be-llthat mindhrom jog.

    Termszetesen ezek a jogok valjban nem a felhasznlra, hanem a fel-hasznl azonostjval fut processzekre rvnyesek. Ebbl kvetkezen a processzek az albbi azonostkkal rendelkeznek:

    uid, gid A felhasznl felhasznli s csoportazonosti, amelyekkel a pro-cessz fut.

    Effektv uid s gid Ezeket az azonostkat hasznlja a rendszer annak vizsglatra, hogy a processz hozzfrhet-e az llomnyhoz. Klnbzhetnek a valdi felhasznltl s csoporttl. Ezeket a programokat nevezzk setuidos,

    18

  • 2.3. Processzek

    illetve csoportllts esetn setgides programoknak. Segtsgkkel korltozott hozzfrst nyjthatunk a rendszer egyes vdett, csak a rendszergazda szmra hozzfrhet rszeihez.

    Fjlrendszer-uid s -gid Ezek norml esetben megegyeznek a valdi azonostkkal, s a fjl-rendszerhez val hozzfrsi jogosultsgokat szablyozzk. Elssorban az NFS-fjlrendszereknl13 van rjuk szksg, amikor a felhasznli zemmd NFS-szervernek klnbz llomnyokhoz kell hozzfr-nie az adott felhasznl nevben. Ebben az esetben csak a fjlrend-szer-azonostk vltoznak.

    Mentett uid s gid Olyan programok hasznljk, amelyek a processz azonostit rendszer-hvsok ltal megvltoztatjk. A valdi uid s gid elmentsre szol-glnak, hogy ksbb visszallthatk legyenek.

    2.3.4. Processzek ltrehozsa s terminlsa

    j processzt egy korbbi processz lemsolsval hozhatunk ltre. Ez a fork rendszerhvssal valsthat meg. A msolat teljesen megegyezik az eredetivel, csak a processzazonostban klnbznek. Az eredeti processzt szlprocessz-nek, a msolatot, a leszrmazottat gyerekprocessznek nevezzk. Termszete-sen, ha ksbb az egyes processzek mdostanak a bels vltozikon, akkor ez a msik processznl mr nem rvnyesl.

    A valsgban a gyerekfolyamat ltrehozsakor nem trtnik tnyleges msols. Helyette a Linux a COW metdust hasznlja (lsd ksbb a 2.4.7. al-fejezetben).

    Ha egy program egy msik programot akar futtatni, akkor sincs ms t: a processznek le kell msolnia magt, s a gyerekprocessz tlti be a futtatand msik programot. Ezrt gyakori az a forgatknyv, hogy az j folyamat ltre-hozsa utn egy rendszerhvssal azonnal betltnk egy j programot, s azt futtatjuk. Ilyenkor az eredeti folyamat memrijnak a lemsolsa felesleges. Erre az esetre szolgl a vfork fggvny, amelyben a memria msolsa he-lyett a rendszer megosztja a memrit a szl s a gyerek kztt addig, amg a gyerek betlt egy j programkdot. Erre az tmeneti idre a szlfolyamat blokkoldik. Amita a Linux a COW metdust hasznlja a fork rendszerh-vsnl, azta a vfork elnye valjban mr elhanyagolhat, gy nem jellemz a hasznlata.

    13 Az NFS (Network File System) elssorban Unix rendszereknl hasznlt hlzati fjl-rendszer.

    19

  • 2. fejezet: Betekints a Linux-kernelbe

    A Linux mind a fork, mind a vfork rendszerhvst valjban a clone rend-szerhvssal valstja meg. A clone ltrehoz egy j folyamatot a szlfolyamat-bl, s lehetv teszi, hogy megadjunk, mely memriaterleteken osztozzon a kt folyamat. Mint lthat, a fork s a vfork fggvnyek valjban a clone specializlt esetei. A clone teszi lehetv a kernelszint szlkezels imple-mentcijt is Linux alatt. 14

    A gyerekfolyamat a szl teljes msa, csak a pid s a ppid rtkekben tr el tle. Ezen kvl nem rkldnek mg az llomnyzrolsok s az aktulis jelzsek.

    Ha a gyerekfolyamat a programkdjnak a vgre rt, vagy terminl jelle-g jelzst kap, akkor ezt a tnyt egy SIGCHLD jelzssel jelzi a szl szmra, befejezi a futst, s zombi llapotba kerl. Addig zombi llapotban marad, amg a szljnek tadja az eredmnyt. Ameddig a szl ezt nem veszi t t-le, addig a gyerekfolyamat zombi llapotban vrakozik.

    Felvetdik a krds, mi trtnik akkor, ha a szl fejezi be hamarabb a futst, s nem a gyerek. A gyerek ilyenkor rva lesz, s az nit veszi t a sz-l szerept. Amikor a gyerekfolyamat vgzett, akkor az nit tveszi tle a visz-szatrsi rtkt, gy teljesen megsznhet.

    2.3.5. A programok futtatsa

    A Linuxban, mint a tbbi Unix rendszerben, a programokat s a parancsokat ltalban a parancsrtelmez futtatja. A parancsrtelmez egy felhasznli processz, amelynek a neve shell.

    Linuxos rendszereken tbb parancsrtelmez kzl vlaszthatunk (sh, bash, tcsh stb.). A parancsrtelmezk tartalmaznak nhny beptett paran-csot. A tbbi begpelt utastst mint programnevet rtelmezik. A parancsknt megadott llomnynvvel keresnek egy futtathat llomnyt a PATH kr-nyezeti vltoz ltal megadott knyvtrakban. Ha megtalljk, akkor betltik s lefuttatjk. A parancsrtelmez a fent emltett fork metdussal lemsolja magt, s a megtallt llomny az j, leszrmazott processzben fut. Norml esetben a parancsrtelmez megvrja a gyerekprocessz futsnak a vgt, s csak ezutn adja vissza a vezrlst a felhasznlnak, de lehetsg van a pro-cesszt a httrben is futtatni.

    A futtathat fjl tbbfle binris vagy szveges parancsllomny (script) le-het. A parancsllomnyt az els sorban megadott program (amely ltalban egy parancsrtelmez), ennek hinyban az ppen hasznlt parancsrtelmez rtelmezi.

    14 Mint lthat, Linux alatt a szlak nincsenek szigoran megklnbztetve a processzektl . A szlak valjban kzs memrin osztoz processzek sajt processzazonostval.

    20

  • 2.3. Processzek

    A binris llomnyok informcikat tartalmaznak az opercis rendszer szmra, hogy rtelmezni s futtatni tudja ket, tovbb tartalmazzk a programkdot s az adatokat. A Linux alatt a leggyakrabban hasznlt binris formtum az ELF. 15

    A tmogatott binris formtumokat a kernel fordtsakor vlaszthatjuk ki, vagy utlag modulknt illeszthetjk be az rtelmezsket. Az ltalnosan hasznlt formtumok az a.out, az ELF, de pldul a Java class fjlok felisme-rst is bekapcsolhatjuk.

    2.3.6. temezs

    A Linux rendszerek prhuzamosan tbb folyamatot futtathatnak. Ritka az az eset, amikor a processzorok szmt nem haladja meg a folyamatok szma. Ezrt, hogy az egyes processzek tbb-kevsb prhuzamosan futhassanak, az opercis rendszernek folyamatosan vltogatnia kell, hogy melyik processz kapja meg a processzort. Az temez feladata az, hogy szablyozza a procesz-szorid kiosztst az egyes folyamatok szmra.

    Ahhoz, hogy az temezs felhasznli szempontbl knyelmes legyen, szksg van arra, hogy a felhasznl az egyes folyamatok prioritst szab-lyozhassa, s az szemszgbl nzve a processzek prhuzamosan fussanak. A rossz temezsi algoritmus az opercis rendszert dcgss, lassv tehe-ti, az egyes processzek tlzott hatssal lehetnek egymsra a processzorid el-osztsa sorn. Ezrt a Linux fejleszti nagy figyelmet fordtottak az temez kialaktsra.

    A processzek vltogatsval kapcsolatban kt krds merl fel.

    Mikor cserljnk le egy processzt?

    Ha mr eldntttk, hogy lecserlnk egy processzt, melyik legyen az a processz, amelyik a kvetkez lpsben megkaphatja a CPU-t?

    Ezekre a krdsekre adunk vlaszt a tovbbiakban.

    2.3.6.1. Klasszikus temezs

    A klasszikus Linux-temezs idosztsos rendszert hasznl. Ez azt jelenti, hogy az temez az idt kis szeletekre osztja (time-slice), s ezekben az idszeletekben valamilyen kivlaszt algoritmus alapjn adja meg az egyes processzeknek a fu-ts lehetsgt. m az egyes processzeknek nem kell kihasznlniuk az egsz

    15 Az ELF (Executable and Linkable Format, futtathat s linkelhet formtum) binris formtumot eredetileg a System V Release 4 UNIX-verziban vezettk be. Ksbb a Li-nux fejleszti is tvettk, mert a bels felptse sokkal flexibilisebb, mint a rgebbi a.out formtum. Ezen kvl egy hatkony debug formtuma is ltezik, amelynek neve DWARF (Debugging With Attribute Record Format), amely dinamikusan egy lncolt listban t-rolja a hibakeresshez szksges informcit.

    21

  • 2. fejezet: Betekints a Linux-kernelbe

    idszeletet, akr le is mondhatnak a processzorrl, ha ppen valamilyen rend-szeresemnyre kell vrakozniuk. Ezek a vrakozsok a rendszerhvsokon bell vannak, amikor a processz ppen kernelzemmdban fut. 16

    A Linuxban a nem fut processzeknek nincs eljoga az ppen fut pro-cesszekkel szemben, nem szakthatjk meg a fut folyamatokat annak rde-kben, hogy tvegyk a processzort. Vagyis az idszeleten bell csak a fut folyamatok mondhatnak le a processzorrl nkntes alapon, s adhatjk t egymsnak a futs lehetsgt.

    A fenti kt alapelv gondoskodik arrl, hogy megfelel idpontban kvet-kezzen be a vlts. A msik feladat a kvetkez processz kivlasztsa a fu-tsra kszek kzl. Ezt a vlasztsi algoritmust a kernelen bell a schedule() fggvny implementlja.

    A klasszikus temezs hrom stratgit (policy) tmogat: a szoksos Unix temezsi mdszert s kt, vals idej (real-time) processzek temezsre szolgl algoritmust. A vals idej processz a szoksos rtelmezs szerint azt jelenten, hogy az opercis rendszer garantlja, hogy az adott processz egy megadott, rvid idn bell megkapja a processzort, amikor szksge van r, gy reaglhat a kls esemnyekre. Ezt hvjuk hard real-time"-nak. m a Linux csak egy gynevezett soft real-time" megkzeltst tmogat, amely a vals idej processzeket a kivlaszts sorn elre veszi, gy a lehetsg szerinti legkisebb ksleltetssel juttatja processzorhoz. Mg a klasszikus temezsnl jelents az eltrs a Linux soft real-time megoldsa s egy hard real-time rend-szer kztt, a manapsg hasznlatos megoldsoknl mr nem olyan les a ha-trvonal. (Ezt a tmakrt rszletesen lsd a 2.3.8. alfejezetben.)

    A Linux a kvetkez futtatand processz kivlasztshoz prioritsos te-mezalgoritmust hasznl. A norml processzek kt prioritsrtkkel rendel-keznek: statikus s dinamikus prioritssal. A vals idej processzekhez a Linux trol mg egy prioritsrtket is, a vals idej prioritst (real time priority). Ezek a prioritsrtkek egyszer egsz szmok, amelyeknek a segt-sgvel a kivlasztalgoritmus slyozza az egyes processzeket.

    A statikus priorits A nvben szerepl statikus sz jelentse az, hogy rtke nem vltozik az id fggvnyben, csak a felhasznl mdosthatja. A processzin-formcik kztt a neve nice, amely arra utal, hogy az temez milyen kedves" lesz a processzel, s mennyire knlja processzoridvel.

    16 Minden processz rszben felhasznli zemmdban, rszben kernelzemmdban fut. A felhasznli zemmdban jval kevesebb lehetsge van a processznek, mint kernel-zemmdban, ezrt bi