]> git.ipfire.org Git - thirdparty/man-pages.git/blame - man2/sigreturn.2
sched_setattr.2: tfix
[thirdparty/man-pages.git] / man2 / sigreturn.2
CommitLineData
eda078d4 1.\" Copyright (C) 2008, 2014, Michael Kerrisk <mtk.manpages@gmail.com>
fea681da 2.\"
93015253 3.\" %%%LICENSE_START(VERBATIM)
fea681da
MK
4.\" Permission is granted to make and distribute verbatim copies of this
5.\" manual provided the copyright notice and this permission notice are
6.\" preserved on all copies.
7.\"
8.\" Permission is granted to copy and distribute modified versions of this
9.\" manual under the conditions for verbatim copying, provided that the
10.\" entire resulting derived work is distributed under the terms of a
11.\" permission notice identical to this one.
c13182ef 12.\"
fea681da
MK
13.\" Since the Linux kernel and libraries are constantly changing, this
14.\" manual page may be incorrect or out-of-date. The author(s) assume no
15.\" responsibility for errors or omissions, or for damages resulting from
16.\" the use of the information contained herein. The author(s) may not
17.\" have taken the same level of care in the production of this manual,
18.\" which is licensed free of charge, as they might when working
19.\" professionally.
c13182ef 20.\"
fea681da
MK
21.\" Formatted or processed versions of this manual, if unaccompanied by
22.\" the source, must acknowledge the copyright and authors of this work.
4b72fb64 23.\" %%%LICENSE_END
fea681da
MK
24.\"
25.\" Created Sat Aug 21 1995 Thomas K. Dyas <tdyas@eden.rutgers.edu>
26.\" Modified Tue Oct 22 22:09:03 1996 by Eric S. Raymond <esr@thyrsus.com>
0678a1d4 27.\" 2008-06-26, mtk, added some more detail on the work done by sigreturn()
eda078d4 28.\" 2014-12-05, mtk, rewrote all of the rest of the original page
fea681da 29.\"
4b8c67d9 30.TH SIGRETURN 2 2017-09-15 "Linux" "Linux Programmer's Manual"
fea681da 31.SH NAME
d893db64 32sigreturn, rt_sigreturn \- return from signal handler and cleanup stack frame
fea681da 33.SH SYNOPSIS
eda078d4 34.BI "int sigreturn(...);"
fea681da 35.SH DESCRIPTION
eda078d4
MK
36If the Linux kernel determines that an unblocked
37signal is pending for a process, then,
38at the next transition back to user mode in that process
39(e.g., upon return from a system call or
40when the process is rescheduled onto the CPU),
dea3ec0c
MK
41it creates a new frame on the user-space stack where it
42saves various pieces of process context
43(processor status word, registers, signal mask, and signal stack settings).
eda078d4 44.\" See arch/x86/kernel/signal.c::__setup_frame() [in 3.17 source code]
efeece04 45.PP
eda078d4
MK
46The kernel also arranges that, during the transition back to user mode,
47the signal handler is called, and that, upon return from the handler,
48control passes to a piece of user-space code commonly called
49the "signal trampoline".
50The signal trampoline code in turn calls
51.BR sigreturn ().
efeece04 52.PP
00ac6ce4 53This
e511ffb6 54.BR sigreturn ()
0678a1d4 55call undoes everything that was
eda078d4 56done\(emchanging the process's signal mask, switching signal stacks (see
0678a1d4 57.BR sigaltstack "(2))\(emin "
eda078d4 58order to invoke the signal handler.
dea3ec0c
MK
59Using the information that was earlier saved on the user-space stack
60.BR sigreturn ()
61restores the process's signal mask, switches stacks,
eda078d4
MK
62and restores the process's context
63(processor flags and registers,
64including the stack pointer and instruction pointer),
65so that the process resumes execution
0678a1d4 66at the point where it was interrupted by the signal.
47297adb 67.SH RETURN VALUE
e511ffb6 68.BR sigreturn ()
fea681da 69never returns.
47297adb 70.SH CONFORMING TO
eda078d4 71Many UNIX-type systems have a
2dd578fd 72.BR sigreturn ()
eda078d4
MK
73system call or near equivalent.
74However, this call is not specified in POSIX,
75and details of its behavior vary across systems.
6c36ac81 76.SH NOTES
e511ffb6 77.BR sigreturn ()
eda078d4 78exists only to allow the implementation of signal handlers.
c13182ef 79It should
fea681da 80.B never
c13182ef 81be called directly.
d03e0ad3
MK
82(Indeed, a simple
83.BR sigreturn ()
84.\" See sysdeps/unix/sysv/linux/sigreturn.c and
85.\" signal/sigreturn.c in the glibc source
86wrapper in the GNU C library simply returns -1, with
87.I errno
88set to
89.BR ENOSYS .)
eda078d4
MK
90Details of the arguments (if any) passed to
91.BR sigreturn ()
92vary depending on the architecture.
dea3ec0c
MK
93(On some architectures, such as x86-64,
94.BR sigreturn ()
95takes no arguments, since all of the information that it requires
96is available in the stack frame that was previously created by the
97kernel on the user-space stack.)
efeece04 98.PP
eda078d4
MK
99Once upon a time, UNIX systems placed the signal trampoline code
100onto the user stack.
101Nowadays, pages of the user stack are protected so as to
102disallow code execution.
103Thus, on contemporary Linux systems, depending on the architecture,
104the signal trampoline code lives either in the
105.BR vdso (7)
106or in the C library.
107In the latter case,
108.\" See, for example, sysdeps/unix/sysv/linux/i386/sigaction.c and
109.\" sysdeps/unix/sysv/linux/x86_64/sigaction.c in the glibc (2.20) source.
89559e3c
MK
110the C library's
111.BR sigaction (2)
112wrapper function informs the kernel of the location of the trampoline code
113by placing its address in the
eda078d4
MK
114.I sa_restorer
115field of the
116.I sigaction
89559e3c 117structure,
eda078d4
MK
118and sets the
119.BR SA_RESTORER
120flag in the
121.IR sa_flags
122field.
efeece04 123.PP
eda078d4
MK
124The saved process context information is placed in a
125.I ucontext_t
126structure (see
127.IR <sys/ucontext.h> ).
128That structure is visible within the signal handler
cc158fa3
MK
129as the third argument of a handler established via
130.BR sigaction (2)
131with the
eda078d4
MK
132.BR SA_SIGINFO
133flag.
efeece04 134.PP
eda078d4
MK
135On some other UNIX systems,
136the operation of the signal trampoline differs a little.
137In particular, on some systems, upon transitioning back to user mode,
138the kernel passes control to the trampoline (rather than the signal handler),
139and the trampoline code calls the signal handler (and then calls
140.BR sigreturn ()
141once the handler returns).
d893db64 142.\"
0722a578 143.SS C library/kernel differences
d893db64
MK
144The original Linux system call was named
145.BR sigreturn ().
146However, with the addition of real-time signals in Linux 2.2,
147a new system call,
148.BR rt_sigreturn ()
149was added to support an enlarged
150.IR sigset_t
151type.
152The GNU C library
153hides these details from us, transparently employing
154.BR rt_sigreturn ()
155when the kernel provides it.
156.\"
47297adb 157.SH SEE ALSO
fea681da 158.BR kill (2),
d806bc05 159.BR restart_syscall (2),
e91751c9 160.BR sigaltstack (2),
fea681da 161.BR signal (2),
eda078d4 162.BR getcontext (3),
cc158601
MK
163.BR signal (7),
164.BR vdso (7)