1:255.16-alt1
[systemd_ALT.git] / man / sd_event_add_io.xml
blob9d4fd2726e75b7ab82a00ac011fb81e40cc9fe74
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 -->
6 <refentry id="sd_event_add_io" xmlns:xi="http://www.w3.org/2001/XInclude">
8   <refentryinfo>
9     <title>sd_event_add_io</title>
10     <productname>systemd</productname>
11   </refentryinfo>
13   <refmeta>
14     <refentrytitle>sd_event_add_io</refentrytitle>
15     <manvolnum>3</manvolnum>
16   </refmeta>
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>
30     <refpurpose>Add an I/O event source to an event loop</refpurpose>
31   </refnamediv>
33   <refsynopsisdiv>
34     <funcsynopsis>
35       <funcsynopsisinfo>#include &lt;systemd/sd-event.h&gt;</funcsynopsisinfo>
37       <funcsynopsisinfo><token>typedef</token> struct sd_event_source sd_event_source;</funcsynopsisinfo>
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>
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>
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>
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>
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>
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>
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>
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>
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>
97     </funcsynopsis>
98   </refsynopsisdiv>
100   <refsect1>
101     <title>Description</title>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
219     <para><function>sd_event_source_set_io_fd()</function> changes the UNIX file descriptor of an I/O event
220     source created previously with <function>sd_event_add_io()</function>. It takes the event source object
221     and the new file descriptor. If the event source takes the ownership of the previous file descriptor,
222     that is, <function>sd_event_source_set_io_fd_own()</function> was called for the event source with a
223     non-zero value, then the previous file descriptor will be closed and the event source will also take the
224     ownership of the new file descriptor on success.</para>
226     <para><function>sd_event_source_set_io_fd_own()</function> controls whether the file descriptor of the
227     event source shall be closed automatically when the event source is freed (or when the file descriptor
228     assigned to the event source is replaced by <function>sd_event_source_set_io_fd()</function>), i.e.
229     whether it shall be considered 'owned' by the event source object. By default it is not closed
230     automatically, and the application has to do this on its own. The <parameter>b</parameter> parameter is a
231     boolean parameter: if zero, the file descriptor is not closed automatically when the event source is
232     freed, otherwise it is closed.</para>
234     <para><function>sd_event_source_get_io_fd_own()</function> may be used to query the current setting of the file
235     descriptor ownership boolean flag as set with <function>sd_event_source_set_io_fd_own()</function>. It returns
236     positive if the file descriptor is closed automatically when the event source is destroyed, zero if not, and
237     negative on error.</para>
238   </refsect1>
240   <refsect1>
241     <title>Return Value</title>
243     <para>On success, these functions return 0 or a positive
244     integer. On failure, they return a negative errno-style error
245     code.</para>
247     <refsect2>
248       <title>Errors</title>
250       <para>Returned values may indicate the following problems:</para>
252       <variablelist>
253         <varlistentry>
254           <term><constant>-ENOMEM</constant></term>
256           <listitem><para>Not enough memory to allocate an object.</para></listitem>
257         </varlistentry>
259         <varlistentry>
260           <term><constant>-EINVAL</constant></term>
262           <listitem><para>An invalid argument has been passed.</para></listitem>
264         </varlistentry>
266         <varlistentry>
267           <term><constant>-ESTALE</constant></term>
269           <listitem><para>The event loop is already terminated.</para></listitem>
271         </varlistentry>
273         <varlistentry>
274           <term><constant>-ECHILD</constant></term>
276           <listitem><para>The event loop has been created in a different process, library or module instance.</para></listitem>
277         </varlistentry>
279         <varlistentry>
280           <term><constant>-EDOM</constant></term>
282           <listitem><para>The passed event source is not an I/O event source.</para></listitem>
283         </varlistentry>
285         <varlistentry>
286           <term><constant>-EPERM</constant></term>
288           <listitem><para>The passed file descriptor does not support the <citerefentry
289           project='man-pages'><refentrytitle>epoll</refentrytitle><manvolnum>7</manvolnum></citerefentry>
290           API, for example because it is a regular file or directory. See <citerefentry
291           project='man-pages'><refentrytitle>epoll_ctl</refentrytitle><manvolnum>2</manvolnum></citerefentry>
292           for details.</para>
294           <xi:include href="version-info.xml" xpointer="v255"/></listitem>
295         </varlistentry>
296       </variablelist>
297     </refsect2>
298   </refsect1>
300   <xi:include href="libsystemd-pkgconfig.xml" />
302   <refsect1>
303     <title>History</title>
304     <para><function>sd_event_io_handler_t()</function>,
305     <function>sd_event_add_io()</function>,
306     <function>sd_event_source_get_io_events()</function>,
307     <function>sd_event_source_set_io_events()</function>,
308     <function>sd_event_source_get_io_revents()</function>,
309     <function>sd_event_source_get_io_fd()</function>, and
310     <function>sd_event_source_set_io_fd()</function> were added in version 229.</para>
311     <para><function>sd_event_source_get_io_fd_own()</function> and
312     <function>sd_event_source_set_io_fd_own()</function> were added in version 239.</para>
313   </refsect1>
315   <refsect1>
316     <title>See Also</title>
318     <para>
319       <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
320       <citerefentry><refentrytitle>sd-event</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
321       <citerefentry><refentrytitle>sd_event_new</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
322       <citerefentry><refentrytitle>sd_event_now</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
323       <citerefentry><refentrytitle>sd_event_add_time</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
324       <citerefentry><refentrytitle>sd_event_add_signal</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
325       <citerefentry><refentrytitle>sd_event_add_child</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
326       <citerefentry><refentrytitle>sd_event_add_inotify</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
327       <citerefentry><refentrytitle>sd_event_add_defer</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
328       <citerefentry><refentrytitle>sd_event_source_set_enabled</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
329       <citerefentry><refentrytitle>sd_event_source_set_priority</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
330       <citerefentry><refentrytitle>sd_event_source_set_userdata</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
331       <citerefentry><refentrytitle>sd_event_source_set_description</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
332       <citerefentry><refentrytitle>sd_event_source_get_pending</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
333       <citerefentry><refentrytitle>sd_event_source_set_floating</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
334       <citerefentry project='man-pages'><refentrytitle>epoll_ctl</refentrytitle><manvolnum>2</manvolnum></citerefentry>,
335       <citerefentry project='man-pages'><refentrytitle>epoll</refentrytitle><manvolnum>7</manvolnum></citerefentry>
336     </para>
337   </refsect1>
339 </refentry>