xref: /freebsd/lib/libsys/timerfd.2 (revision 8269e7673cf033aba67dab8264fe719920c70f87)
1*8269e767SBrooks Davis.\" SPDX-License-Identifier: BSD-2-Clause
2*8269e767SBrooks Davis.\"
3*8269e767SBrooks Davis.\" Copyright (c) 2023 Jake Freeland <jfree@FreeBSD.org>
4*8269e767SBrooks Davis.\"
5*8269e767SBrooks Davis.\" Redistribution and use in source and binary forms, with or without
6*8269e767SBrooks Davis.\" modification, are permitted provided that the following conditions
7*8269e767SBrooks Davis.\" are met:
8*8269e767SBrooks Davis.\" 1. Redistributions of source code must retain the above copyright
9*8269e767SBrooks Davis.\"    notice, this list of conditions and the following disclaimer.
10*8269e767SBrooks Davis.\" 2. Redistributions in binary form must reproduce the above copyright
11*8269e767SBrooks Davis.\"    notice, this list of conditions and the following disclaimer in the
12*8269e767SBrooks Davis.\"    documentation and/or other materials provided with the distribution.
13*8269e767SBrooks Davis.\"
14*8269e767SBrooks Davis.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15*8269e767SBrooks Davis.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16*8269e767SBrooks Davis.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17*8269e767SBrooks Davis.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18*8269e767SBrooks Davis.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19*8269e767SBrooks Davis.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20*8269e767SBrooks Davis.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21*8269e767SBrooks Davis.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22*8269e767SBrooks Davis.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23*8269e767SBrooks Davis.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24*8269e767SBrooks Davis.\" SUCH DAMAGE.
25*8269e767SBrooks Davis.\"
26*8269e767SBrooks Davis.Dd May 21, 2023
27*8269e767SBrooks Davis.Dt TIMERFD 2
28*8269e767SBrooks Davis.Os
29*8269e767SBrooks Davis.Sh NAME
30*8269e767SBrooks Davis.Nm timerfd ,
31*8269e767SBrooks Davis.Nm timerfd_create ,
32*8269e767SBrooks Davis.Nm timerfd_gettime ,
33*8269e767SBrooks Davis.Nm timerfd_settime
34*8269e767SBrooks Davis.Nd timers with file descriptor semantics
35*8269e767SBrooks Davis.Sh LIBRARY
36*8269e767SBrooks Davis.Lb libc
37*8269e767SBrooks Davis.Sh SYNOPSIS
38*8269e767SBrooks Davis.In sys/timerfd.h
39*8269e767SBrooks Davis.Ft int
40*8269e767SBrooks Davis.Fo timerfd_create
41*8269e767SBrooks Davis.Fa "int clockid"
42*8269e767SBrooks Davis.Fa "int flags"
43*8269e767SBrooks Davis.Fc
44*8269e767SBrooks Davis.Ft int
45*8269e767SBrooks Davis.Fo timerfd_gettime
46*8269e767SBrooks Davis.Fa "int fd"
47*8269e767SBrooks Davis.Fa "struct itimerspec *curr_value"
48*8269e767SBrooks Davis.Fc
49*8269e767SBrooks Davis.Ft int
50*8269e767SBrooks Davis.Fo timerfd_settime
51*8269e767SBrooks Davis.Fa "int fd"
52*8269e767SBrooks Davis.Fa "int flags"
53*8269e767SBrooks Davis.Fa "const struct itimerspec *new_value"
54*8269e767SBrooks Davis.Fa "struct itimerspec *old_value"
55*8269e767SBrooks Davis.Fc
56*8269e767SBrooks Davis.Sh DESCRIPTION
57*8269e767SBrooks DavisThe
58*8269e767SBrooks Davis.Nm
59*8269e767SBrooks Davissystem calls operate on timers, identified by special
60*8269e767SBrooks Davis.Nm
61*8269e767SBrooks Davisfile descriptors.
62*8269e767SBrooks DavisThese calls are analogous to
63*8269e767SBrooks Davis.Fn timer_create ,
64*8269e767SBrooks Davis.Fn timer_gettime ,
65*8269e767SBrooks Davisand
66*8269e767SBrooks Davis.Fn timer_settime
67*8269e767SBrooks Davisper-process timer functions, but use a
68*8269e767SBrooks Davis.Nm
69*8269e767SBrooks Davisdescriptor in place of
70*8269e767SBrooks Davis.Fa timerid .
71*8269e767SBrooks Davis.Pp
72*8269e767SBrooks DavisAll
73*8269e767SBrooks Davis.Nm
74*8269e767SBrooks Davisdescriptors possess traditional file descriptor semantics; they may be passed
75*8269e767SBrooks Davisto other processes, preserved across
76*8269e767SBrooks Davis.Xr fork 2 ,
77*8269e767SBrooks Davisand monitored via
78*8269e767SBrooks Davis.Xr kevent 2 ,
79*8269e767SBrooks Davis.Xr poll 2 ,
80*8269e767SBrooks Davisor
81*8269e767SBrooks Davis.Xr select 2 .
82*8269e767SBrooks DavisWhen a
83*8269e767SBrooks Davis.Nm
84*8269e767SBrooks Davisdescriptor is no longer needed, it may be disposed of using
85*8269e767SBrooks Davis.Xr close 2 .
86*8269e767SBrooks Davis.Bl -tag -width "Fn timerfd_settime"
87*8269e767SBrooks Davis.It Fn timerfd_create
88*8269e767SBrooks DavisInitialize a
89*8269e767SBrooks Davis.Nm
90*8269e767SBrooks Davisobject and return its file descriptor.
91*8269e767SBrooks DavisThe
92*8269e767SBrooks Davis.Fa clockid
93*8269e767SBrooks Davisargument specifies the clock used as a timing base and may be:
94*8269e767SBrooks Davis.Pp
95*8269e767SBrooks Davis.Bl -tag -width "Dv CLOCK_MONOTONIC" -compact
96*8269e767SBrooks Davis.It Dv CLOCK_REALTIME
97*8269e767SBrooks DavisIncrements as a wall clock should.
98*8269e767SBrooks Davis.It Dv CLOCK_MONOTONIC
99*8269e767SBrooks DavisIncrements monotonically in SI seconds.
100*8269e767SBrooks Davis.El
101*8269e767SBrooks Davis.Pp
102*8269e767SBrooks DavisThe
103*8269e767SBrooks Davis.Fa flags
104*8269e767SBrooks Davisargument may contain the result of
105*8269e767SBrooks Davis.Em or Ns 'ing
106*8269e767SBrooks Davisthe following values:
107*8269e767SBrooks Davis.Pp
108*8269e767SBrooks Davis.Bl -tag -width "Dv TFD_NONBLOCK" -compact
109*8269e767SBrooks Davis.It Dv TFD_CLOEXEC
110*8269e767SBrooks DavisThe newly generated file descriptor will close-on-exec.
111*8269e767SBrooks Davis.It Dv TFD_NONBLOCK
112*8269e767SBrooks DavisDo not block on read/write operations.
113*8269e767SBrooks Davis.El
114*8269e767SBrooks Davis.It Fn timerfd_gettime
115*8269e767SBrooks DavisRetrieve the current state of the timer denoted by
116*8269e767SBrooks Davis.Fa fd .
117*8269e767SBrooks DavisThe result is stored in
118*8269e767SBrooks Davis.Fa curr_value
119*8269e767SBrooks Davisas a
120*8269e767SBrooks Davis.Dv struct itimerspec .
121*8269e767SBrooks DavisThe
122*8269e767SBrooks Davis.Fa it_value
123*8269e767SBrooks Davisand
124*8269e767SBrooks Davis.Fa it_interval
125*8269e767SBrooks Davismembers of
126*8269e767SBrooks Davis.Fa curr_value
127*8269e767SBrooks Davisrepresent the relative time until the next expiration and the interval
128*8269e767SBrooks Davisreload value last set by
129*8269e767SBrooks Davis.Fn timerfd_settime ,
130*8269e767SBrooks Davisrespectively.
131*8269e767SBrooks Davis.It Fn timerfd_settime
132*8269e767SBrooks DavisUpdate the timer denoted by
133*8269e767SBrooks Davis.Fa fd
134*8269e767SBrooks Daviswith the
135*8269e767SBrooks Davis.Dv struct itimerspec
136*8269e767SBrooks Davisin
137*8269e767SBrooks Davis.Fa new_value .
138*8269e767SBrooks DavisThe
139*8269e767SBrooks Davis.Fa it_value
140*8269e767SBrooks Davismember of
141*8269e767SBrooks Davis.Fa new_value
142*8269e767SBrooks Davisshould contain the amount of time before the timer expires, or zero if the
143*8269e767SBrooks Davistimer should be disarmed.
144*8269e767SBrooks DavisThe
145*8269e767SBrooks Davis.Fa it_interval
146*8269e767SBrooks Davismember should contain the reload time if an interval timer is desired.
147*8269e767SBrooks Davis.Pp
148*8269e767SBrooks DavisThe previous timer state will be stored in
149*8269e767SBrooks Davis.Fa old_value
150*8269e767SBrooks Davisgiven
151*8269e767SBrooks Davis.Fa old_value
152*8269e767SBrooks Davisis not
153*8269e767SBrooks Davis.Dv NULL .
154*8269e767SBrooks Davis.Pp
155*8269e767SBrooks DavisThe
156*8269e767SBrooks Davis.Fa flags
157*8269e767SBrooks Davisargument may contain the result of
158*8269e767SBrooks Davis.Em or Ns 'ing
159*8269e767SBrooks Davisthe following values:
160*8269e767SBrooks Davis.Pp
161*8269e767SBrooks Davis.Bl -tag -width TFD_TIMER_CANCEL_ON_SET -compact
162*8269e767SBrooks Davis.It Dv TFD_TIMER_ABSTIME
163*8269e767SBrooks DavisExpiration will occur at the absolute time provided in
164*8269e767SBrooks Davis.Fa new_value .
165*8269e767SBrooks DavisNormally,
166*8269e767SBrooks Davis.Fa new_value
167*8269e767SBrooks Davisrepresents a relative time compared to the timer's
168*8269e767SBrooks Davis.Fa clockid
169*8269e767SBrooks Davisclock.
170*8269e767SBrooks Davis.It Dv TFD_TIMER_CANCEL_ON_SET
171*8269e767SBrooks DavisIf
172*8269e767SBrooks Davis.Fa clockid
173*8269e767SBrooks Davishas been set to
174*8269e767SBrooks Davis.Dv CLOCK_REALTIME
175*8269e767SBrooks Davisand the realtime clock has experienced a discontinuous jump,
176*8269e767SBrooks Davisthen the timer will be canceled and the next
177*8269e767SBrooks Davis.Xr read 2
178*8269e767SBrooks Daviswill fail with
179*8269e767SBrooks Davis.Dv ECANCELED .
180*8269e767SBrooks Davis.El
181*8269e767SBrooks Davis.El
182*8269e767SBrooks Davis.Pp
183*8269e767SBrooks DavisFile operations have the following semantics:
184*8269e767SBrooks Davis.Bl -tag -width ioctl
185*8269e767SBrooks Davis.It Xr read 2
186*8269e767SBrooks DavisTransfer the number of timer expirations that have occurred since the last
187*8269e767SBrooks Davissuccessful
188*8269e767SBrooks Davis.Xr read 2
189*8269e767SBrooks Davisor
190*8269e767SBrooks Davis.Fn timerfd_settime
191*8269e767SBrooks Davisinto the output buffer of size
192*8269e767SBrooks Davis.Vt uint64_t .
193*8269e767SBrooks DavisIf the expiration counter is zero,
194*8269e767SBrooks Davis.Xr read 2
195*8269e767SBrooks Davisblocks until a timer expiration occurs unless
196*8269e767SBrooks Davis.Dv TFD_NONBLOCK
197*8269e767SBrooks Davisis set, where
198*8269e767SBrooks Davis.Dv EAGAIN
199*8269e767SBrooks Davisis returned.
200*8269e767SBrooks Davis.It Xr poll 2
201*8269e767SBrooks DavisThe file descriptor is readable when its timer expiration counter is greater
202*8269e767SBrooks Davisthan zero.
203*8269e767SBrooks Davis.It Xr ioctl 2
204*8269e767SBrooks Davis.Bl -tag -width FIONREAD
205*8269e767SBrooks Davis.It Dv FIOASYNC int
206*8269e767SBrooks DavisA non-zero input will set the FASYNC flag.
207*8269e767SBrooks DavisA zero input will clear the FASYNC flag.
208*8269e767SBrooks Davis.It Dv FIONBIO int
209*8269e767SBrooks DavisA non-zero input will set the FNONBLOCK flag.
210*8269e767SBrooks DavisA zero input will clear the FNONBLOCK flag.
211*8269e767SBrooks Davis.El
212*8269e767SBrooks Davis.El
213*8269e767SBrooks Davis.Sh RETURN VALUES
214*8269e767SBrooks DavisThe
215*8269e767SBrooks Davis.Fn timerfd_create
216*8269e767SBrooks Davissystem call creates a
217*8269e767SBrooks Davis.Nm
218*8269e767SBrooks Davisobject and returns its file descriptor.
219*8269e767SBrooks DavisIf an error occurs, -1 is returned and the global variable
220*8269e767SBrooks Davis.Fa errno
221*8269e767SBrooks Davisis set to indicate the error.
222*8269e767SBrooks Davis.Pp
223*8269e767SBrooks DavisThe
224*8269e767SBrooks Davis.Fn timerfd_gettime
225*8269e767SBrooks Davisand
226*8269e767SBrooks Davis.Fn timerfd_settime
227*8269e767SBrooks Davissystem calls return 0 on success.
228*8269e767SBrooks DavisIf an error occurs, -1 is returned and the global variable
229*8269e767SBrooks Davis.Fa errno
230*8269e767SBrooks Davisis set to indicate the error.
231*8269e767SBrooks Davis.Sh ERRORS
232*8269e767SBrooks DavisThe
233*8269e767SBrooks Davis.Fn timerfd_create
234*8269e767SBrooks Davissystem call fails if:
235*8269e767SBrooks Davis.Bl -tag -width Er
236*8269e767SBrooks Davis.It Bq Er EINVAL
237*8269e767SBrooks DavisThe specified
238*8269e767SBrooks Davis.Fa clockid
239*8269e767SBrooks Davisis not supported.
240*8269e767SBrooks Davis.It Bq Er EINVAL
241*8269e767SBrooks DavisThe provided
242*8269e767SBrooks Davis.Fa flags
243*8269e767SBrooks Davisare invalid.
244*8269e767SBrooks Davis.It Bq Er EMFILE
245*8269e767SBrooks DavisThe per-process descriptor table is full.
246*8269e767SBrooks Davis.It Bq Er ENFILE
247*8269e767SBrooks DavisThe system file table is full.
248*8269e767SBrooks Davis.It Bq Er ENOMEM
249*8269e767SBrooks DavisThe kernel failed to allocate enough memory for the timer.
250*8269e767SBrooks Davis.El
251*8269e767SBrooks Davis.Pp
252*8269e767SBrooks DavisBoth
253*8269e767SBrooks Davis.Fn timerfd_gettime
254*8269e767SBrooks Davisand
255*8269e767SBrooks Davis.Fn timerfd_settime
256*8269e767SBrooks Davissystem calls fail if:
257*8269e767SBrooks Davis.Bl -tag -width Er
258*8269e767SBrooks Davis.It Bq Er EBADF
259*8269e767SBrooks DavisThe provided
260*8269e767SBrooks Davis.Fa fd
261*8269e767SBrooks Davisis invalid.
262*8269e767SBrooks Davis.It Bq Er EFAULT
263*8269e767SBrooks DavisThe addresses provided by
264*8269e767SBrooks Davis.Fa curr_value ,
265*8269e767SBrooks Davis.Fa new_value ,
266*8269e767SBrooks Davisor
267*8269e767SBrooks Davis.Fa old_value
268*8269e767SBrooks Davisare invalid.
269*8269e767SBrooks Davis.It Bq Er EINVAL
270*8269e767SBrooks DavisThe provided
271*8269e767SBrooks Davis.Fa fd
272*8269e767SBrooks Davisis valid, but was not generated by
273*8269e767SBrooks Davis.Fn timerfd_create .
274*8269e767SBrooks Davis.El
275*8269e767SBrooks Davis.Pp
276*8269e767SBrooks DavisThe following errors only apply to
277*8269e767SBrooks Davis.Fn timerfd_settime :
278*8269e767SBrooks Davis.Bl -tag -width Er
279*8269e767SBrooks Davis.It Bq Er EINVAL
280*8269e767SBrooks DavisThe provided
281*8269e767SBrooks Davis.Fa flags
282*8269e767SBrooks Davisare invalid.
283*8269e767SBrooks Davis.It Bq Er EINVAL
284*8269e767SBrooks DavisA nanosecond field in the
285*8269e767SBrooks Davis.Fa new_value
286*8269e767SBrooks Davisargument specified a value less than zero, or greater than or equal to 10^9.
287*8269e767SBrooks Davis.It Bq Er ECANCELED
288*8269e767SBrooks DavisThe timer was created with the clock ID
289*8269e767SBrooks Davis.Dv CLOCK_REALTIME ,
290*8269e767SBrooks Daviswas configured with the
291*8269e767SBrooks Davis.Dv TFD_TIMER_CANCEL_ON_SET
292*8269e767SBrooks Davisflag, and the system realtime clock experienced a discontinuous change without
293*8269e767SBrooks Davisbeing read.
294*8269e767SBrooks Davis.El
295*8269e767SBrooks Davis.Pp
296*8269e767SBrooks DavisA read from a
297*8269e767SBrooks Davis.Nm
298*8269e767SBrooks Davisobject fails if:
299*8269e767SBrooks Davis.Bl -tag -width Er
300*8269e767SBrooks Davis.It Bq Er EAGAIN
301*8269e767SBrooks DavisThe timer's expiration counter is zero and the
302*8269e767SBrooks Davis.Nm
303*8269e767SBrooks Davisobject is is set for non-blocking I/O.
304*8269e767SBrooks Davis.It Bq Er ECANCELED
305*8269e767SBrooks DavisThe timer was created with the clock ID
306*8269e767SBrooks Davis.Dv CLOCK_REALTIME ,
307*8269e767SBrooks Daviswas configured with the
308*8269e767SBrooks Davis.Dv TFD_TIMER_CANCEL_ON_SET
309*8269e767SBrooks Davisflag, and the system realtime clock experienced a discontinuous change.
310*8269e767SBrooks Davis.It Bq Er EINVAL
311*8269e767SBrooks DavisThe size of the read buffer is not large enough to hold the
312*8269e767SBrooks Davis.Vt uint64_t
313*8269e767SBrooks Davissized timer expiration counter.
314*8269e767SBrooks Davis.El
315*8269e767SBrooks Davis.Sh SEE ALSO
316*8269e767SBrooks Davis.Xr eventfd 2 ,
317*8269e767SBrooks Davis.Xr kqueue 2 ,
318*8269e767SBrooks Davis.Xr poll 2 ,
319*8269e767SBrooks Davis.Xr read 2 ,
320*8269e767SBrooks Davis.Xr timer_create 2 ,
321*8269e767SBrooks Davis.Xr timer_gettime 2 ,
322*8269e767SBrooks Davis.Xr timer_settime 2
323*8269e767SBrooks Davis.Sh STANDARDS
324*8269e767SBrooks DavisThe
325*8269e767SBrooks Davis.Nm
326*8269e767SBrooks Davissystem calls originated from Linux and are non-standard.
327*8269e767SBrooks Davis.Sh HISTORY
328*8269e767SBrooks Davis.An -nosplit
329*8269e767SBrooks DavisThe
330*8269e767SBrooks Davis.Nm
331*8269e767SBrooks Davisfacility was originally ported to
332*8269e767SBrooks Davis.Fx Ns 's
333*8269e767SBrooks DavisLinux compatibility layer by
334*8269e767SBrooks Davis.An Dmitry Chagin Aq Mt dchagin@FreeBSD.org
335*8269e767SBrooks Davisin
336*8269e767SBrooks Davis.Fx 12.0 .
337*8269e767SBrooks DavisIt was revised and adapted to be native by
338*8269e767SBrooks Davis.An Jake Freeland Aq Mt jfree@FreeBSD.org
339*8269e767SBrooks Davisin
340*8269e767SBrooks Davis.Fx 14.0 .
341