Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ setjmp(3C) — Reliant UNIX 5.44c4

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

signal(2)

setjmp(3C-ucb)

sigsetjmp(3C)

setjmp(3C)                                                       setjmp(3C)

NAME
     setjmp, longjmp - Nichtlokaler Sprung

SYNTAX
     #include <setjmp.h>

     int setjmp(jmpbuf env);

     void longjmp(jmpbuf env, int val);

BESCHREIBUNG
     Mit diesen Funktionen können Fehler und Interrupts bearbeitet werden,
     die in einer betriebssystemnahen Funktion eines Programms auftreten.

     Die Funktion setjmp() sichert die Aufrufumgebung in env (dessen Typ
     jmpbuf in der Include-Datei setjmp.h definiert ist) für eine spätere
     Verwendung durch longjmp(). Sie gibt den Wert 0 zurück.

     longjmp() stellt die Umgebung wieder her, die durch den letzten Aufruf
     von setjmp() mit dem entsprechenden Argument env gesichert wurde. Wenn
     kein solcher Aufruf erfolgte, oder wenn die Ausführung des setjmp()-
     Aufrufs in der Zwischenzeit beendet wurde, ist das Verhalten unbe-
     stimmt. Es ist nicht definiert, ob longjmp() die Signalmaske wiede-
     rherstellt, die Signalmaske unverändert läßt oder sie auf den Wert
     zurücksetzt, den sie zur Zeit des setjmp()-Aufrufs hatte.

     Alle Objekte, auf die zugegriffen werden kann, haben die gleichen
     Werte, die sie auch beim Aufruf von longjmp() hatten, mit der Aus-
     nahme, daß die Werte von Objekten mit einer Lebensdauer des Speicher-
     bereichs für automatische Variablen (Automatic Storage Duration) unbe-
     stimmt sind, wenn sie den folgenden Kriterien entsprechen:

     -  Es handelt sich um lokale Objekte in Bezug auf die Funktion, die
        den setjmp()-Aufruf enthält.

     -  Die Objekte sind nicht vom Typ volatile.

     -  Die Objekte werden zwischen dem setjmp()-Aufruf und dem longjmp()-
        Aufruf geändert.

     Da der normale Funktionsaufruf und Return-Mechanismus umgangen wird,
     wird longjmp() im Zusammenhang mit Interrupts, Signalen und allen die-
     sen zugeordneten Funktionen korrekt ausgeführt. Wird longjmp() aller-
     dings von einer verschachtelten Routine zur Signalbearbeitung aus auf-
     gerufen (das heißt, von einer Funktion, die aufgrund eines Signals
     aufgerufen wurde, das während der Bearbeitung eines anderen Signals
     aufgetreten ist), ist das Verhalten unbestimmt.

BEISPIELE
     #include <stdio.h>
     #include <stdlib.h>
     #include <setjmp.h>



Seite 1                      Reliant UNIX 5.44               Gedruckt 11/98

setjmp(3C)                                                       setjmp(3C)

     jmpbuf env;
     int i = 0;
     main ()
     {
         void exit();
         if(setjmp(env) != 0) {
                 (void) printf("Wert von i bei 2. Rückkehr von setjmp:
                 %d\n", i);
                 exit(0);
         }
         (void) printf("Wert von i bei 1. Rückkehr von setjmp: %d\n", i);
         i = 1;
         g();       /*NOTREACHED*/
     }
     g()
     {
         longjmp(env, 1);       /*NOTREACHED*/
     }

     Wird das sich aus diesem C-Code ergebende a.out ausgeführt, sieht die
     Ausgabe folgendermaßen aus:

          Wert von i bei 1. Rückkehr von setjmp: 0

          Wert von i bei 2. Rückkehr von setjmp: 1

HINWEISE
     Anwendungen, deren Verhalten vom Wert der Signalmaske abhängig ist,
     sollten die Funktionen longjmp() und setjmp() nicht verwenden, da
     deren Auswirkungen auf die Signalmaske unbestimmt sind. Statt dessen
     können folgende Alternativen verwendet werden:

     -  Die Funktionen longjmp() und setjmp() (die die Signalmaske nie-
        mals ändern).

     -  Die Funktionen siglongjmp() und sigsetjmp() (die die Signalmaske
        von der Anwendung gesteuert sichern und wiederherstellen können).

     Um Fehler und Interrupts in einem Unterprogramm zu untersuchen, ist es
     sinnvoller, die Funktion sigsetjmp(3C) zu verwenden.

SIEHE AUCH
     signal(2), setjmp(3C-ucb), sigsetjmp(3C).











Seite 2                      Reliant UNIX 5.44               Gedruckt 11/98

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026