next up previous contents
Next: Még egy kicsit Up: Kivételes események kezelésének Previous: Hagyományos signalkezelési technikák

POSIX signal-szemantika

A POSIX signal-feldolgozást irányító rutinjait úgy tervezték, hogy azok alapvetoen signal-halmazokkal foglalkozzanak: ehhez bevezették a sigset_t adattípust, mely adattípushoz definiálták a manipulációjára használható muveleteket is. Ezek a muveletek a következokgif :

int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigaddset(sigset_t *set,int sig);
int sigdelset(sigset_t *set,int sig);
int sigismember(sigset_t *set,int sig);

A sigemptyset() függvény az argumentumában megadott signal-halmazt üresre állítja, azaz olyan állapotúra, hogy egyetlen signal sem kerül bele. A sigfillset() függvény az argumentumában megadott signal-halmazt olyan értékure állítja be, hogy a rendszerben az összes definiált signal-típus benne legyen. A sigaddset() függvénnyel lehet az elso argumentumában megadott signal-halmazba a második argumentumban megadott signal-típust betenni; a sigdelset() függvénnyel pedig az elso argumentumában levo signal-halmazból a második argumentumában megadott signalt kivenni. A sigismember() függvény visszatérési értéke 1 (igaz), ha az elso argumentumában megadott signal-halmaz tartalmazza a második argumentumában megadott signalt.

A POSIX szabvány definiálja a maszkolt signalok fogalmát: ez egy folyamatonként (processzenként) nyilvántartott attributum, mely tartalmazza az összes olyan signalt, amelyeket a folyamat blokkolt, vagyis azokat a signalokat, amelyeknek a kiváltását a folyamat megtiltotta (az operációs rendszernek). Természetesen egy folyamatnak küldhetnek olyan signalokat, amiket az éppen blokkolt, de azoknak a kiváltásával az operációs rendszervárni fog a blokkolás befejezéséig. Az ilyen signalokat, amiket egy folyamat blokkol, de küldött már neki valaki: várakozó signaloknak is nevezik.

Az egyes signalok kezelésének mikéntjét a sigaction() rendszerhívással jelölhetjük ki. Ennek paraméterezése a következo:

int sigaction(int sig, const struct sigaction *newact,
              struct sigaction *oldact);

A sigaction() rendszerhívás elso argumentuma azt határozza meg, hogy melyik signal kezelését akarjuk megváltoztatni vagy lekérdeznigif A második argumentumban lehet kijelölni az elso argumentumban megadott signal-típus új (mostantól érvényes) kezelésmódját, illetve ott NULL pointert megadva a rendszerhívás nem módosítja a signal éppen érvényes kezelésmódját. A harmadik argumentumban (ha ott nem NULL értéket adunk át) az operációs rendszer visszaadja a signal eddigi kezelésének módjára vonatkozó információkat.

A signal-kezelés módját leíró struct sigaction struktúra felépítése a következo:

struct sigaction {
        void (*sa_handler)();
        sigset_t sa_mask;
        int sa_flags;
};

Az sa_handler komponense értéke vagy a SIG_IGN vagy SIG_DFL szimbolikus konstansok valamelyike (lásd részletesebben a 3.5.2 pontot), vagy pedig a signal-kezelo függvény címe lehet. Ha egy signal-kezelo függvény van az sa_handler komponensben, akkor az sa_mask komponens a signal-kezelo függvény futása alatt a még maszkolandó signalok halmazát kell, hogy tartalmazza (vagyis a signal-kezelo futásakor a maszkolt signalok halmaza ki fog bovülni az sa_mask halmazban megadott signalokkal, a signal-kezelo lefutásának végéig). Az éppen kiváltott signal automatikusan belekerül az sa_mask halmazba, így azt nem kell belerakni abba. Az sa_flags a signal-kezelés folyamatát befolyásolja, és a POSIX az egyetlen SA_NOCLDSTOP lehetséges flaget definiálja a következoképpen: ha ez be van állítva, akkor az operációs rendszer nem fog SIGCHLDgif signalt generálni olyankor, amikot a folyamat valamely gyermek-folyamatának felfüggesztodik vagy tovább folytatódik a futása.

Lehetoség van az éppen maszkolt signalok halmazának lekérdezésére és módosítására is: erre használható a sigprocmask() rendszerhívás. Ennek prototípusa a következo:

int sigprocmask(int hogyan, const sigset_t *newset, sigset_t *oldset);

Az elso argumentum értéke háromféle lehet: vagy SIG_BLOCK vagy SIG_UNBLOCK vagy pedig SIG_SETMASK. SIG_BLOCK érték esetén a második ( newset) argumentumban levo signalok hozzáadódnak a maszkolt signalok halmazához. SIG_UNBLOCK esetén a második argumentumban levo signalok ki lesznek véve a maszkolt signalok halmazából, míg a SIG_SETMASK esetén a maszkolt signalok halmazát newset-re állítja az operációs rendszer, az addigi tartalmától függetlenül. Ha a newset argumentum értéke NULL, akkor a maszkolt signalok halmaza nem módosul. Ha az oldset argumentum értéke nem NULL, akkor az általa kijelölt helyre az operációs rendszer eltárolja az éppen maszkolt signalok halmazát.

A POSIX definálja még a sigpending() illetve a sigsuspend() rendszerhívásokat is: ez elobbivel egy folyamat lekérdezheti a számára küldött, de várakozó signalok halmazát; míg a sigsuspend() függvénnyel a maszkolt signalok halmaza módosítható, majd az operációs rendszer a folyamat futását felfüggeszti addig, amíg legközelebb egy signalt nem kap.



next up previous contents
Next: Még egy kicsit Up: Kivételes események kezelésének Previous: Hagyományos signalkezelési technikák



Csizmazia Balazs
Tue Apr 2 00:06:27 MET DST 1996