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