Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

sigaltstack - alternativen Stack eines Signals setzen/lesen

&pagelevel(4)&pagelevel

Definition

#include <signal.h>

int sigaltstack(const stack_t *ss, stack_t *oss);

Beschreibung

Mit sigaltstack() wird ein alternativer Stack definiert, in dem Signale bearbeitet werden können. Wenn ss ungleich null ist, wird ein Zeiger auf eine stack_t Struktur erwartet, die einen Stack beschreibt, auf dem die Signale bearbeitet werden können. Mit sigaction kann man festlegen, welche Signale auf dem alternativen Signalstack behandelt werden sollen. Für die Dauer der Ausführung der Signalbehandlungsroutine schaltet das System dann auf den Signalstack um.

Die Struktur stack_t enthält die folgenden Komponenten:

int     *ss_sp
long    ss_size
int     ss_flags

Ist ss nicht NULL, beschreibt die Struktur stack_t einen alternativen Signalstack, welcher nach Rückkehr von sigaltstack() wirksam wird. Die Komponenten ss_sp und ss_size bestimmen die Basis und die Größe des Stacks. Die Komponente ss_flags gibt den Zustand des neuen Stacks an und kann die folgenden Werte aufweisen:

SS_DISABLE

Der Stack wird deaktiviert und ss_sp und ss_size werden ignoriert. Wenn SS_DISABLE nicht gesetzt ist, wird der Stack aktiviert.

Ist oss nicht NULL, so enthält die Struktur nach erfolgreicher Rückkehr aus sigaltstack die Beschreibung des alternativen Signalstacks, der vor dem Aufruf von sigaltstack() aktiv war. ss_sp und ss_size geben die Basis und die Größe des Stacks an.

Die ss_flags-Komponente gibt den Zustand des Stacks an. Dieser Zustand kann die folgenden Werte annehmen:

SS_ONSTACK

Der Prozess wird momentan mit dem alternativen Signalstack ausgeführt. Versuche, den alternativen Signalstack während der Ausführung des Prozesses zu ändern, schlagen fehl.

SS_DISABLE

Der alternative Signalstack ist momentan deaktiviert.

Der Wert SIGSTKSZ stellt die Anzahl der Bytes dar, welche im Allgemeinen für einen alternativen Stack notwendig sind. Der Wert MINSIGSTKSZ definiert dabei die minimale Stackgröße für eine Signalbehandlungsroutine. Bei der Berechnung der Stackgröße sollte das Programm noch diesen Minimalwert zusätzlich anlegen, um den Eigenbedarf des Betriebssystems zu berücksichtigen. Die Konstanten SS_ONSTACK, SS_DISABLE, SIGSTKSZ und MINSIGSTKSZ sind in <signal.h> definiert.

Returnwert

0

bei Erfolg.

 

-1

bei Fehler. errno wird gesetzt, um den Fehler anzuzeigen.

Fehler

sigaltstack() schlägt fehl, wenn gilt: 

 

EPERM

Es wurde versucht, einen aktiven Stack zu verändern (deaktivieren).

 

EINVAL

Das Argument ss ist nicht null und die ss_flags-Komponente, auf die ss zeigt, enthält andere Flags als SS_DISABLE.

 

ENOMEM

Die Größe des alternativen Stackbereichs ist kleiner als MINSIGSTKSZ.

Beispiel

Der folgende Programmauszug wird dazu verwendet, um einen alternativen Stackbereich zu allokieren:

if ((sigstk.ss_sp = (char *)malloc(SIGSTKSZ)) == NULL)
         /* Fehlerbehandlung */;
sigstk.ss_size = SIGSTKSZ;
sigstk.ss_flags = 0;
if (sigaltstack(&sigstk, (stack_t *)0) < 0)
      perror("sigaltstack");

Siehe auch

sigaction(), sigsetjmp(), signal.h