2. feladat

Jelzések

Feladva okt. 10-16, 2011

Határidő okt. 29, 2011

Feltölteni egy, a jelzés(ek) kezelését implementáló forrásállományt kell. Esetenként további segédállományokra lehet szükség.

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 SIGTERM 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. A második gyerekfolyamat rögtön be is fejeződik, a szülő viszont kivárja a két gyerekfolyamat befejezését, és csak azután áll le.

 

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 és ezek időpontját.

 

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 30 másodpercenké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 SIGUSR2 jelzésre aktualizálja a beolvasott adatokat. A program SIGUSR1 jelzésre befejeződik.

 

5. Írjunk programot, mely beolvas egy állományból egy programneveket tartalmazó listát. Minden egyes program esetében 30 másodpercenké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 SIGUSR1 jelzésre aktualizálja a bemenetét. A program SIGUSR2 jelzésre befejeződik.

 

6. Írjunk programot, mely számon tartja a rendszerbe bejelentkezett felhasználók által futtatott folyamatok számát. A SIGUSR1 jelzésre kilistázza az aktuális helyzetre vonatkozó statisztikát, majd tovább fut. A program SIGUSR2 jelzésre befejeződik.

 

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.) A program SIGUSR1 jelzésre befejeződik.

 

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: eddigbeolvasott sorok száma, szavak száma, karakterek száma. (Egyszerűbb tesztelés érdekében esetleg olvasások közé be lehet egy várakozást is tenni).

 

9. Írjunk programot, mely létrehoz egy gyerekfolyamatot, és a SIGHUP 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 SIGHUP 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. A program SIGINT jelzésre 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