2. feladat

Feladva okt. 5-11, 2009

Határidő okt. 24, 2009

Jelzések

Feltölteni egy, a jelzés(ek) kezelését implementáló forrásállományt kell, neve S02_nn_xxxxxxxxx.c ahol nn - feladat száma; xxxxxxxxx - felhasználó azonosítója a linux szerveren. Esetenként további segédállományokra lehet szükség. Ezek neve S02_nn_xxxxxxxxx_ -el kezdődjön.

Amennyiben a házi nem volt órán bemutatva, ne felejtsük el a teszteredményeknek a feladathoz való hozzáfűzésekor pontosan ismertetni azt is, hogy hogyan történt a program tesztelése: hogyan küldtük a kért jelzés(eke)t a folyamat(ok)nak.

1. Írjunk programot, mely létrehoz két gyerekfolyamatot, a SIGQUIT jelzésre az egyik gyerekfolyamat befejeződik (az alapértelmezett jelzéskezelőt használva), a szülőfolyamat és a második gyerekfolyamat pedig ugyanazon jelzés hatására kiír egy üzenetet, melyben szerepel az illető folyamat azonosítója, majd ők is befejeződnek.

2. Írjunk programot, mely egy olyan kritikus szakaszt valósít meg, amin belül nem veszi figyelembe a SIGQUIT és SIGINT jelzéseket. A kritikus szakaszból a SIGTERM jelzés hatására lépjen ki, és írja ki a képernyőre a kritikus szakaszban eltöltött idő során kapott jelzéseket.

3. Írjunk programot, mely a SIGQUIT jelzésre kilistázza a rendszer azon felhasználóit, akiknek vannak „zombie” (Z), illetve külön azokat, akiknek vannak felfüggesztett (T) állapotban levő folyamataik, majd befejeződik.

4. Írjunk programot, mely beolvas egy állományból egy, néhány felhasználónevet tartalmazó listát. Minden egyes felhasználó esetében 2 percenként listázza ki a program, hogy be van-e jelentkezve és mióta. Amennyiben a felhasználó-listát tartalmazó állományt módosítjuk, a program a SIGHUP jelzésre aktualizálja a beolvasott adatokat.

5. Írjunk programot, mely beolvas egy állományból egy programneveket tartalmazó listát. Minden egyes program esetében 2 percenként listázza ki azon felhasználók nevét, akik ezt a programot futtatják. Amennyiben a program-listát tartalmazó állományt módosítjuk, a program a SIGHUP jelzésre aktualizálja a bemenetét.

6. Írjunk programot, mely számon tartja a rendszerbe bejelentkezett felhasználók által futtatott folyamatok számát. A SIGHUP jelzésre ismételten kilistázza az aktuális helyzetre vonatkozó statisztikát.

7. Írjunk programot, mely számon tartja azon folyamatokat, melyek a processzort több mint 50%-al terhelik. A SIGHUP jelzésre listázza ki az aktuális helyzetre vonatkozó információkat. (Megj.: ahhoz, hogy a programot kipróbálhassuk, lehet, hogy az 50% helyett kisebb értéket kell használnunk.)

8. Írjunk programot, mely a SIGUSR1 jelzésre elkezdi egy szövegállomány olvasását, a SIGUSR2 jelzésre pedig erre vonatkozó statisztikát ír ki: sorok száma, szavak száma, karakterek száma.

9. Írjunk programot, mely létrehoz egy gyerekfolyamatot, és a SIGUSR1 jelre véletlenszerűen választ egy jelzést (egy tetszőlegesen meghatározott, legalább 5 különböző jelzést tartalmazó listából), melyet elküld a gyerekfolyamatnak. A gyerekfolyamat kiírja, hogy milyen jelzést kapott, majd végrehajtja az illető jelzéshez tartozó alapértelmezett műveletet.

10. Írjunk programot, mely megfordítja két jelzés hatását: például a SIGINT jelzésre egy SIGFPE jelzést generáljon és fordítva. (Más szóval SIGINT jelzésre azt hajtsa vérge, amit alapértelmezett módon SIGFPE jelzésre hajtana vérge, és fordítva. Esetleg előzőleg kiírhat egy, a kapott jelzést azonosító szöveget.)

11. Írjunk programot, mely a SIGINT jelzésre kilistázza a rendszerbe bejelentkezett felhasználók azonosítóját (mindeniket csak egyszer), illetve mindegyik mellé odaírja az általa éppen használt folyamatok számát, majd befejeződik.


Tippek / gyakori hibák

  • a signal függvény NEM generál jelzést (ezt a kill paranccsal lehet megtenni), csupán beállítja, hogy a megfelelő jelzést melyik függvény kezelje majd le
  • a feladat tesztelésére (tetszés szerint, illetve attól függően, hogy mit kér a feladat) lehet
    • rövid tesztprogramot írni, ami a kill (C függvény) segítségével generál jelzést
    • a parancssorból a kill (shell parancs) segítségével jelzést küldeni
    • a megfelelő billentyűkombináció segítségével generálni a jelzést

ne felejtsünk el az elküldött házihoz mellékelni egy leírást a tesztelés módjáról

  • miután a signal függvénnyel beállítottuk, hogy milyen kezelőfüggény fusson le az adott jel érkezésekor, ahhoz, hogy tesztelhessük is a jelzés kezelését, a folyamat nem fejeződhet be azonnal. Amennyiben a feladatban ez nincs másként meghatározva, egy végtelen ciklusban várakozhatunk a jelzésekre (lásd pause függvény).
  • Ha a ciklusban a folyamatnak semmi más dolga nincs, mint hogy jelzéseket fogadjon, akkor a
    "while(1) pause();"
    megoldás azért jobb, mint a
    "while(1);",
    mivel az első esetben a rendszer felfüggeszti a folyamatot egy jel érkezéséig (és a folyamatnak amúgy sincs egyéb dolga), míg a második esetben a processzort foglalva várakozik
  • A rendszerben definiált jelzésekről információt kaphatunk a "kill -l" shell paranccsal