]> git.ipfire.org Git - thirdparty/man-pages.git/blame - man2/signalfd.2
sched_setattr.2: tfix
[thirdparty/man-pages.git] / man2 / signalfd.2
CommitLineData
5b0bafdd
MK
1.\" Copyright (C) 2008 Michael Kerrisk <mtk.manpages@gmail.com>
2.\" starting from a version by Davide Libenzi <davidel@xmailserver.org>
3.\"
f0008367 4.\" %%%LICENSE_START(GPLv2+_SW_3_PARA)
5b0bafdd
MK
5.\" This program is free software; you can redistribute it and/or modify
6.\" it under the terms of the GNU General Public License as published by
7.\" the Free Software Foundation; either version 2 of the License, or
8.\" (at your option) any later version.
9.\"
10.\" This program is distributed in the hope that it will be useful,
11.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
12.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13.\" GNU General Public License for more details.
14.\"
68fa4398
MK
15.\" You should have received a copy of the GNU General Public
16.\" License along with this manual; if not, see
17.\" <http://www.gnu.org/licenses/>.
8ff7380d 18.\" %%%LICENSE_END
5b0bafdd 19.\"
867c9b34 20.TH SIGNALFD 2 2019-10-10 Linux "Linux Programmer's Manual"
5b0bafdd
MK
21.SH NAME
22signalfd \- create a file descriptor for accepting signals
23.SH SYNOPSIS
24.B #include <sys/signalfd.h>
cc560d77 25.PP
5b0bafdd
MK
26.BI "int signalfd(int " fd ", const sigset_t *" mask ", int " flags );
27.SH DESCRIPTION
28.BR signalfd ()
29creates a file descriptor that can be used to accept signals
30targeted at the caller.
31This provides an alternative to the use of a signal handler or
32.BR sigwaitinfo (2),
33and has the advantage that the file descriptor may be monitored by
34.BR select (2),
35.BR poll (2),
36and
37.BR epoll (7).
cc560d77 38.PP
5b0bafdd
MK
39The
40.I mask
41argument specifies the set of signals that the caller
42wishes to accept via the file descriptor.
43This argument is a signal set whose contents can be initialized
44using the macros described in
45.BR sigsetops (3).
46Normally, the set of signals to be received via the
47file descriptor should be blocked using
48.BR sigprocmask (2),
49to prevent the signals being handled according to their default
50dispositions.
51It is not possible to receive
52.B SIGKILL
53or
54.B SIGSTOP
55signals via a signalfd file descriptor;
56these signals are silently ignored if specified in
57.IR mask .
cc560d77 58.PP
5b0bafdd
MK
59If the
60.I fd
61argument is \-1,
62then the call creates a new file descriptor and associates the
63signal set specified in
64.I mask
d9cb0d7d 65with that file descriptor.
5b0bafdd
MK
66If
67.I fd
68is not \-1,
69then it must specify a valid existing signalfd file descriptor, and
70.I mask
d9cb0d7d 71is used to replace the signal set associated with that file descriptor.
cc560d77 72.PP
89d9a56f
MK
73Starting with Linux 2.6.27, the following values may be bitwise ORed in
74.IR flags
a1fa36af 75to change the behavior of
89d9a56f
MK
76.BR signalfd ():
77.TP 14
78.B SFD_NONBLOCK
79Set the
80.BR O_NONBLOCK
7f11e32c
MK
81file status flag on the open file description (see
82.BR open (2))
83referred to by the new file descriptor.
89d9a56f
MK
84Using this flag saves extra calls to
85.BR fcntl (2)
86to achieve the same result.
87.TP
88.B SFD_CLOEXEC
89Set the close-on-exec
90.RB ( FD_CLOEXEC )
91flag on the new file descriptor.
c5571b61 92See the description of the
89d9a56f
MK
93.B O_CLOEXEC
94flag in
95.BR open (2)
96for reasons why this may be useful.
97.PP
98In Linux up to version 2.6.26, the
5b0bafdd 99.I flags
89d9a56f 100argument is unused, and must be specified as zero.
cc560d77 101.PP
5b0bafdd
MK
102.BR signalfd ()
103returns a file descriptor that supports the following operations:
104.TP
105.BR read (2)
106If one or more of the signals specified in
107.I mask
108is pending for the process, then the buffer supplied to
109.BR read (2)
110is used to return one or more
111.I signalfd_siginfo
112structures (see below) that describe the signals.
113The
114.BR read (2)
115returns information for as many signals as are pending and will
116fit in the supplied buffer.
117The buffer must be at least
118.I "sizeof(struct signalfd_siginfo)"
119bytes.
120The return value of the
121.BR read (2)
122is the total number of bytes read.
123.IP
124As a consequence of the
125.BR read (2),
126the signals are consumed,
127so that they are no longer pending for the process
128(i.e., will not be caught by signal handlers,
129and cannot be accepted using
130.BR sigwaitinfo (2)).
131.IP
132If none of the signals in
133.I mask
134is pending for the process, then the
135.BR read (2)
136either blocks until one of the signals in
137.I mask
138is generated for the process,
139or fails with the error
140.B EAGAIN
ff40dbb3 141if the file descriptor has been made nonblocking.
5b0bafdd
MK
142.TP
143.BR poll "(2), " select "(2) (and similar)"
144The file descriptor is readable
145(the
146.BR select (2)
147.I readfds
148argument; the
149.BR poll (2)
150.B POLLIN
151flag)
152if one or more of the signals in
153.I mask
154is pending for the process.
155.IP
156The signalfd file descriptor also supports the other file-descriptor
157multiplexing APIs:
158.BR pselect (2),
159.BR ppoll (2),
160and
161.BR epoll (7).
162.TP
163.BR close (2)
164When the file descriptor is no longer required it should be closed.
165When all file descriptors associated with the same signalfd object
166have been closed, the resources for object are freed by the kernel.
167.SS The signalfd_siginfo structure
168The format of the
169.I signalfd_siginfo
170structure(s) returned by
171.BR read (2)s
172from a signalfd file descriptor is as follows:
cc560d77 173.PP
5b0bafdd 174.in +4n
cc560d77 175.EX
f7e9afe8 176struct signalfd_siginfo {
17be9ac5
MK
177 uint32_t ssi_signo; /* Signal number */
178 int32_t ssi_errno; /* Error number (unused) */
179 int32_t ssi_code; /* Signal code */
180 uint32_t ssi_pid; /* PID of sender */
181 uint32_t ssi_uid; /* Real UID of sender */
182 int32_t ssi_fd; /* File descriptor (SIGIO) */
183 uint32_t ssi_tid; /* Kernel timer ID (POSIX timers)
184 uint32_t ssi_band; /* Band event (SIGIO) */
185 uint32_t ssi_overrun; /* POSIX timer overrun count */
186 uint32_t ssi_trapno; /* Trap number that caused signal */
d0fe4db7 187.\" ssi_trapno is unused on most arches
17be9ac5
MK
188 int32_t ssi_status; /* Exit status or signal (SIGCHLD) */
189 int32_t ssi_int; /* Integer sent by sigqueue(3) */
190 uint64_t ssi_ptr; /* Pointer sent by sigqueue(3) */
191 uint64_t ssi_utime; /* User CPU time consumed (SIGCHLD) */
192 uint64_t ssi_stime; /* System CPU time consumed
193 (SIGCHLD) */
194 uint64_t ssi_addr; /* Address that generated signal
195 (for hardware-generated signals) */
5fe5d581
MK
196 uint16_t ssi_addr_lsb; /* Least significant bit of address
197 (SIGBUS; since Linux 2.6.37)
198.\" ssi_addr_lsb: commit b8aeec34175fc8fe8b0d40efea4846dfc1ba663e
17be9ac5 199 uint8_t pad[\fIX\fP]; /* Pad size to 128 bytes (allow for
275714d8 200 additional fields in the future) */
5b0bafdd 201};
cc560d77 202.EE
5b0bafdd 203.in
c7885256 204.PP
5b0bafdd
MK
205Each of the fields in this structure
206is analogous to the similarly named field in the
207.I siginfo_t
208structure.
209The
210.I siginfo_t
211structure is described in
212.BR sigaction (2).
213Not all fields in the returned
214.I signalfd_siginfo
215structure will be valid for a specific signal;
216the set of valid fields can be determined from the value returned in the
217.I ssi_code
218field.
219This field is the analog of the
220.I siginfo_t
221.I si_code
222field; see
223.BR sigaction (2)
224for details.
225.SS fork(2) semantics
226After a
227.BR fork (2),
228the child inherits a copy of the signalfd file descriptor.
98895092
MK
229A
230.BR read (2)
231from the file descriptor in the child will return information
232about signals queued to the child.
3f816312
MK
233.SS Semantics of file descriptor passing
234As with other file descriptors,
235signalfd file descriptors can be passed to another process
236via a UNIX domain socket (see
237.BR unix (7)).
238In the receiving process, a
239.BR read (2)
240from the received file descriptor will return information
241about signals queued to that process.
5b0bafdd
MK
242.SS execve(2) semantics
243Just like any other file descriptor,
244a signalfd file descriptor remains open across an
245.BR execve (2),
246unless it has been marked for close-on-exec (see
247.BR fcntl (2)).
248Any signals that were available for reading before the
249.BR execve (2)
250remain available to the newly loaded program.
251(This is analogous to traditional signal semantics,
252where a blocked signal that is pending remains pending across an
253.BR execve (2).)
5b0bafdd
MK
254.SS Thread semantics
255The semantics of signalfd file descriptors in a multithreaded program
256mirror the standard semantics for signals.
257In other words,
258when a thread reads from a signalfd file descriptor,
259it will read the signals that are directed to the thread
260itself and the signals that are directed to the process
261(i.e., the entire thread group).
262(A thread will not be able to read signals that are directed
263to other threads in the process.)
b892d64f 264.\"
e95f6bf4 265.SS epoll(7) semantics
b892d64f
MK
266If a process adds (via
267.BR epoll_ctl (2))
268a signalfd file descriptor to an
269.BR epoll (7)
270instance, then
271.BR epoll_wait (2)
272returns events only for signals sent to that process.
273In particular, if the process then uses
274.BR fork ()
275to create a child process, then the child will be able to
276.BR read (2)
277signals that are sent to it using the signalfd file descriptor, but
278.BR epoll_wait (2)
279will
280.B not
281indicate that the signalfd file descriptor is ready.
282In this scenario, a possible workaround is that after the
283.BR fork (2),
284the child process can close the signalfd file descriptor that it inherited
285from the parent process and then create another signalfd file descriptor
286and add it to the epoll instance.
287Alternatively, the parent and the child could delay creating their
288(separate) signalfd file descriptors and adding them to the
289epoll instance until after the call to
290.BR fork (2).
47297adb 291.SH RETURN VALUE
5b0bafdd
MK
292On success,
293.BR signalfd ()
294returns a signalfd file descriptor;
295this is either a new file descriptor (if
296.I fd
297was \-1), or
298.I fd
299if
300.I fd
301was a valid signalfd file descriptor.
302On error, \-1 is returned and
303.I errno
304is set to indicate the error.
305.SH ERRORS
306.TP
307.B EBADF
308The
309.I fd
310file descriptor is not a valid file descriptor.
311.TP
312.B EINVAL
313.I fd
89d9a56f 314is not a valid signalfd file descriptor.
5b0bafdd
MK
315.\" or, the
316.\" .I sizemask
317.\" argument is not equal to
318.\" .IR sizeof(sigset_t) ;
319.TP
89d9a56f
MK
320.B EINVAL
321.I flags
322is invalid;
323or, in Linux 2.6.26 or earlier,
324.I flags
c7094399 325is nonzero.
89d9a56f 326.TP
5b0bafdd 327.B EMFILE
26c32fab 328The per-process limit on the number of open file descriptors has been reached.
5b0bafdd
MK
329.TP
330.B ENFILE
331The system-wide limit on the total number of open files has been
332reached.
333.TP
334.B ENODEV
335Could not mount (internal) anonymous inode device.
336.TP
337.B ENOMEM
338There was insufficient memory to create a new signalfd file descriptor.
339.SH VERSIONS
340.BR signalfd ()
341is available on Linux since kernel 2.6.22.
342Working support is provided in glibc since version 2.8.
343.\" signalfd() is in glibc 2.7, but reportedly does not build
89d9a56f
MK
344The
345.BR signalfd4 ()
346system call (see NOTES) is available on Linux since kernel 2.6.27.
5b0bafdd
MK
347.SH CONFORMING TO
348.BR signalfd ()
1fadf79b
MK
349and
350.BR signalfd4 ()
351are Linux-specific.
5b0bafdd 352.SH NOTES
5b0bafdd
MK
353A process can create multiple signalfd file descriptors.
354This makes it possible to accept different signals
355on different file descriptors.
356(This may be useful if monitoring the file descriptors using
357.BR select (2),
358.BR poll (2),
359or
360.BR epoll (7):
d9cb0d7d 361the arrival of different signals will make different file descriptors ready.)
5b0bafdd
MK
362If a signal appears in the
363.I mask
364of more than one of the file descriptors, then occurrences
d9cb0d7d 365of that signal can be read (once) from any one of the file descriptors.
cc560d77 366.PP
07a5f3db
MK
367Attempts to include
368.B SIGKILL
369and
370.B SIGSTOP
371in
372.I mask
373are silently ignored.
cc560d77 374.PP
13dd2598
MK
375The signal mask employed by a signalfd file descriptor can be viewed
376via the entry for the corresponding file descriptor in the process's
377.IR /proc/[pid]/fdinfo
378directory.
379See
380.BR proc (5)
381for further details.
4a96f7b5
MK
382.\"
383.SS Limitations
b435e1e1
MK
384The signalfd mechanism can't be used to receive signals that
385are synchronously generated, such as the
386.BR SIGSEGV
387signal that results from accessing an invalid memory address
388or the
389.BR SIGFPE
390signal that results from an arithmetic error.
391Such signals can be caught only via signal handler.
cc560d77 392.PP
76e55b8a
MK
393As described above,
394in normal usage one blocks the signals that will be accepted via
395.BR signalfd ().
396If spawning a child process to execute a helper program
397(that does not need the signalfd file descriptor),
398then, after the call to
399.BR fork (2),
400you will normally want to unblock those signals before calling
401.BR execve (2),
402so that the helper program can see any signals that it expects to see.
403Be aware, however,
404that this won't be possible in the case of a helper program spawned
405behind the scenes by any library function that the program may call.
406In such cases, one must fall back to using a traditional signal
407handler that writes to a file descriptor monitored by
408.BR select (2),
409.BR poll (2),
410or
362310a7 411.BR epoll (7).
13dd2598 412.\"
0722a578 413.SS C library/kernel differences
68f611bd
MK
414The underlying Linux system call requires an additional argument,
415.IR "size_t sizemask" ,
416which specifies the size of the
417.I mask
418argument.
419The glibc
420.BR signalfd ()
421wrapper function does not include this argument,
422since it provides the required value for the underlying system call.
cc560d77 423.PP
89d9a56f
MK
424There are two underlying Linux system calls:
425.BR signalfd ()
426and the more recent
427.BR signalfd4 ().
428The former system call does not implement a
429.I flags
430argument.
431The latter system call implements the
432.I flags
433values described above.
434Starting with glibc 2.9, the
435.BR signalfd ()
436wrapper function will use
437.BR signalfd4 ()
438where it is available.
dbe108ed 439.SH BUGS
25c8faf5 440In kernels before 2.6.25, the
dbe108ed
MK
441.I ssi_ptr
442and
443.I ssi_int
444fields are not filled in with the data accompanying a signal sent by
485ab701 445.BR sigqueue (3).
cd56f36f 446.\" The fix also was put into 2.6.24.5
5b0bafdd
MK
447.SH EXAMPLE
448The program below accepts the signals
449.B SIGINT
450and
451.B SIGQUIT
452via a signalfd file descriptor.
453The program terminates after accepting a
454.B SIGQUIT
455signal.
456The following shell session demonstrates the use of the program:
cc560d77 457.PP
5b0bafdd 458.in +4n
cc560d77 459.EX
b43a3b30
MK
460.RB "$" " ./signalfd_demo"
461.BR "^C" " # Control\-C generates SIGINT"
5b0bafdd 462Got SIGINT
b43a3b30 463.B ^C
5b0bafdd 464Got SIGINT
d1a71985 465\fB^\e\fP # Control\-\e generates SIGQUIT
5b0bafdd
MK
466Got SIGQUIT
467$
cc560d77 468.EE
1c32ee47 469.in
9c330504 470.SS Program source
d84d0300 471\&
cc560d77 472.EX
5b0bafdd
MK
473#include <sys/signalfd.h>
474#include <signal.h>
475#include <unistd.h>
476#include <stdlib.h>
477#include <stdio.h>
478
d1a71985 479#define handle_error(msg) \e
5b0bafdd
MK
480 do { perror(msg); exit(EXIT_FAILURE); } while (0)
481
482int
483main(int argc, char *argv[])
484{
485 sigset_t mask;
486 int sfd;
487 struct signalfd_siginfo fdsi;
488 ssize_t s;
489
490 sigemptyset(&mask);
491 sigaddset(&mask, SIGINT);
492 sigaddset(&mask, SIGQUIT);
493
f81fb444 494 /* Block signals so that they aren\(aqt handled
5b0bafdd
MK
495 according to their default dispositions */
496
497 if (sigprocmask(SIG_BLOCK, &mask, NULL) == \-1)
498 handle_error("sigprocmask");
499
500 sfd = signalfd(\-1, &mask, 0);
501 if (sfd == \-1)
502 handle_error("signalfd");
503
504 for (;;) {
505 s = read(sfd, &fdsi, sizeof(struct signalfd_siginfo));
506 if (s != sizeof(struct signalfd_siginfo))
507 handle_error("read");
508
d372f252 509 if (fdsi.ssi_signo == SIGINT) {
d1a71985 510 printf("Got SIGINT\en");
d372f252 511 } else if (fdsi.ssi_signo == SIGQUIT) {
d1a71985 512 printf("Got SIGQUIT\en");
5b0bafdd
MK
513 exit(EXIT_SUCCESS);
514 } else {
d1a71985 515 printf("Read unexpected signal\en");
5b0bafdd
MK
516 }
517 }
518}
cc560d77 519.EE
47297adb 520.SH SEE ALSO
5b0bafdd
MK
521.BR eventfd (2),
522.BR poll (2),
523.BR read (2),
524.BR select (2),
525.BR sigaction (2),
526.BR sigprocmask (2),
527.BR sigwaitinfo (2),
528.BR timerfd_create (2),
529.BR sigsetops (3),
7c85aa6b 530.BR sigwait (3),
5b0bafdd
MK
531.BR epoll (7),
532.BR signal (7)