]> git.ipfire.org Git - thirdparty/man-pages.git/blob - man2/epoll_ctl.2
epoll_ctl.2: BUGS: EPOLLWAKEUP is silently ignored without CAP_BLOCK_SUSPEND
[thirdparty/man-pages.git] / man2 / epoll_ctl.2
1 .\" Copyright (C) 2003 Davide Libenzi
2 .\" Davide Libenzi <davidel@xmailserver.org>
3 .\"
4 .\" %%%LICENSE_START(GPLv2+_SW_3_PARA)
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 .\"
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/>.
18 .\" %%%LICENSE_END
19 .\"
20 .TH EPOLL_CTL 2 2012-04-15 "Linux" "Linux Programmer's Manual"
21 .SH NAME
22 epoll_ctl \- control interface for an epoll descriptor
23 .SH SYNOPSIS
24 .B #include <sys/epoll.h>
25 .sp
26 .BI "int epoll_ctl(int " epfd ", int " op ", int " fd \
27 ", struct epoll_event *" event );
28 .SH DESCRIPTION
29 This system call performs control operations on the
30 .BR epoll (7)
31 instance
32 referred to by the file descriptor
33 .IR epfd .
34 It requests that the operation
35 .I op
36 be performed for the target file descriptor,
37 .IR fd .
38
39 Valid values for the
40 .I op
41 argument are :
42 .TP
43 .B EPOLL_CTL_ADD
44 Register the target file descriptor
45 .I fd
46 on the
47 .B epoll
48 instance referred to by the file descriptor
49 .I epfd
50 and associate the event
51 .I event
52 with the internal file linked to
53 .IR fd .
54 .TP
55 .B EPOLL_CTL_MOD
56 Change the event
57 .I event
58 associated with the target file descriptor
59 .IR fd .
60 .TP
61 .B EPOLL_CTL_DEL
62 Remove (deregister) the target file descriptor
63 .I fd
64 from the
65 .B epoll
66 instance referred to by
67 .IR epfd .
68 The
69 .I event
70 is ignored and can be NULL (but see BUGS below).
71 .PP
72 The
73 .I event
74 argument describes the object linked to the file descriptor
75 .IR fd .
76 The
77 .I struct epoll_event
78 is defined as :
79 .sp
80 .in +4n
81 .nf
82 typedef union epoll_data {
83 void *ptr;
84 int fd;
85 uint32_t u32;
86 uint64_t u64;
87 } epoll_data_t;
88
89 struct epoll_event {
90 uint32_t events; /* Epoll events */
91 epoll_data_t data; /* User data variable */
92 };
93 .fi
94 .in
95
96 The
97 .I events
98 member is a bit set composed using the following available event
99 types:
100 .TP
101 .B EPOLLIN
102 The associated file is available for
103 .BR read (2)
104 operations.
105 .TP
106 .B EPOLLOUT
107 The associated file is available for
108 .BR write (2)
109 operations.
110 .TP
111 .BR EPOLLRDHUP " (since Linux 2.6.17)"
112 Stream socket peer closed connection,
113 or shut down writing half of connection.
114 (This flag is especially useful for writing simple code to detect
115 peer shutdown when using Edge Triggered monitoring.)
116 .TP
117 .B EPOLLPRI
118 There is urgent data available for
119 .BR read (2)
120 operations.
121 .TP
122 .B EPOLLERR
123 Error condition happened on the associated file descriptor.
124 .BR epoll_wait (2)
125 will always wait for this event; it is not necessary to set it in
126 .IR events .
127 .TP
128 .B EPOLLHUP
129 Hang up happened on the associated file descriptor.
130 .BR epoll_wait (2)
131 will always wait for this event; it is not necessary to set it in
132 .IR events .
133 .TP
134 .B EPOLLET
135 Sets the Edge Triggered behavior for the associated file descriptor.
136 The default behavior for
137 .B epoll
138 is Level Triggered.
139 See
140 .BR epoll (7)
141 for more detailed information about Edge and Level Triggered event
142 distribution architectures.
143 .TP
144 .BR EPOLLONESHOT " (since Linux 2.6.2)"
145 Sets the one-shot behavior for the associated file descriptor.
146 This means that after an event is pulled out with
147 .BR epoll_wait (2)
148 the associated file descriptor is internally disabled and no other events
149 will be reported by the
150 .B epoll
151 interface.
152 The user must call
153 .BR epoll_ctl ()
154 with
155 .B EPOLL_CTL_MOD
156 to rearm the file descriptor with a new event mask.
157 .TP
158 .BR EPOLLWAKEUP " (since Linux 3.5)"
159 .\" commit 4d7e30d98939a0340022ccd49325a3d70f7e0238
160 If
161 .B EPOLLONESHOT
162 and
163 .B EPOLLET
164 are clear and the process has the
165 .B CAP_BLOCK_SUSPEND
166 capability,
167 ensure that the system does not enter "suspend" or
168 "hibernate" while this event is pending or being processed.
169 The event is considered as being "processed" from the time
170 when it is returned by a call to
171 .BR epoll_wait (2)
172 until the next call to
173 .BR epoll_wait (2)
174 on the same
175 .BR epoll (7)
176 file descriptor.
177 See also BUGS.
178 .SH RETURN VALUE
179 When successful,
180 .BR epoll_ctl ()
181 returns zero.
182 When an error occurs,
183 .BR epoll_ctl ()
184 returns \-1 and
185 .I errno
186 is set appropriately.
187 .SH ERRORS
188 .TP
189 .B EBADF
190 .I epfd
191 or
192 .I fd
193 is not a valid file descriptor.
194 .TP
195 .B EEXIST
196 .I op
197 was
198 .BR EPOLL_CTL_ADD ,
199 and the supplied file descriptor
200 .I fd
201 is already registered with this epoll instance.
202 .TP
203 .B EINVAL
204 .I epfd
205 is not an
206 .B epoll
207 file descriptor,
208 or
209 .I fd
210 is the same as
211 .IR epfd ,
212 or the requested operation
213 .I op
214 is not supported by this interface.
215 .TP
216 .B ENOENT
217 .I op
218 was
219 .B EPOLL_CTL_MOD
220 or
221 .BR EPOLL_CTL_DEL ,
222 and
223 .I fd
224 is not registered with this epoll instance.
225 .TP
226 .B ENOMEM
227 There was insufficient memory to handle the requested
228 .I op
229 control operation.
230 .TP
231 .B ENOSPC
232 The limit imposed by
233 .I /proc/sys/fs/epoll/max_user_watches
234 was encountered while trying to register
235 .RB ( EPOLL_CTL_ADD )
236 a new file descriptor on an epoll instance.
237 See
238 .BR epoll (7)
239 for further details.
240 .TP
241 .B EPERM
242 The target file
243 .I fd
244 does not support
245 .BR epoll .
246 .SH VERSIONS
247 .BR epoll_ctl ()
248 was added to the kernel in version 2.6.
249 .\" To be precise: kernel 2.5.44.
250 .\" The interface should be finalized by Linux kernel 2.5.66.
251 .SH CONFORMING TO
252 .BR epoll_ctl ()
253 is Linux-specific.
254 Library support is provided in glibc starting with version 2.3.2.
255 .SH NOTES
256 The
257 .B epoll
258 interface supports all file descriptors that support
259 .BR poll (2).
260 .SH BUGS
261 In kernel versions before 2.6.9, the
262 .B EPOLL_CTL_DEL
263 operation required a non-null pointer in
264 .IR event ,
265 even though this argument is ignored.
266 Since Linux 2.6.9,
267 .I event
268 can be specified as NULL
269 when using
270 .BR EPOLL_CTL_DEL .
271 Applications that need to be portable to kernels before 2.6.9
272 should specify a non-null pointer in
273 .IR event .
274
275 If
276 .B EPOLLWAKEUP
277 is specified in
278 .IR flags ,
279 but the caller does not have the
280 .BR CAP_BLOCK_SUSPEND
281 capability, then the
282 .B EPOLLWAKEUP
283 flag is
284 .IR "silently ignored" .
285 This unfortunate behavior is necessary because no validity
286 checks were performed on the
287 .IR flags
288 argument in the original implementation, and the addition of the
289 .B EPOLLWAKEUP
290 with a check that caused the call to fail if the caller did not have the
291 .B CAP_BLOCK_SUSPEND
292 capability caused a breakage in at least one existing user-space
293 application that happened to randomly (and uselessly) specify this bit.
294 .\" commit a8159414d7e3af7233e7a5a82d1c5d85379bd75c (behavior change)
295 .\" https://lwn.net/Articles/520198/
296 A robust application should therefore double check that it has the
297 .B CAP_BLOCK_SUSPEND
298 capability if attempting to use the
299 .B EPOLLWAKEUP
300 flag.
301 .SH SEE ALSO
302 .BR epoll_create (2),
303 .BR epoll_wait (2),
304 .BR poll (2),
305 .BR epoll (7)