.\" -*- coding: UTF-8 -*- '\" t .\" Copyright (C) 2016 Michael Kerrisk .\" .\" SPDX-License-Identifier: GPL-2.0-or-later .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH setjmp 3 "20. Juli 2023" "Linux man\-pages 6.05.01" .SH BEZEICHNUNG setjmp, sigsetjmp, longjmp, siglongjmp \- Nichtlokalen Sprungbefehl durchführen .SH BIBLIOTHEK Standard\-C\-Bibliothek (\fIlibc\fP, \fI\-lc\fP) .SH ÜBERSICHT .nf \fB#include \fP .PP \fBint setjmp(jmp_buf \fP\fIUmg\fP\fB);\fP \fBint sigsetjmp(sigjmp_buf \fP\fIUmg\fP\fB, int \fP\fIspeicherSig\fP\fB);\fP .PP \fB[[noreturn]] void longjmp(jmp_buf \fP\fIUmg\fP\fB, int \fP\fIWert\fP\fB);\fP \fB[[noreturn]] void siglongjmp(sigjmp_buf \fP\fIUmg\fP\fB, int \fP\fIWert\fP\fB);\fP .fi .PP .RS -4 Mit Glibc erforderliche Feature\-Test\-Makros (siehe \fBfeature_test_macros\fP(7)): .RE .PP \fBsetjmp\fP(): siehe ANMERKUNGEN. .PP \fBsigsetjmp\fP(): .nf _POSIX_C_SOURCE .fi .SH BESCHREIBUNG Die auf dieser Seite beschriebenen Funktionen werden für »nichtlokale Gotos« verwandt: Übergabe der Ausführung von einer Funktion zu einer vorbestimmten Stelle in einer anderen Funktion. Die Funktion \fBsetjmp\fP() etabliert dynamisch das Ziel, zu dem die Steuerung später übergeben wird und \fBlongjmp\fP() führt den Ausführungstransfer aus. .PP Die Funktion \fBsetjmp\fP() speichert verschiedene Informationen über die aufrufende Umgebung (typischerweise den Stack\-Zeiger, den Anweisungszeiger, möglicherweise die Werte von anderen Registern und die Signalmaske) im Puffer \fIUmg\fP für die spätere Verwendung durch \fBlongjmp\fP(). In diesem Fall liefert \fBsetjmp\fP() 0 zurück. .PP Die Funktion \fBlongjmp\fP() verwendet die in \fIUmg\fP gespeicherten Informationen, um die Steuerung zu dem Punkt zurückzuübergeben, an dem \fBsetjmp\fP() aufgerufen worden war und den Stack auf seinem Zustand zum Zeitpunkt des Aufrufs von \fBsetjmp\fP() wiederherzustellen (»zurückzuspulen«). Zusätzlich und abhängig von der Implementierung (siehe ANMERKUNGEN) können die Werte einiger anderer Register und der Prozesssignalmaske auf den Wert zum Zeitpunkt des Aufrufs von \fBsetjmp\fP() wiederhergestellt werden. .PP Nach einem erfolgreichen \fBlongjmp\fP() fährt die Ausführung so fort, als ob \fBsetjmp\fP() ein zweites Mal zurückgekehrt wäre. Diese »Schummel«\-Rückkehr kann von einem echten Aufruf von \fBsetjmp\fP() unterschieden werden, da die »Schummel«\-Rückkehr den in \fIWert\fP bereitgestellten Wert zurückliefert. Falls der Programmierer fehlerhafterweise den Wert 0 in \fIWert\fP weitergibt, wird die »Schummel«\-Rückkehr stattdessen 1 zurückliefern. .SS "sigsetjmp() und siglongjmp()" \fBsigsetjmp\fP() und \fBsiglongjmp\fP() führen auch nichtlokale Gotos durch, stellen aber eine vorhersehbare Behandlung der Prozesssignalmaske bereit. .PP Nur wenn das an \fBsigsetjmp\fP() übergebene Argument \fIspeicherSig\fP nicht Null ist, wird die aktuelle Signalmaske des Prozesses in \fIUmg\fP gespeichert und wiederhergestellt, wenn später mit diesem \fIUmg\fP ein \fBsiglongjmp\fP durchgeführt wird. .SH RÜCKGABEWERT \fBsetjmp\fP() und \fBsigsetjmp\fP() geben 0 zurück, wenn sie direkt aufgerufen wurden; bei dem »nachgeahmten« Zurückkehren, das nach \fBlongjmp\fP() und \fBsiglongjmp\fP() auftritt, wird der in \fIWert\fP angegebene Nichtnull\-Wert zurückgegeben. .PP Die Funktionen \fBlongjmp\fP() oder \fBsiglongjmp\fP() kehren nicht zurück. .SH ATTRIBUTE Siehe \fBattributes\fP(7) für eine Erläuterung der in diesem Abschnitt verwandten Ausdrücke. .TS allbox; lbx lb lb l l l. Schnittstelle Attribut Wert T{ .na .nh \fBsetjmp\fP(), \fBsigsetjmp\fP() T} Multithread\-Fähigkeit MT\-Sicher T{ .na .nh \fBlongjmp\fP(), \fBsiglongjmp\fP() T} Multithread\-Fähigkeit MT\-Sicher .TE .sp 1 .SH STANDARDS .TP \fBsetjmp\fP() .TQ \fBlongjmp\fP() C11, POSIX.1\-2008. .TP \fBsigsetjmp\fP() .TQ \fBsiglongjmp\fP() POSIX.1\-2008. .SH GESCHICHTE .TP \fBsetjmp\fP() .TQ \fBlongjmp\fP() POSIX.1\-2001, C89. .TP \fBsigsetjmp\fP() .TQ \fBsiglongjmp\fP() POSIX.1\-2001. .PP .\" so that _FAVOR_BSD is triggered .\" .BR _XOPEN_SOURCE_EXTENDED , POSIX spezifiziert nicht, ob \fBsetjmp\fP() die Signalmaske sichern wird (um sie später während \fBlongjmp\fP() wieder herzustellen). In System\-V wird es dies nicht tun. In 4.3BSD wird es dies tun und dort gibt es eine Funktion \fB_setjmp\fP(), die es nicht tut. Das Verhalten unter Linux hängt von der Glibc\-Version und den Einstellungen der Feature\-Test\-Makros ab. Vor Glibc 2.19 folgte \fBsetjmp\fP() standardmäßig dem Verhalten von System V, aber das BSD\-Verhalten wird bereitgestellt, wenn das \fB_BSD_SOURCE\fP\-Feature\-Test\-Macro explizit definiert ist und weder \fB_POSIX_SOURCE\fP, \fB_POSIX_C_SOURCE\fP, \fB_XOPEN_SOURCE\fP, \fB_GNU_SOURCE\fP noch \fB_SVID_SOURCE\fP definiert ist. Seit Glibc 2.19 stellt \fI\fP nur die System\-V\-Version von \fBsetjmp\fP() bereit. Programme, die die BSD\-Semantik benötigen, sollten Aufrufe von \fBsetjmp\fP() durch Aufrufe von \fBsigsetjmp\fP(), bei denen das Argument \fIspeicherSig\fP ungleich numerisch Null ist, ersetzen. .SH ANMERKUNGEN \fBsetjmp\fP() und \fBlongjmp\fP() können zum Umgang mit Fehlern innerhalb tiefverschachtelter Funktionsaufrufe nützlich sein oder um einem Signal\-Handler zu ermöglichen, die Steuerung an einen bestimmten Punkt in dem Programm zu übergeben, statt zu dem Punkt zurückzukehren, in dem der Handler das Hauptprogramm unterbrochen hat. In letzterem Falle verwenden Sie \fBsigsetjmp\fP() und \fBsiglongjmp\fP(), falls Sie die Signalmaske portabel speichern und wiederherstellen möchten. Lesen Sie auch die Diskussion zur Programmlesbarkeit weiter unten. .SH WARNUNGEN Der Compiler kann Variablen in Register optimieren und \fBlongjmp\fP() kann die Werte anderer Register zusätzlich zum Stack\- und Programmzeiger wiederherstellen. Daher ist der Wert von automatischen Variablen nach einem Aufruf von \fBlongjmp\fP() undefiniert, falls alle folgenden Kriterien zutreffen: .IP \[bu] 3 sie sind für die Funktion, die den entsprechenden Aufruf \fBsetjmp\fP() durchführte, lokal, .IP \[bu] ihre Werte sind zwischen Aufrufen von \fBsetjmp\fP() und \fBlongjmp\fP() geändert, und .IP \[bu] sie sind nicht als \fIvolatile\fP deklariert. .PP .\" Entsprechende Anmerkungen gelten für \fBsiglongjmp\fP(). .SS "Nicht lokale GOTOs und Programmlesbarkeit" Auch wenn er missbraucht werden kann, hat der traditionelle »goto«\-Ausdruck von C zumindest den Vorteil, dass lexikalische Hinweise (der Goto\-Ausdruck und die Zielmarkierung) dem Programmierer erlauben, leicht den Ablauf zu verstehen. Nichtlokale Gotos stellen keine solchen Hinweise bereit: Mehrere Aufrufe von \fBsetjmp\fP() können die gleiche Variable \fIjmp_buf\fP einsetzen, so dass der Inhalt der Variablen sich über die Lebensdauer des Programmes verändern kann. Konsequenterweise kann der Programmierer dazu gezwungen sein, den Code detailliert zu lesen, um das dynamische Ziel eines bestimmten Aufrufs von \fBlongjmp\fP() zu ermitteln. (Um das Leben der Programmierer zu erleichtern, sollte jeder Aufruf von \fBsetjmp\fP() eine eineindeutige Variable \fIjmp_buf\fP einsetzen.) .PP Weitere Schwierigkeiten kommen hinzu, da die Aufrufe von \fBsetjmp\fP() und \fBlongjmp\fP() nicht zwingend im gleichen Quellcodemodul sein müssen. .PP .\" Zusammenfassend erschweren nicht lokale GOTOs das Verständnis und die Verwaltung von Programmen. Falls möglich, sollte eine Alternative benutzt werden. .SS "Undefiniertes Verhalten" Falls die Funktion, die \fBsetjmp\fP() aufruft, zurückkehrt, bevor \fBlongjmp\fP() aufgerufen wird, ist das Verhalten undefiniert. Irgendwelches subtiles oder nicht so subtiles Chaos entsteht bestimmt dadurch. .PP .\" .\" The following statement appeared in versions up to POSIX.1-2008 TC1, .\" but is set to be removed in POSIX.1-2008 TC2: .\" .\" According to POSIX.1, if a .\" .BR longjmp () .\" call is performed from a nested signal handler .\" (i.e., from a handler that was invoked in response to a signal that was .\" generated while another signal was already in the process of being .\" handled), the behavior is undefined. Falls ein \fBlongjmp\fP()\-Aufruf in einem Programm mit mehreren Threads einen \fIUmg\fP\-Puffer einsetzt, der durch einen Aufruf von \fBsetjmp\fP() in einem anderen Thread initialisiert wurde, ist sein Verhalten nicht definiert. .PP .\" http://austingroupbugs.net/view.php?id=516#c1195 POSIX.1\-2008 Technische Berichtigung 2 fügt \fBlongjmp\fP() und \fBsiglongjmp\fP() zur Liste der asynchronsignalsicheren Funktionen hinzu. Der Standard empfiehlt jedoch den Gebrauch dieser Funktionen aus Signal\-Handlern zu vermeiden. Sie fährt damit fort, zu betonen, dass, falls diese Funktionen von einem Signal\-Handler aufgerufen werden, der einen Aufruf einer nicht asynchronsignalsicheren Funktion unterbrochen hatte (oder etwas gleichbedeutendem, wie den Schritten, die \fBexit\fP(3) entsprechen, die über eine Rückkehr vom initialen Aufruf zu \fImain\fP() auftreten), das Verhalten nicht definiert ist, falls das Programm nachfolgend einen Aufruf einer nicht asynchronsignalsicheren Funktion durchführt. Der einzige Weg, nicht definiertes Verhalten zu vermeiden, ist, eines des Nachfolgenden sicherzustellen: .IP \[bu] 3 Nach langen Sprüngen vom Signal\-Handler ruft das Programm keine asynchronsignalsicheren Funktionen auf und kehrt nicht vom initialen Aufruf von \fImain\fP() zurück. .IP \[bu] Jedes Signal, dessen Handler einen langen Sprung durchführt, muss während \fIjedes\fP Aufrufs einer nicht asynchronsignalsicheren Funktion blockiert werden und keine nicht asynchronsignalsicheren Funktionen werden nach der Rückkehr vom initialen Aufruf von \fImain\fP() aufgerufen. .SH "SIEHE AUCH" \fBsignal\fP(7), \fBsignal\-safety\fP(7) .PP .SH ÜBERSETZUNG Die deutsche Übersetzung dieser Handbuchseite wurde von Patrick Rother , Chris Leick , Dr. Tobias Quathamer , Helge Kreutzmann und Mario Blättermann erstellt. .PP Diese Übersetzung ist Freie Dokumentation; lesen Sie die .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 .UE oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen. .PP Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die .MT debian-l10n-german@lists.debian.org Mailingliste der Übersetzer .ME .