Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ setjmp(3C-ucb) — Reliant UNIX 5.44c4

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

cc(1)

signal(2)

sigsetmask(3)

sigvec(3)

signal(3-ucb)

setjmp(3C)

setjmp(3C-ucb)          (BSD Compatibility Package)          setjmp(3C-ucb)

NAME
     setjmp, longjmp, setjmp, longjmp - Nichtlokaler Sprung

SYNTAX
     /usr/ucb/cc [flag ...] file ... -lucb

     #include <setjmp.h>

     int setjmp(jmpbuf env);

     longjmp(jmpbuf env, int val);

     int setjmp(jmpbuf env);

     longjmp(jmpbuf env, int val);

BESCHREIBUNG
     setjmp und longjmp bieten sich für die Bearbeitung von Fehlern und
     Interrupts an, die in einer Low-Level-Subroutine eines Programms auf-
     treten.

     setjmp sichert die Stack-Umgebung in env für eine spätere Verwendung
     durch longjmp. Ein normaler Aufruf von setjmp gibt Null aus. setjmp
     sichert ferner die Registerumgebung. Wenn longjmp aufgerufen wird,
     darf die Routine, die setjmp aufgerufen hat, erst wieder zurückkehren,
     nachdem longjmp die Steuerung wieder zurückgegeben hat (siehe unten).

     longjmp stellt die durch den letzten Aufruf von setjmp gesicherte
     Umgebung wieder her, und setzt die Ausführung fort, als hätte der Auf-
     ruf von setjmp gerade den Wert val an die Funktion zurückgegeben,
     durch die setjmp aufgerufen wurde; wenn val gleich Null ist, würde die
     Ausführung allerdings so fortgesetzt, als hätte der Aufruf von setjmp
     den Wert Eins zurückgegeben. Hierdurch wird sichergestellt, daß eine
     durch den Aufruf von longjmp hervorgerufene Rückkehr von setjmp von
     der regulären Rückkehr von setjmp unterschieden werden kann. Die auf-
     rufende Funktion darf in der Zwischenzeit nicht selbst zurückgekehrt
     sein, da longjmp andernfalls die Steuerung an eine möglicherweise
     nicht existierende Umgebung übergibt. Alle speichergebundenen Daten
     haben die Werte, die sie zum Zeitpunkt des Aufrufs von longjmp hatten.
     Die CPU- und Gleitkommadatenregister werden wieder auf die Werte
     zurückgesetzt, die sie zur Zeit des Aufrufs von setjmp hatten. Da die
     Speicherklasse register allerdings nur als Hinweis für den C-Compiler
     dient, werden als register-Variablen deklarierte Variablen nicht unbe-
     dingt den Rechnerregistern zugeordnet, so daß deren Werte nach einem
     Aufruf von longjmp unvorhersehbar sind. Dies ist besonders dann ein
     Problem, wenn der Programmierer rechnerunabhängige C-Routinen schrei-
     ben will.








Seite 1                      Reliant UNIX 5.44               Gedruckt 11/98

setjmp(3C-ucb)          (BSD Compatibility Package)          setjmp(3C-ucb)

     Die Funktionen longjmp() und setjmp() entsprechen den Funktionen
     longjmp() beziehungsweise setjmp(), nur mit der zusätzlichen Ein-
     schränkung, daß longjmp() und setjmp() die Signalmaske nicht manipu-
     lieren.

     Wenn longjmp() aufgerufen wird, obwohl env niemals durch einen Aufruf
     von setjmp() initialisiert wurde, oder wenn sich der letzte
     setjmp()-Aufruf in einer mittlerweile zurückgekehrten Funktion befin-
     det, sind die Ergebnisse nicht definiert.

     Diese Funktionen sichern weder Gleitkommastatus oder Steuerregister
     noch stellen sie diese wieder her.

BEISPIELE
     Das folgende Code-Fragment zeigt den Steuerfluß aus der Kombination
     von setjmp und longjmp:

          function declaration
          ...
                jmpbuf myenvironment;
                ...
                if (setjmp(myenvironment))  {
                  /* register variables have unpredictable values */
                     code after the return from longjmp
                     ...
                } else {
                  /* do not modify register vars in this leg of code */
                     this is the return from setjmp
                       ...
                }

ANWENDUNGSZWECK
     Wenn longjmp() ausgeführt wird, und die Umgebung, in der setjmp()
     ausgeführt wurde, nicht mehr existiert, können Fehler auftreten.
     Bedingungen, unter denen die Umgebung von setjmp() nicht mehr exi-
     stiert, sind unter anderem das Verlassen der Funktion, die den
     setjmp()-Aufruf enthält, sowie das Verlassen eines inneren Blocks mit
     temporärem Speicher. Diese Bedingung ist unter Umständen nicht fest-
     stellbar; in diesem Fall wird ein longjmp() ausgeführt und wenn die
     Umgebung nicht mehr existiert, ist der Inhalt des temporären Speichers
     eines inneren Blocks unvorhersehbar. Diese Bedingung kann auch zu
     einem unerwarteten Prozeßende führen. Wenn die Funktion zurückkehrt,
     sind die Ergebnisse nicht definiert.

     Wird longjmp() ein Zeiger auf einen nicht durch setjmp() erstellten
     Puffer, longjmp() ein Zeiger auf einen nicht durch setjmp() erstell-
     ten Puffer oder siglongjmp() ein Zeiger auf einen nicht durch
     sigsetjmp() erstellten Puffer übergeben, oder wird einer dieser drei
     Funktionen ein Puffer übergeben, der durch den Benutzer geändert
     wurde, können alle oben genannten und noch weitere Probleme auftreten.




Seite 2                      Reliant UNIX 5.44               Gedruckt 11/98

setjmp(3C-ucb)          (BSD Compatibility Package)          setjmp(3C-ucb)

     Die Funktionen longjmp() und setjmp() sind zur Unterstützung von
     Programmen aufgenommen, die für frühere Systemschnittstellen geschrie-
     ben wurden. Neuere Anwendungen sollten die Funktionen siglongjmp()
     beziehungsweise sigsetjmp() verwenden.

FEHLER
     setjmp sichert keine Angaben darüber, ob der Prozeß im Signal-Stack
     ausgeführt wird. Hieraus ergibt sich, daß ein longjmp auf manche Stel-
     len im Signal-Stack den Status des Signal-Stacks nicht korrekt hinter-
     läßt.

     Auf einigen Systemen sichert setjmp auch die Registerumgebung. Daher
     werden alle registergebundenen Daten auf die Werte zurückgesetzt, die
     sie beim Aufruf von setjmp hatten. Alle speichergebundenen Daten haben
     Werte, die denen zur Zeit des Aufrufs von longjmp entsprechen. Da die
     Speicherklasse register allerdings nur als Hinweis für den C-Compiler
     dient, werden als register-Variablen deklarierte Variablen nicht unbe-
     dingt den Rechnerregistern zugeordnet, so daß deren Werte nach einem
     Aufruf von longjmp unvorhersehbar sind. Bei Verwendung von Compiler-
     Optionen mit automatischer Registerzuordnung [siehe cc(1)] versucht
     der Compiler nicht, Registern in Routinen, die setjmp aufrufen, Varia-
     blen zuzuordnen.

     longjmp veranlaßt setjmp niemals dazu, den Wert Null zurückzugeben.

SIEHE AUCH
     cc(1), signal(2), sigsetmask(3), sigvec(3), signal(3-ucb), setjmp(3C).



























Seite 3                      Reliant UNIX 5.44               Gedruckt 11/98

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