sigstack(3) (BSD Compatibility Package) sigstack(3)
NAME
sigstack - Kontext des Signal-Stack angeben und/oder abrufen
SYNTAX
/usr/ucb/cc [flag ...] file ... -lucb
#include <signal.h>
int sigstack(struct sigstack *ss, struct sigstack *oss);
BESCHREIBUNG
Mit sigstack können Benutzer einen anderen Stack (Stapelspeicher)
definieren, der als Signal-Stack bezeichnet wird und in dem die Sig-
nale verarbeitet werden. Wenn durch die Aktion eines Signals angezeigt
wird, daß die Bearbeitungsroutine in einem Signal-Stack ausgeführt
werden soll [angegeben mit einem Aufruf von sigvec(3)], prüft das
System, ob der Prozeß derzeit in diesem Stack ausgeführt wird. Wird
der Prozeß nicht im Signal-Stack ausgeführt, schaltet das System so
lange in den Signal-Stack um, bis die Routine zur Signalbehandlung
beendet ist.
Ein Signal-Stack wird durch eine sigstack-Struktur angegeben, die fol-
gende Elemente enthält:
char *sssp; /* Zeiger auf den Signal-Stack */
int ssonstack; /* aktueller Status */
sssp ist der Ausgangswert (Basis), der dem Stack-Zeiger zugeordnet
wird, wenn das System in den Signal-Stack umschaltet. Beachten Sie,
daß auf Systemen, auf denen die Stack-Adresse mit der Speicheradresse
wächst, dies nicht die Adresse vom Anfang des Signal-Stack-Bereichs
ist. Das Feld ssonstack ist Null oder ungleich Null, je nachdem, ob
der Prozeß derzeit im Signal-Stack oder in einem anderen Stack ausge-
führt wird.
Ist ss kein NULL-Zeiger, setzt sigstack den Status des Signal-Stacks
auf den Wert in der sigstack-Struktur, auf den ss zeigt. Ist
ssonstack nicht Null, geht das System davon aus, daß der Prozeß im
Signal-Stack ausgeführt wird. Ist ss ein NULL-Zeiger, bleibt der Sta-
tus des Signal-Stacks unverändert. Ist oss kein NULL-Zeiger, wird der
aktuelle Status des Signal-Stacks in der sigstack-Struktur gespei-
chert, auf die oss zeigt.
Nach erfolgreichem Aufruf einer der exec-Funktionen enthält die neue
Prozeßabbildung keine alternativen Signal-Stacks mehr.
RÜCKGABEWERT
Bei erfolgreicher Ausführung wird der Wert 0 zurückgegeben. Andern-
falls wird der Wert -1 zurückgegeben und errno gesetzt, um den Fehler
anzuzeigen.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
sigstack(3) (BSD Compatibility Package) sigstack(3)
DIAGNOSE
Bei folgender Bedingung schlägt sigstack fehl, und der Kontext des
Signal-Stacks bleibt unverändert:
EFAULT Entweder ss oder oss zeigt auf Speicher, der für den Adreß-
bereich des Prozesses nicht gültig ist.
EPERM Es wurde versucht, einen alternativen Stack zu ändern.
HINWEISE
Signal-Stacks werden nicht automatisch vergrößert, wie dies bei norma-
len Stacks der Fall ist. Wenn der Signal-Stack überläuft, können daher
unerwartete Ergebnisse auftreten.
Wenn eine portierbare Anwendung geschrieben oder neu geschrieben wird,
sollte die Funktion sigaltstack() anstelle von sigstack() verwendet
werden.
Bei einigen Implementierungen wird der Stack-Bereich automatisch nach
Bedarf erweitert. Diese automatische Erweiterung ist jedoch normaler-
weise nicht für alternative Stacks verfügbar. Wenn ein Signal-Stack
überläuft, ist das Verhalten des Prozesses unbestimmt.
Die Richtung des Stack-Wachstums ist in der bisherigen Definition von
struct sigstack nicht angegeben. Nur indem eine Anwendung die Stack-
Wachstumsrichtung feststellt oder einen Speicherblock zuordnet und den
Stack-Zeiger anschließend auf dessen Mitte setzt, kann ein Stack-Zei-
ger portierbar eingerichtet werden. Die Implementierung geht mögli-
cherweise davon aus, daß die Größe des Signal-Stacks dem Wert SIGSTKSZ
entspricht, wie in <signal.h> angegeben. Soll eine Implementierung
eine andere Signal-Stack-Größe als SIGSTKSZ angeben, sollte
sigaltstack() verwendet werden.
Programme sollten longjmp() nicht zum Verlassen einer Signalbehand-
lungsroutine verwenden, die in einem mit sigstack() erstellten
Signal-Stack ausgeführt wird. Hierdurch kann der Signal-Stack später
möglicherweise nicht mehr verwendet werden. Für eine nicht normale
Beendigung einer Signalbehandlungsroutine kann siglongjmp(),
setcontext() oder swapcontext() verwendet werden. Diese Funktionen
unterstützen den Wechsel von einem Stack in einen anderen.
Zur Verwendung der Funktion sigstack() sind Kenntnisse über die
zugrundeliegende Stack-Architektur des Systems erforderlich. Aus die-
sem Grunde ist sigaltstack() der hier beschriebenen Funktion vorzuzie-
hen.
SIEHE AUCH
exec(2), fork(2), sigaltstack(2), signal(2), sigvec(3), signal(3-ucb),
setjmp(3C), sigsetjmp(3C), signal(5).
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98