sigreturn(2) Rückkehr vom Signal Handler und Aufräumen des

Other Alias

rt_sigreturn

ÜBERSICHT

int sigreturn(…);

BESCHREIBUNG

If the Linux kernel determines that an unblocked signal is pending for a process, then, at the next transition back to user mode in that process (e.g., upon return from a system call or when the process is rescheduled onto the CPU), it saves various pieces of process context (processor status word, registers, signal mask, and signal stack settings) into the user-space stack.

The kernel also arranges that, during the transition back to user mode, the signal handler is called, and that, upon return from the handler, control passes to a piece of user-space code commonly called the "signal trampoline". The signal trampoline code in turn calls sigreturn().

Dieser Aufruf von sigreturn() macht alle Aktionen für den Aufruf des Signal Handlers - die Änderung der Signalmaske des Prozesses, Umschalten der Signal-Stacks (siehe sigaltstack(2)) - rückgängig. Er stellt die Signalmaske des Prozesses wieder her, schaltet die Stacks um und stellt den Prozesskontext (Prozessor-Flags und -Register, darunter den Stack-Zeiger und den Instruktions-Zeiger) wieder her, so dass die Ausführung des Prozesses an dem Punkt fortgesetzt wird, wo er von dem Signal unterbrochen wurde.

RÜCKGABEWERT

sigreturn() kehrt nie zurück.

KONFORM ZU

Viele UNIX-artige Systeme haben einen Systemaufruf sigreturn() oder etwas nah verwandtes. Allerdings wird dieser Aufruf nicht in POSIX spezifiziert und die Details seines Verhaltens unterscheiden sich von System zu System.

ANMERKUNGEN

sigreturn() existiert nur, um Signal Handler für den Kernel zu implementieren. Es sollte niemals direkt aufgerufen werden. Details der an sigreturn() übergebenen Argumente (falls vorhanden) variieren abhängig von der Architektur.

Once upon a time, UNIX systems placed the signal trampoline code onto the user stack. Nowadays, pages of the user stack are protected so as to disallow code execution. Thus, on contemporary Linux systems, depending on the architecture, the signal trampoline code lives either in the vdso(7) or in the C library. In the latter case, the C library supplies the location of the trampoline code using the sa_restorer field of the sigaction structure that is passed to sigaction(2), and sets the SA_RESTORER flag in the sa_flags field.

The saved process context information is placed in a ucontext_t structure (see <sys/ucontext.h>). That structure is visible within the signal handler as the third argument of a handler established with the SA_SIGINFO flag.

On some other UNIX systems, the operation of the signal trampoline differs a little. In particular, on some systems, upon transitioning back to user mode, the kernel passes control to the trampoline (rather than the signal handler), and the trampoline code calls the signal handler (and then calls sigreturn() once the handler returns).

Unterschiede C-Bibliothek/Kernel

Der ursprüngliche Systemaufruf hieß sigreturn(). Mit der Hinzunahme von Echtzeitsignalen in Linux 2.2 wurde allerdings ein neuer Systemaufruf rt_sigreturn() zur Unterstützung eines vergrößerten Typs sigset_t hinzugefügt. Die GNU-C-Bibliothek versteckt diese Details und setzt rt_sigreturn() transparent ein, wenn der Kernel dies bereitstellt.

KOLOPHON

Diese Seite ist Teil der Veröffentlichung 4.06 des Projekts Linux-man-pages. Eine Beschreibung des Projekts, Informationen, wie Fehler gemeldet werden können sowie die aktuelle Version dieser Seite finden sich unter https://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG

Die deutsche Übersetzung dieser Handbuchseite wurde von René Tschirley <[email protected]>, Martin Schulze <[email protected]>, Martin Eberhard Schauer <[email protected]>, Mario Blättermann <[email protected]> und Helge Kreutzmann <[email protected]> erstellt.

Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.

Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an <[email protected]>.