sigaltstack(2) sigaltstack(2)
NAME
sigaltstack - Alternativen Stack-Kontext eines Signals setzen/lesen
SYNTAX
#include <signal.h>
int sigaltstack(const stackt *ss, stackt *oss);
BESCHREIBUNG
Mit sigaltstack() wird ein alternativer Stack-Bereich definiert, in
dem Signale bearbeitet werden können. Wenn ss ungleich Null ist, wird
ein Zeiger auf einen Stack-Bereich erwartet, auf dem die Signale bear-
beitet werden können; dem System wird mitgeteilt, ob der Prozeß gerade
mit dem Stack arbeitet. Wenn die Aktion des Signals anzeigt, daß mit
dem alternativen Stack gearbeitet werden soll [angegeben durch
sigaction(2)], prüft das System, ob der Prozeß momentan auf dem alter-
nativen Stack abläuft. Operiert der Prozeß nicht auf dem Signal-Stack,
schaltet das System für die Dauer der Ausführung der Signalbehand-
lungsroutine auf den alternativen Signal-Stack um.
Die Struktur sigaltstack enthält die folgenden Komponenten:
char *sssp
int sssize
int ssflags
Ist ss nicht NULL, wird ein Zeiger auf den alternativen Signal-Stack
erwartet, welcher nach Rückkehr von sigaltstack() wirksam wird. Die
Komponenten sssp und sssize bestimmen die Basis und die Größe des
Stacks, welche automatisch an die Wachstumsrichtung und Wertigkeit
angepaßt wird. Die Komponente ssflags gibt den Zustand des neuen
Stacks an und kann die folgenden Optionen aufweisen:
SSDISABLE Der Stack wird deaktiviert und sssp und sssize werden
ignoriert. Wenn SSDISABLE nicht gesetzt ist, wird der
Stack aktiviert.
Ist oss nicht NULL, wird ein Zeiger auf eine Struktur erwartet, welche
den alternativen Signal-Stack bezeichnet, der vor dem Aufruf von
sigaltstack() aktiv war. sssp und sssize geben die Basis und die
Größe des Stacks an. Die Komponente ssflags gibt den Zustand des
Stacks an. Dieser Zustand kann die folgenden Werte annehmen:
SSONSTACK Der Prozeß wird momentan mit dem alternativen Signal-Stack
ausgeführt. Versuche, den alternativen Signal-Stack wäh-
rend der Ausführung des Prozesses zu ändern, schlagen
fehl.
SSDISABLE Der alternative Signal-Stack ist momentan deaktiviert.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
sigaltstack(2) sigaltstack(2)
Der Wert SIGSTKSZ ist ein Systemstandardwert, der die Anzahl der Bytes
angibt, die im Normalfall bei der manuellen Zuordnung eines alternati-
ven Stack-Bereichs belegt werden. Der Wert MINSIGSTKSZ definiert dabei
die minimale Stack-Größe für eine Signalbehandlungsroutine. Bei der
Berechnung einer alternativen Stack-Größe sollte ein Programm diesen
Minimalwert noch zum erforderlichen Stack-Bedarf addieren, um den
Eigenbedarf des Betriebssystems zu berücksichtigen. Die Konstanten
SSONSTACK, SSDISABLE, SIGSTKSZ und MINSIGSTKSZ sind in signal(5)
definiert.
Nach erfolgreichem Aufruf einer der exec-Funktionen enthält die neue
Prozeßabbildung keine alternativen Signal-Stacks.
FEHLER
Die folgenden Beschreibungen der Fehlercodes sind funktionsspezifisch.
Eine allgemeingültige Beschreibung finden Sie in introprm2(2) bzw. in
errno(5).
sigaltstack() schlägt fehl, wenn eine der folgenden Bedingungen gege-
ben ist:
EFAULT ss oder oss weisen über den zugewiesenen Adreßraum des Pro-
zesses hinaus.
EINVAL Das Argument ss ist kein Nullzeiger und die Komponente
ssflags, auf die ss zeigt, enthält andere Flags als
SSDISABLE.
ENOMEM Die Größe des alternativen Stack-Bereichs ist kleiner als
MINSIGSTKSZ.
EPERM Es wurde versucht, einen aktiven Stack zu ändern.
ERGEBNIS
Bei Erfolg liefert sigaltstack() 0 zurück. Bei Fehler wird -1 zurück-
gegeben und errno zur Anzeige des Fehlers gesetzt.
HINWEISE
Der folgende Programmauszug wird dazu verwendet, um einen alternativen
Stack-Bereich zuzuordnen:
if ((sigstk.sssp = (char *)malloc(SIGSTKSZ)) == NULL)
/* Fehlerbehandlung */;
sigstk.sssize = SIGSTKSZ;
sigstk.ssflags = 0;
if (sigaltstack(&sigstk, (stackt *)0) < 0)
perror("sigaltstack");
SIEHE AUCH
getcontext(2), sigaction(2), sigsetjmp(3C), signal(5), ucontext(5).
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98