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