xref: /freebsd-14.2/lib/libc/sys/timerfd.2 (revision 499d4a60)
18544651dSJake Freeland.\" SPDX-License-Identifier: BSD-2-Clause
28544651dSJake Freeland.\"
38544651dSJake Freeland.\" Copyright (c) 2023 Jake Freeland <[email protected]>
48544651dSJake Freeland.\"
58544651dSJake Freeland.\" Redistribution and use in source and binary forms, with or without
68544651dSJake Freeland.\" modification, are permitted provided that the following conditions
78544651dSJake Freeland.\" are met:
88544651dSJake Freeland.\" 1. Redistributions of source code must retain the above copyright
98544651dSJake Freeland.\"    notice, this list of conditions and the following disclaimer.
108544651dSJake Freeland.\" 2. Redistributions in binary form must reproduce the above copyright
118544651dSJake Freeland.\"    notice, this list of conditions and the following disclaimer in the
128544651dSJake Freeland.\"    documentation and/or other materials provided with the distribution.
138544651dSJake Freeland.\"
148544651dSJake Freeland.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
158544651dSJake Freeland.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
168544651dSJake Freeland.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
178544651dSJake Freeland.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
188544651dSJake Freeland.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
198544651dSJake Freeland.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
208544651dSJake Freeland.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
218544651dSJake Freeland.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
228544651dSJake Freeland.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
238544651dSJake Freeland.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
248544651dSJake Freeland.\" SUCH DAMAGE.
258544651dSJake Freeland.\"
268544651dSJake Freeland.Dd May 21, 2023
278544651dSJake Freeland.Dt TIMERFD 2
288544651dSJake Freeland.Os
298544651dSJake Freeland.Sh NAME
308544651dSJake Freeland.Nm timerfd ,
318544651dSJake Freeland.Nm timerfd_create ,
328544651dSJake Freeland.Nm timerfd_gettime ,
338544651dSJake Freeland.Nm timerfd_settime
348544651dSJake Freeland.Nd timers with file descriptor semantics
358544651dSJake Freeland.Sh LIBRARY
368544651dSJake Freeland.Lb libc
378544651dSJake Freeland.Sh SYNOPSIS
388544651dSJake Freeland.In sys/timerfd.h
398544651dSJake Freeland.Ft int
408544651dSJake Freeland.Fo timerfd_create
418544651dSJake Freeland.Fa "int clockid"
428544651dSJake Freeland.Fa "int flags"
438544651dSJake Freeland.Fc
448544651dSJake Freeland.Ft int
458544651dSJake Freeland.Fo timerfd_gettime
468544651dSJake Freeland.Fa "int fd"
478544651dSJake Freeland.Fa "struct itimerspec *curr_value"
488544651dSJake Freeland.Fc
498544651dSJake Freeland.Ft int
508544651dSJake Freeland.Fo timerfd_settime
518544651dSJake Freeland.Fa "int fd"
528544651dSJake Freeland.Fa "int flags"
538544651dSJake Freeland.Fa "const struct itimerspec *new_value"
548544651dSJake Freeland.Fa "struct itimerspec *old_value"
558544651dSJake Freeland.Fc
568544651dSJake Freeland.Sh DESCRIPTION
578544651dSJake FreelandThe
588544651dSJake Freeland.Nm
598544651dSJake Freelandsystem calls operate on timers, identified by special
608544651dSJake Freeland.Nm
618544651dSJake Freelandfile descriptors.
628544651dSJake FreelandThese calls are analogous to
638544651dSJake Freeland.Fn timer_create ,
648544651dSJake Freeland.Fn timer_gettime ,
658544651dSJake Freelandand
668544651dSJake Freeland.Fn timer_settime
678544651dSJake Freelandper-process timer functions, but use a
688544651dSJake Freeland.Nm
698544651dSJake Freelanddescriptor in place of
708544651dSJake Freeland.Fa timerid .
718544651dSJake Freeland.Pp
728544651dSJake FreelandAll
738544651dSJake Freeland.Nm
748544651dSJake Freelanddescriptors possess traditional file descriptor semantics; they may be passed
758544651dSJake Freelandto other processes, preserved across
768544651dSJake Freeland.Xr fork 2 ,
778544651dSJake Freelandand monitored via
788544651dSJake Freeland.Xr kevent 2 ,
798544651dSJake Freeland.Xr poll 2 ,
808544651dSJake Freelandor
818544651dSJake Freeland.Xr select 2 .
828544651dSJake FreelandWhen a
838544651dSJake Freeland.Nm
848544651dSJake Freelanddescriptor is no longer needed, it may be disposed of using
858544651dSJake Freeland.Xr close 2 .
868544651dSJake Freeland.Bl -tag -width "Fn timerfd_settime"
878544651dSJake Freeland.It Fn timerfd_create
888544651dSJake FreelandInitialize a
898544651dSJake Freeland.Nm
908544651dSJake Freelandobject and return its file descriptor.
918544651dSJake FreelandThe
928544651dSJake Freeland.Fa clockid
938544651dSJake Freelandargument specifies the clock used as a timing base and may be:
948544651dSJake Freeland.Pp
958544651dSJake Freeland.Bl -tag -width "Dv CLOCK_MONOTONIC" -compact
968544651dSJake Freeland.It Dv CLOCK_REALTIME
978544651dSJake FreelandIncrements as a wall clock should.
988544651dSJake Freeland.It Dv CLOCK_MONOTONIC
998544651dSJake FreelandIncrements monotonically in SI seconds.
1008544651dSJake Freeland.El
1018544651dSJake Freeland.Pp
1028544651dSJake FreelandThe
1038544651dSJake Freeland.Fa flags
1048544651dSJake Freelandargument may contain the result of
1058544651dSJake Freeland.Em or Ns 'ing
1068544651dSJake Freelandthe following values:
1078544651dSJake Freeland.Pp
1088544651dSJake Freeland.Bl -tag -width "Dv TFD_NONBLOCK" -compact
1098544651dSJake Freeland.It Dv TFD_CLOEXEC
1108544651dSJake FreelandThe newly generated file descriptor will close-on-exec.
1118544651dSJake Freeland.It Dv TFD_NONBLOCK
1128544651dSJake FreelandDo not block on read/write operations.
1138544651dSJake Freeland.El
1148544651dSJake Freeland.It Fn timerfd_gettime
1158544651dSJake FreelandRetrieve the current state of the timer denoted by
1168544651dSJake Freeland.Fa fd .
1178544651dSJake FreelandThe result is stored in
1188544651dSJake Freeland.Fa curr_value
1198544651dSJake Freelandas a
1208544651dSJake Freeland.Dv struct itimerspec .
1218544651dSJake FreelandThe
1228544651dSJake Freeland.Fa it_value
1238544651dSJake Freelandand
1248544651dSJake Freeland.Fa it_interval
1258544651dSJake Freelandmembers of
1268544651dSJake Freeland.Fa curr_value
1278544651dSJake Freelandrepresent the relative time until the next expiration and the interval
1288544651dSJake Freelandreload value last set by
1298544651dSJake Freeland.Fn timerfd_settime ,
1308544651dSJake Freelandrespectively.
1318544651dSJake Freeland.It Fn timerfd_settime
1328544651dSJake FreelandUpdate the timer denoted by
1338544651dSJake Freeland.Fa fd
1348544651dSJake Freelandwith the
1358544651dSJake Freeland.Dv struct itimerspec
1368544651dSJake Freelandin
1378544651dSJake Freeland.Fa new_value .
1388544651dSJake FreelandThe
1398544651dSJake Freeland.Fa it_value
1408544651dSJake Freelandmember of
1418544651dSJake Freeland.Fa new_value
1428544651dSJake Freelandshould contain the amount of time before the timer expires, or zero if the
1438544651dSJake Freelandtimer should be disarmed.
1448544651dSJake FreelandThe
1458544651dSJake Freeland.Fa it_interval
1468544651dSJake Freelandmember should contain the reload time if an interval timer is desired.
1478544651dSJake Freeland.Pp
1488544651dSJake FreelandThe previous timer state will be stored in
1498544651dSJake Freeland.Fa old_value
1508544651dSJake Freelandgiven
1518544651dSJake Freeland.Fa old_value
1528544651dSJake Freelandis not
1538544651dSJake Freeland.Dv NULL .
1548544651dSJake Freeland.Pp
1558544651dSJake FreelandThe
1568544651dSJake Freeland.Fa flags
1578544651dSJake Freelandargument may contain the result of
1588544651dSJake Freeland.Em or Ns 'ing
1598544651dSJake Freelandthe following values:
1608544651dSJake Freeland.Pp
1618544651dSJake Freeland.Bl -tag -width TFD_TIMER_CANCEL_ON_SET -compact
1628544651dSJake Freeland.It Dv TFD_TIMER_ABSTIME
1638544651dSJake FreelandExpiration will occur at the absolute time provided in
1648544651dSJake Freeland.Fa new_value .
1658544651dSJake FreelandNormally,
1668544651dSJake Freeland.Fa new_value
1678544651dSJake Freelandrepresents a relative time compared to the timer's
1688544651dSJake Freeland.Fa clockid
1698544651dSJake Freelandclock.
1708544651dSJake Freeland.It Dv TFD_TIMER_CANCEL_ON_SET
1718544651dSJake FreelandIf
1728544651dSJake Freeland.Fa clockid
1738544651dSJake Freelandhas been set to
1748544651dSJake Freeland.Dv CLOCK_REALTIME
1758544651dSJake Freelandand the realtime clock has experienced a discontinuous jump,
1768544651dSJake Freelandthen the timer will be canceled and the next
1778544651dSJake Freeland.Xr read 2
1788544651dSJake Freelandwill fail with
1798544651dSJake Freeland.Dv ECANCELED .
1808544651dSJake Freeland.El
1818544651dSJake Freeland.El
1828544651dSJake Freeland.Pp
1838544651dSJake FreelandFile operations have the following semantics:
1848544651dSJake Freeland.Bl -tag -width ioctl
1858544651dSJake Freeland.It Xr read 2
1868544651dSJake FreelandTransfer the number of timer expirations that have occurred since the last
1878544651dSJake Freelandsuccessful
1888544651dSJake Freeland.Xr read 2
1898544651dSJake Freelandor
1908544651dSJake Freeland.Fn timerfd_settime
1918544651dSJake Freelandinto the output buffer of size
1928544651dSJake Freeland.Vt uint64_t .
1938544651dSJake FreelandIf the expiration counter is zero,
1948544651dSJake Freeland.Xr read 2
1958544651dSJake Freelandblocks until a timer expiration occurs unless
1968544651dSJake Freeland.Dv TFD_NONBLOCK
1978544651dSJake Freelandis set, where
1988544651dSJake Freeland.Dv EAGAIN
1998544651dSJake Freelandis returned.
2008544651dSJake Freeland.It Xr poll 2
2018544651dSJake FreelandThe file descriptor is readable when its timer expiration counter is greater
2028544651dSJake Freelandthan zero.
2038544651dSJake Freeland.It Xr ioctl 2
2048544651dSJake Freeland.Bl -tag -width FIONREAD
2058544651dSJake Freeland.It Dv FIOASYNC int
2068544651dSJake FreelandA non-zero input will set the FASYNC flag.
2078544651dSJake FreelandA zero input will clear the FASYNC flag.
2088544651dSJake Freeland.It Dv FIONBIO int
2098544651dSJake FreelandA non-zero input will set the FNONBLOCK flag.
2108544651dSJake FreelandA zero input will clear the FNONBLOCK flag.
2118544651dSJake Freeland.El
2128544651dSJake Freeland.El
2138544651dSJake Freeland.Sh RETURN VALUES
2148544651dSJake FreelandThe
2158544651dSJake Freeland.Fn timerfd_create
2168544651dSJake Freelandsystem call creates a
2178544651dSJake Freeland.Nm
2188544651dSJake Freelandobject and returns its file descriptor.
2198544651dSJake FreelandIf an error occurs, -1 is returned and the global variable
2208544651dSJake Freeland.Fa errno
2218544651dSJake Freelandis set to indicate the error.
2228544651dSJake Freeland.Pp
2238544651dSJake FreelandThe
2248544651dSJake Freeland.Fn timerfd_gettime
2258544651dSJake Freelandand
2268544651dSJake Freeland.Fn timerfd_settime
2278544651dSJake Freelandsystem calls return 0 on success.
2288544651dSJake FreelandIf an error occurs, -1 is returned and the global variable
2298544651dSJake Freeland.Fa errno
2308544651dSJake Freelandis set to indicate the error.
2318544651dSJake Freeland.Sh ERRORS
2328544651dSJake FreelandThe
2338544651dSJake Freeland.Fn timerfd_create
2348544651dSJake Freelandsystem call fails if:
2358544651dSJake Freeland.Bl -tag -width Er
2368544651dSJake Freeland.It Bq Er EINVAL
2378544651dSJake FreelandThe specified
2388544651dSJake Freeland.Fa clockid
2398544651dSJake Freelandis not supported.
2408544651dSJake Freeland.It Bq Er EINVAL
2418544651dSJake FreelandThe provided
2428544651dSJake Freeland.Fa flags
2438544651dSJake Freelandare invalid.
2448544651dSJake Freeland.It Bq Er EMFILE
2458544651dSJake FreelandThe per-process descriptor table is full.
2468544651dSJake Freeland.It Bq Er ENFILE
2478544651dSJake FreelandThe system file table is full.
2488544651dSJake Freeland.It Bq Er ENOMEM
2498544651dSJake FreelandThe kernel failed to allocate enough memory for the timer.
2508544651dSJake Freeland.El
2518544651dSJake Freeland.Pp
2528544651dSJake FreelandBoth
2538544651dSJake Freeland.Fn timerfd_gettime
2548544651dSJake Freelandand
2558544651dSJake Freeland.Fn timerfd_settime
2568544651dSJake Freelandsystem calls fail if:
2578544651dSJake Freeland.Bl -tag -width Er
2588544651dSJake Freeland.It Bq Er EBADF
2598544651dSJake FreelandThe provided
2608544651dSJake Freeland.Fa fd
2618544651dSJake Freelandis invalid.
2628544651dSJake Freeland.It Bq Er EFAULT
2638544651dSJake FreelandThe addresses provided by
2648544651dSJake Freeland.Fa curr_value ,
2658544651dSJake Freeland.Fa new_value ,
2668544651dSJake Freelandor
2678544651dSJake Freeland.Fa old_value
2688544651dSJake Freelandare invalid.
2698544651dSJake Freeland.It Bq Er EINVAL
2708544651dSJake FreelandThe provided
2718544651dSJake Freeland.Fa fd
2728544651dSJake Freelandis valid, but was not generated by
2738544651dSJake Freeland.Fn timerfd_create .
2748544651dSJake Freeland.El
2758544651dSJake Freeland.Pp
2768544651dSJake FreelandThe following errors only apply to
2778544651dSJake Freeland.Fn timerfd_settime :
2788544651dSJake Freeland.Bl -tag -width Er
2798544651dSJake Freeland.It Bq Er EINVAL
2808544651dSJake FreelandThe provided
2818544651dSJake Freeland.Fa flags
2828544651dSJake Freelandare invalid.
2838544651dSJake Freeland.It Bq Er EINVAL
2848544651dSJake FreelandA nanosecond field in the
2858544651dSJake Freeland.Fa new_value
2868544651dSJake Freelandargument specified a value less than zero, or greater than or equal to 10^9.
2878544651dSJake Freeland.It Bq Er ECANCELED
2888544651dSJake FreelandThe timer was created with the clock ID
2898544651dSJake Freeland.Dv CLOCK_REALTIME ,
2908544651dSJake Freelandwas configured with the
2918544651dSJake Freeland.Dv TFD_TIMER_CANCEL_ON_SET
2928544651dSJake Freelandflag, and the system realtime clock experienced a discontinuous change without
2938544651dSJake Freelandbeing read.
2948544651dSJake Freeland.El
2958544651dSJake Freeland.Pp
2968544651dSJake FreelandA read from a
2978544651dSJake Freeland.Nm
2988544651dSJake Freelandobject fails if:
2998544651dSJake Freeland.Bl -tag -width Er
3008544651dSJake Freeland.It Bq Er EAGAIN
3018544651dSJake FreelandThe timer's expiration counter is zero and the
3028544651dSJake Freeland.Nm
303*499d4a60SGordon Berglingobject is set for non-blocking I/O.
3048544651dSJake Freeland.It Bq Er ECANCELED
3058544651dSJake FreelandThe timer was created with the clock ID
3068544651dSJake Freeland.Dv CLOCK_REALTIME ,
3078544651dSJake Freelandwas configured with the
3088544651dSJake Freeland.Dv TFD_TIMER_CANCEL_ON_SET
3098544651dSJake Freelandflag, and the system realtime clock experienced a discontinuous change.
3108544651dSJake Freeland.It Bq Er EINVAL
3118544651dSJake FreelandThe size of the read buffer is not large enough to hold the
3128544651dSJake Freeland.Vt uint64_t
3138544651dSJake Freelandsized timer expiration counter.
3148544651dSJake Freeland.El
3158544651dSJake Freeland.Sh SEE ALSO
3168544651dSJake Freeland.Xr eventfd 2 ,
3178544651dSJake Freeland.Xr kqueue 2 ,
3188544651dSJake Freeland.Xr poll 2 ,
3198544651dSJake Freeland.Xr read 2 ,
3208544651dSJake Freeland.Xr timer_create 2 ,
3218544651dSJake Freeland.Xr timer_gettime 2 ,
3228544651dSJake Freeland.Xr timer_settime 2
3238544651dSJake Freeland.Sh STANDARDS
3248544651dSJake FreelandThe
3258544651dSJake Freeland.Nm
3268544651dSJake Freelandsystem calls originated from Linux and are non-standard.
3278544651dSJake Freeland.Sh HISTORY
3288544651dSJake Freeland.An -nosplit
3298544651dSJake FreelandThe
3308544651dSJake Freeland.Nm
3318544651dSJake Freelandfacility was originally ported to
3328544651dSJake Freeland.Fx Ns 's
3338544651dSJake FreelandLinux compatibility layer by
3348544651dSJake Freeland.An Dmitry Chagin Aq Mt [email protected]
3358544651dSJake Freelandin
3368544651dSJake Freeland.Fx 12.0 .
3378544651dSJake FreelandIt was revised and adapted to be native by
3388544651dSJake Freeland.An Jake Freeland Aq Mt [email protected]
3398544651dSJake Freelandin
3408544651dSJake Freeland.Fx 14.0 .
341