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övetkezok :
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érdezni 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 SIGCHLD
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.