18544651dSJake Freeland.\" SPDX-License-Identifier: BSD-2-Clause 28544651dSJake Freeland.\" 38544651dSJake Freeland.\" Copyright (c) 2023 Jake Freeland <jfree@FreeBSD.org> 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.\" 26*172328c4SCormac Stephenson.Dd June 28, 2024 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. 98*172328c4SCormac Stephenson.It Dv CLOCK_BOOTTIME 998544651dSJake Freeland.It Dv CLOCK_MONOTONIC 1008544651dSJake FreelandIncrements monotonically in SI seconds. 101*172328c4SCormac Stephenson.It Dv CLOCK_UPTIME 102*172328c4SCormac StephensonIncrements monotonically in SI seconds, but is paused while the system is 103*172328c4SCormac Stephensonsuspended. 1048544651dSJake Freeland.El 105*172328c4SCormac StephensonSee 106*172328c4SCormac Stephenson.Xr clock_gettime 2 107*172328c4SCormac Stephensonfor more precise definitions. 1088544651dSJake Freeland.Pp 1098544651dSJake FreelandThe 1108544651dSJake Freeland.Fa flags 1118544651dSJake Freelandargument may contain the result of 1128544651dSJake Freeland.Em or Ns 'ing 1138544651dSJake Freelandthe following values: 1148544651dSJake Freeland.Pp 1158544651dSJake Freeland.Bl -tag -width "Dv TFD_NONBLOCK" -compact 1168544651dSJake Freeland.It Dv TFD_CLOEXEC 1178544651dSJake FreelandThe newly generated file descriptor will close-on-exec. 1188544651dSJake Freeland.It Dv TFD_NONBLOCK 1198544651dSJake FreelandDo not block on read/write operations. 1208544651dSJake Freeland.El 1218544651dSJake Freeland.It Fn timerfd_gettime 1228544651dSJake FreelandRetrieve the current state of the timer denoted by 1238544651dSJake Freeland.Fa fd . 1248544651dSJake FreelandThe result is stored in 1258544651dSJake Freeland.Fa curr_value 1268544651dSJake Freelandas a 1278544651dSJake Freeland.Dv struct itimerspec . 1288544651dSJake FreelandThe 1298544651dSJake Freeland.Fa it_value 1308544651dSJake Freelandand 1318544651dSJake Freeland.Fa it_interval 1328544651dSJake Freelandmembers of 1338544651dSJake Freeland.Fa curr_value 1348544651dSJake Freelandrepresent the relative time until the next expiration and the interval 1358544651dSJake Freelandreload value last set by 1368544651dSJake Freeland.Fn timerfd_settime , 1378544651dSJake Freelandrespectively. 1388544651dSJake Freeland.It Fn timerfd_settime 1398544651dSJake FreelandUpdate the timer denoted by 1408544651dSJake Freeland.Fa fd 1418544651dSJake Freelandwith the 1428544651dSJake Freeland.Dv struct itimerspec 1438544651dSJake Freelandin 1448544651dSJake Freeland.Fa new_value . 1458544651dSJake FreelandThe 1468544651dSJake Freeland.Fa it_value 1478544651dSJake Freelandmember of 1488544651dSJake Freeland.Fa new_value 1498544651dSJake Freelandshould contain the amount of time before the timer expires, or zero if the 1508544651dSJake Freelandtimer should be disarmed. 1518544651dSJake FreelandThe 1528544651dSJake Freeland.Fa it_interval 1538544651dSJake Freelandmember should contain the reload time if an interval timer is desired. 1548544651dSJake Freeland.Pp 1558544651dSJake FreelandThe previous timer state will be stored in 1568544651dSJake Freeland.Fa old_value 1578544651dSJake Freelandgiven 1588544651dSJake Freeland.Fa old_value 1598544651dSJake Freelandis not 1608544651dSJake Freeland.Dv NULL . 1618544651dSJake Freeland.Pp 1628544651dSJake FreelandThe 1638544651dSJake Freeland.Fa flags 1648544651dSJake Freelandargument may contain the result of 1658544651dSJake Freeland.Em or Ns 'ing 1668544651dSJake Freelandthe following values: 1678544651dSJake Freeland.Pp 1688544651dSJake Freeland.Bl -tag -width TFD_TIMER_CANCEL_ON_SET -compact 1698544651dSJake Freeland.It Dv TFD_TIMER_ABSTIME 1708544651dSJake FreelandExpiration will occur at the absolute time provided in 1718544651dSJake Freeland.Fa new_value . 1728544651dSJake FreelandNormally, 1738544651dSJake Freeland.Fa new_value 1748544651dSJake Freelandrepresents a relative time compared to the timer's 1758544651dSJake Freeland.Fa clockid 1768544651dSJake Freelandclock. 1778544651dSJake Freeland.It Dv TFD_TIMER_CANCEL_ON_SET 1788544651dSJake FreelandIf 1798544651dSJake Freeland.Fa clockid 1808544651dSJake Freelandhas been set to 1818544651dSJake Freeland.Dv CLOCK_REALTIME 1828544651dSJake Freelandand the realtime clock has experienced a discontinuous jump, 1838544651dSJake Freelandthen the timer will be canceled and the next 1848544651dSJake Freeland.Xr read 2 1858544651dSJake Freelandwill fail with 1868544651dSJake Freeland.Dv ECANCELED . 1878544651dSJake Freeland.El 1888544651dSJake Freeland.El 1898544651dSJake Freeland.Pp 1908544651dSJake FreelandFile operations have the following semantics: 1918544651dSJake Freeland.Bl -tag -width ioctl 1928544651dSJake Freeland.It Xr read 2 1938544651dSJake FreelandTransfer the number of timer expirations that have occurred since the last 1948544651dSJake Freelandsuccessful 1958544651dSJake Freeland.Xr read 2 1968544651dSJake Freelandor 1978544651dSJake Freeland.Fn timerfd_settime 1988544651dSJake Freelandinto the output buffer of size 1998544651dSJake Freeland.Vt uint64_t . 2008544651dSJake FreelandIf the expiration counter is zero, 2018544651dSJake Freeland.Xr read 2 2028544651dSJake Freelandblocks until a timer expiration occurs unless 2038544651dSJake Freeland.Dv TFD_NONBLOCK 2048544651dSJake Freelandis set, where 2058544651dSJake Freeland.Dv EAGAIN 2068544651dSJake Freelandis returned. 2078544651dSJake Freeland.It Xr poll 2 2088544651dSJake FreelandThe file descriptor is readable when its timer expiration counter is greater 2098544651dSJake Freelandthan zero. 2108544651dSJake Freeland.It Xr ioctl 2 2118544651dSJake Freeland.Bl -tag -width FIONREAD 2128544651dSJake Freeland.It Dv FIOASYNC int 2138544651dSJake FreelandA non-zero input will set the FASYNC flag. 2148544651dSJake FreelandA zero input will clear the FASYNC flag. 2158544651dSJake Freeland.It Dv FIONBIO int 2168544651dSJake FreelandA non-zero input will set the FNONBLOCK flag. 2178544651dSJake FreelandA zero input will clear the FNONBLOCK flag. 2188544651dSJake Freeland.El 2198544651dSJake Freeland.El 2208544651dSJake Freeland.Sh RETURN VALUES 2218544651dSJake FreelandThe 2228544651dSJake Freeland.Fn timerfd_create 2238544651dSJake Freelandsystem call creates a 2248544651dSJake Freeland.Nm 2258544651dSJake Freelandobject and returns its file descriptor. 2268544651dSJake FreelandIf an error occurs, -1 is returned and the global variable 2278544651dSJake Freeland.Fa errno 2288544651dSJake Freelandis set to indicate the error. 2298544651dSJake Freeland.Pp 2308544651dSJake FreelandThe 2318544651dSJake Freeland.Fn timerfd_gettime 2328544651dSJake Freelandand 2338544651dSJake Freeland.Fn timerfd_settime 2348544651dSJake Freelandsystem calls return 0 on success. 2358544651dSJake FreelandIf an error occurs, -1 is returned and the global variable 2368544651dSJake Freeland.Fa errno 2378544651dSJake Freelandis set to indicate the error. 2388544651dSJake Freeland.Sh ERRORS 2398544651dSJake FreelandThe 2408544651dSJake Freeland.Fn timerfd_create 2418544651dSJake Freelandsystem call fails if: 2428544651dSJake Freeland.Bl -tag -width Er 2438544651dSJake Freeland.It Bq Er EINVAL 2448544651dSJake FreelandThe specified 2458544651dSJake Freeland.Fa clockid 2468544651dSJake Freelandis not supported. 2478544651dSJake Freeland.It Bq Er EINVAL 2488544651dSJake FreelandThe provided 2498544651dSJake Freeland.Fa flags 2508544651dSJake Freelandare invalid. 2518544651dSJake Freeland.It Bq Er EMFILE 2528544651dSJake FreelandThe per-process descriptor table is full. 2538544651dSJake Freeland.It Bq Er ENFILE 2548544651dSJake FreelandThe system file table is full. 2558544651dSJake Freeland.It Bq Er ENOMEM 2568544651dSJake FreelandThe kernel failed to allocate enough memory for the timer. 2578544651dSJake Freeland.El 2588544651dSJake Freeland.Pp 2598544651dSJake FreelandBoth 2608544651dSJake Freeland.Fn timerfd_gettime 2618544651dSJake Freelandand 2628544651dSJake Freeland.Fn timerfd_settime 2638544651dSJake Freelandsystem calls fail if: 2648544651dSJake Freeland.Bl -tag -width Er 2658544651dSJake Freeland.It Bq Er EBADF 2668544651dSJake FreelandThe provided 2678544651dSJake Freeland.Fa fd 2688544651dSJake Freelandis invalid. 2698544651dSJake Freeland.It Bq Er EFAULT 2708544651dSJake FreelandThe addresses provided by 2718544651dSJake Freeland.Fa curr_value , 2728544651dSJake Freeland.Fa new_value , 2738544651dSJake Freelandor 2748544651dSJake Freeland.Fa old_value 2758544651dSJake Freelandare invalid. 2768544651dSJake Freeland.It Bq Er EINVAL 2778544651dSJake FreelandThe provided 2788544651dSJake Freeland.Fa fd 2798544651dSJake Freelandis valid, but was not generated by 2808544651dSJake Freeland.Fn timerfd_create . 2818544651dSJake Freeland.El 2828544651dSJake Freeland.Pp 2838544651dSJake FreelandThe following errors only apply to 2848544651dSJake Freeland.Fn timerfd_settime : 2858544651dSJake Freeland.Bl -tag -width Er 2868544651dSJake Freeland.It Bq Er EINVAL 2878544651dSJake FreelandThe provided 2888544651dSJake Freeland.Fa flags 2898544651dSJake Freelandare invalid. 2908544651dSJake Freeland.It Bq Er EINVAL 2918544651dSJake FreelandA nanosecond field in the 2928544651dSJake Freeland.Fa new_value 2938544651dSJake Freelandargument specified a value less than zero, or greater than or equal to 10^9. 2948544651dSJake Freeland.It Bq Er ECANCELED 2958544651dSJake FreelandThe timer was created with the clock ID 2968544651dSJake Freeland.Dv CLOCK_REALTIME , 2978544651dSJake Freelandwas configured with the 2988544651dSJake Freeland.Dv TFD_TIMER_CANCEL_ON_SET 2998544651dSJake Freelandflag, and the system realtime clock experienced a discontinuous change without 3008544651dSJake Freelandbeing read. 3018544651dSJake Freeland.El 3028544651dSJake Freeland.Pp 3038544651dSJake FreelandA read from a 3048544651dSJake Freeland.Nm 3058544651dSJake Freelandobject fails if: 3068544651dSJake Freeland.Bl -tag -width Er 3078544651dSJake Freeland.It Bq Er EAGAIN 3088544651dSJake FreelandThe timer's expiration counter is zero and the 3098544651dSJake Freeland.Nm 310bbef63ecSGordon Berglingobject is set for non-blocking I/O. 3118544651dSJake Freeland.It Bq Er ECANCELED 3128544651dSJake FreelandThe timer was created with the clock ID 3138544651dSJake Freeland.Dv CLOCK_REALTIME , 3148544651dSJake Freelandwas configured with the 3158544651dSJake Freeland.Dv TFD_TIMER_CANCEL_ON_SET 3168544651dSJake Freelandflag, and the system realtime clock experienced a discontinuous change. 3178544651dSJake Freeland.It Bq Er EINVAL 3188544651dSJake FreelandThe size of the read buffer is not large enough to hold the 3198544651dSJake Freeland.Vt uint64_t 3208544651dSJake Freelandsized timer expiration counter. 3218544651dSJake Freeland.El 3228544651dSJake Freeland.Sh SEE ALSO 3238544651dSJake Freeland.Xr eventfd 2 , 3248544651dSJake Freeland.Xr kqueue 2 , 3258544651dSJake Freeland.Xr poll 2 , 3268544651dSJake Freeland.Xr read 2 , 3278544651dSJake Freeland.Xr timer_create 2 , 3288544651dSJake Freeland.Xr timer_gettime 2 , 3298544651dSJake Freeland.Xr timer_settime 2 3308544651dSJake Freeland.Sh STANDARDS 3318544651dSJake FreelandThe 3328544651dSJake Freeland.Nm 3338544651dSJake Freelandsystem calls originated from Linux and are non-standard. 3348544651dSJake Freeland.Sh HISTORY 3358544651dSJake Freeland.An -nosplit 3368544651dSJake FreelandThe 3378544651dSJake Freeland.Nm 3388544651dSJake Freelandfacility was originally ported to 3398544651dSJake Freeland.Fx Ns 's 3408544651dSJake FreelandLinux compatibility layer by 3418544651dSJake Freeland.An Dmitry Chagin Aq Mt dchagin@FreeBSD.org 3428544651dSJake Freelandin 3438544651dSJake Freeland.Fx 12.0 . 3448544651dSJake FreelandIt was revised and adapted to be native by 3458544651dSJake Freeland.An Jake Freeland Aq Mt jfree@FreeBSD.org 3468544651dSJake Freelandin 3478544651dSJake Freeland.Fx 14.0 . 348