]> git.ipfire.org Git - thirdparty/systemd.git/blob - man/sd_event_add_io.xml
udev-spawn: slightly adjust logs about timed out commands
[thirdparty/systemd.git] / man / sd_event_add_io.xml
1 <?xml version='1.0'?>
2 <!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
3 "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
4 <!-- SPDX-License-Identifier: LGPL-2.1-or-later -->
5
6 <refentry id="sd_event_add_io" xmlns:xi="http://www.w3.org/2001/XInclude">
7
8 <refentryinfo>
9 <title>sd_event_add_io</title>
10 <productname>systemd</productname>
11 </refentryinfo>
12
13 <refmeta>
14 <refentrytitle>sd_event_add_io</refentrytitle>
15 <manvolnum>3</manvolnum>
16 </refmeta>
17
18 <refnamediv>
19 <refname>sd_event_add_io</refname>
20 <refname>sd_event_source_get_io_events</refname>
21 <refname>sd_event_source_set_io_events</refname>
22 <refname>sd_event_source_get_io_revents</refname>
23 <refname>sd_event_source_get_io_fd</refname>
24 <refname>sd_event_source_set_io_fd</refname>
25 <refname>sd_event_source_get_io_fd_own</refname>
26 <refname>sd_event_source_set_io_fd_own</refname>
27 <refname>sd_event_source</refname>
28 <refname>sd_event_io_handler_t</refname>
29
30 <refpurpose>Add an I/O event source to an event loop</refpurpose>
31 </refnamediv>
32
33 <refsynopsisdiv>
34 <funcsynopsis>
35 <funcsynopsisinfo>#include &lt;systemd/sd-event.h&gt;</funcsynopsisinfo>
36
37 <funcsynopsisinfo><token>typedef</token> struct sd_event_source sd_event_source;</funcsynopsisinfo>
38
39 <funcprototype>
40 <funcdef>typedef int (*<function>sd_event_io_handler_t</function>)</funcdef>
41 <paramdef>sd_event_source *<parameter>s</parameter></paramdef>
42 <paramdef>int <parameter>fd</parameter></paramdef>
43 <paramdef>uint32_t <parameter>revents</parameter></paramdef>
44 <paramdef>void *<parameter>userdata</parameter></paramdef>
45 </funcprototype>
46
47 <funcprototype>
48 <funcdef>int <function>sd_event_add_io</function></funcdef>
49 <paramdef>sd_event *<parameter>event</parameter></paramdef>
50 <paramdef>sd_event_source **<parameter>source</parameter></paramdef>
51 <paramdef>int <parameter>fd</parameter></paramdef>
52 <paramdef>uint32_t <parameter>events</parameter></paramdef>
53 <paramdef>sd_event_io_handler_t <parameter>handler</parameter></paramdef>
54 <paramdef>void *<parameter>userdata</parameter></paramdef>
55 </funcprototype>
56
57 <funcprototype>
58 <funcdef>int <function>sd_event_source_get_io_events</function></funcdef>
59 <paramdef>sd_event_source *<parameter>source</parameter></paramdef>
60 <paramdef>uint32_t *<parameter>events</parameter></paramdef>
61 </funcprototype>
62
63 <funcprototype>
64 <funcdef>int <function>sd_event_source_set_io_events</function></funcdef>
65 <paramdef>sd_event_source *<parameter>source</parameter></paramdef>
66 <paramdef>uint32_t <parameter>events</parameter></paramdef>
67 </funcprototype>
68
69 <funcprototype>
70 <funcdef>int <function>sd_event_source_get_io_revents</function></funcdef>
71 <paramdef>sd_event_source *<parameter>source</parameter></paramdef>
72 <paramdef>uint32_t *<parameter>revents</parameter></paramdef>
73 </funcprototype>
74
75 <funcprototype>
76 <funcdef>int <function>sd_event_source_get_io_fd</function></funcdef>
77 <paramdef>sd_event_source *<parameter>source</parameter></paramdef>
78 </funcprototype>
79
80 <funcprototype>
81 <funcdef>int <function>sd_event_source_set_io_fd</function></funcdef>
82 <paramdef>sd_event_source *<parameter>source</parameter></paramdef>
83 <paramdef>int <parameter>fd</parameter></paramdef>
84 </funcprototype>
85
86 <funcprototype>
87 <funcdef>int <function>sd_event_source_get_io_fd_own</function></funcdef>
88 <paramdef>sd_event_source *<parameter>source</parameter></paramdef>
89 </funcprototype>
90
91 <funcprototype>
92 <funcdef>int <function>sd_event_source_set_io_fd_own</function></funcdef>
93 <paramdef>sd_event_source *<parameter>source</parameter></paramdef>
94 <paramdef>int <parameter>b</parameter></paramdef>
95 </funcprototype>
96
97 </funcsynopsis>
98 </refsynopsisdiv>
99
100 <refsect1>
101 <title>Description</title>
102
103 <para><function>sd_event_add_io()</function> adds a new I/O event source to an event loop. The event loop
104 object is specified in the <parameter>event</parameter> parameter, the event source object is returned in
105 the <parameter>source</parameter> parameter. The <parameter>fd</parameter> parameter takes the UNIX file
106 descriptor to watch, which may refer to a socket, a FIFO, a message queue, a serial connection, a
107 character device, or any other file descriptor compatible with Linux <citerefentry
108 project='man-pages'><refentrytitle>epoll</refentrytitle><manvolnum>7</manvolnum></citerefentry>. The
109 <parameter>events</parameter> parameter takes a bit mask of events to watch for, a combination of the
110 following event flags: <constant>EPOLLIN</constant>, <constant>EPOLLOUT</constant>,
111 <constant>EPOLLRDHUP</constant>, <constant>EPOLLPRI</constant>, and <constant>EPOLLET</constant>, see
112 <citerefentry
113 project='man-pages'><refentrytitle>epoll_ctl</refentrytitle><manvolnum>2</manvolnum></citerefentry> for
114 details. Note that not all file descriptors are compatible with epoll, for example regular file or
115 directories are not. If this function is called with a file descriptor that does not support epoll,
116 <constant>-EPERM</constant> is returned (also see below). In most cases such file descriptors may be
117 treated as always-readable or always-writable, so that IO event watching is unnecessary.</para>
118
119 <para>The <parameter>handler</parameter> is a function to call when the event source is triggered or
120 <constant>NULL</constant>. The <parameter>userdata</parameter> pointer will be passed to the handler
121 function, and may be chosen freely by the caller. The handler will also be passed the file descriptor the
122 event was seen on, as well as the actual event flags. It's generally a subset of the events watched,
123 however may additionally include <constant>EPOLLERR</constant> and <constant>EPOLLHUP</constant>. The
124 handler may return negative to signal an error (see below), other return values are ignored. If
125 <parameter>handler</parameter> is <constant>NULL</constant>, a default handler that calls
126 <citerefentry><refentrytitle>sd_event_exit</refentrytitle><manvolnum>3</manvolnum></citerefentry> will be
127 used.</para>
128
129 <para>By default, an event source will stay enabled continuously (<constant>SD_EVENT_ON</constant>), but
130 this may be changed with
131 <citerefentry><refentrytitle>sd_event_source_set_enabled</refentrytitle><manvolnum>3</manvolnum></citerefentry>.
132 If the handler function returns a negative error code, it will either be disabled after the invocation,
133 even if the <constant>SD_EVENT_ON</constant> mode was requested before, or it will cause the loop to
134 terminate, see
135 <citerefentry><refentrytitle>sd_event_source_set_exit_on_failure</refentrytitle><manvolnum>3</manvolnum></citerefentry>.
136 Note that an event source set to <constant>SD_EVENT_ON</constant> will fire continuously unless data is
137 read from or written to the file descriptor to reset the mask of events seen.</para>
138
139 <para>Setting the I/O event mask to watch for to 0 does not mean
140 that the event source won't be triggered anymore, as
141 <constant>EPOLLHUP</constant> and <constant>EPOLLERR</constant>
142 may be triggered even with a zero event mask. To temporarily
143 disable an I/O event source use
144 <citerefentry><refentrytitle>sd_event_source_set_enabled</refentrytitle><manvolnum>3</manvolnum></citerefentry>
145 with <constant>SD_EVENT_OFF</constant> instead.</para>
146
147 <para>To destroy an event source object use
148 <citerefentry><refentrytitle>sd_event_source_unref</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
149 but note that the event source is only removed from the event loop
150 when all references to the event source are dropped. To make sure
151 an event source does not fire anymore, even if it is still referenced,
152 disable the event source using
153 <citerefentry><refentrytitle>sd_event_source_set_enabled</refentrytitle><manvolnum>3</manvolnum></citerefentry>
154 with <constant>SD_EVENT_OFF</constant>.</para>
155
156 <para>If the second parameter of
157 <function>sd_event_add_io()</function> is
158 <constant>NULL</constant> no reference to the event source object
159 is returned. In this case the event source is considered
160 "floating", and will be destroyed implicitly when the event loop
161 itself is destroyed.</para>
162
163 <para>If the <parameter>handler</parameter> to <function>sd_event_add_io()</function> is
164 <constant>NULL</constant>, and the event source fires, this will be considered a request to exit the
165 event loop. In this case, the <parameter>userdata</parameter> parameter, cast to an integer, is passed as
166 the exit code parameter to
167 <citerefentry><refentrytitle>sd_event_exit</refentrytitle><manvolnum>3</manvolnum></citerefentry>.</para>
168
169 <para>Note that this call does not take possession of the file descriptor passed in, ownership (and thus
170 the duty to close it when it is no longer needed) remains with the caller. However, with the
171 <function>sd_event_source_set_io_fd_own()</function> call (see below) the event source may optionally
172 take ownership of the file descriptor after the event source has been created. In that case the file
173 descriptor is closed automatically as soon as the event source is released.</para>
174
175 <para>It is recommended to use
176 <function>sd_event_add_io()</function> only in conjunction with
177 file descriptors that have <constant>O_NONBLOCK</constant> set, to
178 ensure that all I/O operations from invoked handlers are properly
179 asynchronous and non-blocking. Using file descriptors without
180 <constant>O_NONBLOCK</constant> might result in unexpected
181 starvation of other event sources. See
182 <citerefentry project='man-pages'><refentrytitle>fcntl</refentrytitle><manvolnum>2</manvolnum></citerefentry>
183 for details on enabling <constant>O_NONBLOCK</constant> mode.</para>
184
185 <para><function>sd_event_source_get_io_events()</function> retrieves
186 the configured mask of watched I/O events of an event source created
187 previously with <function>sd_event_add_io()</function>. It takes
188 the event source object and a pointer to a variable to store the
189 mask in.</para>
190
191 <para><function>sd_event_source_set_io_events()</function>
192 configures the mask of watched I/O events of an event source created
193 previously with <function>sd_event_add_io()</function>. It takes the
194 event source object and the new event mask.</para>
195
196 <para><function>sd_event_source_get_io_revents()</function>
197 retrieves the I/O event mask of currently seen but undispatched
198 events from an event source created previously with
199 <function>sd_event_add_io()</function>. It takes the event source
200 object and a pointer to a variable to store the event mask
201 in. When called from a handler function on the handler's event
202 source object this will return the same mask as passed to the
203 handler's <parameter>revents</parameter> parameter. This call is
204 primarily useful to check for undispatched events of an event
205 source from the handler of an unrelated (possibly higher priority)
206 event source. Note the relation between
207 <function>sd_event_source_get_pending()</function> and
208 <function>sd_event_source_get_io_revents()</function>: both
209 functions will report non-zero results when there's an event
210 pending for the event source, but the former applies to all event
211 source types, the latter only to I/O event sources.</para>
212
213 <para><function>sd_event_source_get_io_fd()</function> retrieves
214 the UNIX file descriptor of an event source created previously
215 with <function>sd_event_add_io()</function>. It takes the event
216 source object and returns the non-negative file descriptor
217 or a negative error number on error (see below).</para>
218
219 <para><function>sd_event_source_set_io_fd()</function>
220 changes the UNIX file descriptor of an I/O event source created
221 previously with <function>sd_event_add_io()</function>. It takes
222 the event source object and the new file descriptor.</para>
223
224 <para><function>sd_event_source_set_io_fd_own()</function> controls whether the file descriptor of the event source
225 shall be closed automatically when the event source is freed, i.e. whether it shall be considered 'owned' by the
226 event source object. By default it is not closed automatically, and the application has to do this on its own. The
227 <parameter>b</parameter> parameter is a boolean parameter: if zero, the file descriptor is not closed automatically
228 when the event source is freed, otherwise it is closed.</para>
229
230 <para><function>sd_event_source_get_io_fd_own()</function> may be used to query the current setting of the file
231 descriptor ownership boolean flag as set with <function>sd_event_source_set_io_fd_own()</function>. It returns
232 positive if the file descriptor is closed automatically when the event source is destroyed, zero if not, and
233 negative on error.</para>
234 </refsect1>
235
236 <refsect1>
237 <title>Return Value</title>
238
239 <para>On success, these functions return 0 or a positive
240 integer. On failure, they return a negative errno-style error
241 code.</para>
242
243 <refsect2>
244 <title>Errors</title>
245
246 <para>Returned values may indicate the following problems:</para>
247
248 <variablelist>
249 <varlistentry>
250 <term><constant>-ENOMEM</constant></term>
251
252 <listitem><para>Not enough memory to allocate an object.</para></listitem>
253 </varlistentry>
254
255 <varlistentry>
256 <term><constant>-EINVAL</constant></term>
257
258 <listitem><para>An invalid argument has been passed.</para></listitem>
259
260 </varlistentry>
261
262 <varlistentry>
263 <term><constant>-ESTALE</constant></term>
264
265 <listitem><para>The event loop is already terminated.</para></listitem>
266
267 </varlistentry>
268
269 <varlistentry>
270 <term><constant>-ECHILD</constant></term>
271
272 <listitem><para>The event loop has been created in a different process, library or module instance.</para></listitem>
273 </varlistentry>
274
275 <varlistentry>
276 <term><constant>-EDOM</constant></term>
277
278 <listitem><para>The passed event source is not an I/O event source.</para></listitem>
279 </varlistentry>
280
281 <varlistentry>
282 <term><constant>-EPERM</constant></term>
283
284 <listitem><para>The passed file descriptor does not support the <citerefentry
285 project='man-pages'><refentrytitle>epoll</refentrytitle><manvolnum>7</manvolnum></citerefentry>
286 API, for example because it is a regular file or directory. See <citerefentry
287 project='man-pages'><refentrytitle>epoll_ctl</refentrytitle><manvolnum>2</manvolnum></citerefentry>
288 for details.</para>
289
290 <xi:include href="version-info.xml" xpointer="v255"/></listitem>
291 </varlistentry>
292 </variablelist>
293 </refsect2>
294 </refsect1>
295
296 <xi:include href="libsystemd-pkgconfig.xml" />
297
298 <refsect1>
299 <title>History</title>
300 <para><function>sd_event_io_handler_t()</function>,
301 <function>sd_event_add_io()</function>,
302 <function>sd_event_source_get_io_events()</function>,
303 <function>sd_event_source_set_io_events()</function>,
304 <function>sd_event_source_get_io_revents()</function>,
305 <function>sd_event_source_get_io_fd()</function>, and
306 <function>sd_event_source_set_io_fd()</function> were added in version 229.</para>
307 <para><function>sd_event_source_get_io_fd_own()</function> and
308 <function>sd_event_source_set_io_fd_own()</function> were added in version 239.</para>
309 </refsect1>
310
311 <refsect1>
312 <title>See Also</title>
313
314 <para>
315 <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
316 <citerefentry><refentrytitle>sd-event</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
317 <citerefentry><refentrytitle>sd_event_new</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
318 <citerefentry><refentrytitle>sd_event_now</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
319 <citerefentry><refentrytitle>sd_event_add_time</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
320 <citerefentry><refentrytitle>sd_event_add_signal</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
321 <citerefentry><refentrytitle>sd_event_add_child</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
322 <citerefentry><refentrytitle>sd_event_add_inotify</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
323 <citerefentry><refentrytitle>sd_event_add_defer</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
324 <citerefentry><refentrytitle>sd_event_source_set_enabled</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
325 <citerefentry><refentrytitle>sd_event_source_set_priority</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
326 <citerefentry><refentrytitle>sd_event_source_set_userdata</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
327 <citerefentry><refentrytitle>sd_event_source_set_description</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
328 <citerefentry><refentrytitle>sd_event_source_get_pending</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
329 <citerefentry><refentrytitle>sd_event_source_set_floating</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
330 <citerefentry project='man-pages'><refentrytitle>epoll_ctl</refentrytitle><manvolnum>2</manvolnum></citerefentry>,
331 <citerefentry project='man-pages'><refentrytitle>epoll</refentrytitle><manvolnum>7</manvolnum></citerefentry>
332 </para>
333 </refsect1>
334
335 </refentry>