timerfd,
timerfd_create,
timerfd_gettime,
timerfd_settime — timers
with file descriptor semantics
Standard C Library (libc, -lc)
#include
<sys/timerfd.h>
int
timerfd_create(int clockid,
int flags);
int
timerfd_gettime(int fd,
struct itimerspec *curr_value);
int
timerfd_settime(int fd,
int flags, const struct itimerspec
*new_value, struct itimerspec *old_value);
The timerfd system calls operate on
timers, identified by special timerfd file
descriptors. These calls are analogous to
timer_create(),
timer_gettime(),
and
timer_settime()
per-process timer functions, but use a timerfd
descriptor in place of timerid.
All timerfd descriptors possess
traditional file descriptor semantics; they may be passed to other
processes, preserved across
fork(2),
and monitored via
kevent(2),
poll(2),
or
select(2).
When a timerfd descriptor is no longer needed, it
may be disposed of using
close(2).
timerfd_create()
- Initialize a
timerfd object and return its file
descriptor. The clockid argument specifies the clock
used as a timing base and may be:
CLOCK_REALTIME
- Increments as a wall clock should.
CLOCK_MONOTONIC
- Increments monotonically in SI seconds.
The flags argument may contain the
result of or'ing the following values:
TFD_CLOEXEC
- The newly generated file descriptor will close-on-exec.
TFD_NONBLOCK
- Do not block on read/write operations.
timerfd_gettime()
- Retrieve the current state of the timer denoted by
fd. The result is stored in
curr_value as a
struct
itimerspec. The it_value and
it_interval members of
curr_value represent the relative time until the
next expiration and the interval reload value last set by
timerfd_settime(), respectively.
timerfd_settime()
- Update the timer denoted by fd with the
struct itimerspec in
new_value. The it_value member
of new_value should contain the amount of time
before the timer expires, or zero if the timer should be disarmed. The
it_interval member should contain the reload time if
an interval timer is desired.
The previous timer state will be stored in
old_value given old_value is
not NULL.
The flags argument may contain the
result of or'ing the following values:
TFD_TIMER_ABSTIME
- Expiration will occur at the absolute time provided in
new_value. Normally,
new_value represents a relative time compared to
the timer's clockid clock.
TFD_TIMER_CANCEL_ON_SET
- If clockid has been set to
CLOCK_REALTIME and the realtime clock has
experienced a discontinuous jump, then the timer will be canceled and
the next
read(2)
will fail with ECANCELED.
File operations have the following semantics:
- read(2)
- Transfer the number of timer expirations that have occurred since the last
successful
read(2)
or
timerfd_settime()
into the output buffer of size uint64_t. If the
expiration counter is zero,
read(2)
blocks until a timer expiration occurs unless
TFD_NONBLOCK is set, where
EAGAIN is returned.
- poll(2)
- The file descriptor is readable when its timer expiration counter is
greater than zero.
- ioctl(2)
-
FIOASYNC
int
- A non-zero input will set the FASYNC flag. A zero input will clear the
FASYNC flag.
FIONBIO
int
- A non-zero input will set the FNONBLOCK flag. A zero input will clear
the FNONBLOCK flag.
The timerfd_create() system call creates a
timerfd object and returns its file descriptor. If
an error occurs, -1 is returned and the global variable
errno is set to indicate the error.
The timerfd_gettime() and
timerfd_settime() system calls return 0 on success.
If an error occurs, -1 is returned and the global variable
errno is set to indicate the error.
The timerfd_create() system call fails
if:
- [
EINVAL]
- The specified clockid is not supported.
- [
EINVAL]
- The provided flags are invalid.
- [
EMFILE]
- The per-process descriptor table is full.
- [
ENFILE]
- The system file table is full.
- [
ENOMEM]
- The kernel failed to allocate enough memory for the timer.
Both timerfd_gettime() and
timerfd_settime() system calls fail if:
- [
EBADF]
- The provided fd is invalid.
- [
EFAULT]
- The addresses provided by curr_value,
new_value, or old_value are
invalid.
- [
EINVAL]
- The provided fd is valid, but was not generated by
timerfd_create().
The following errors only apply to
timerfd_settime():
- [
EINVAL]
- The provided flags are invalid.
- [
EINVAL]
- A nanosecond field in the new_value argument
specified a value less than zero, or greater than or equal to 10^9.
- [
ECANCELED]
- The timer was created with the clock ID
CLOCK_REALTIME, was configured with the
TFD_TIMER_CANCEL_ON_SET flag, and the system
realtime clock experienced a discontinuous change without being read.
A read from a timerfd object fails if:
- [
EAGAIN]
- The timer's expiration counter is zero and the
timerfd object is set for non-blocking I/O.
- [
ECANCELED]
- The timer was created with the clock ID
CLOCK_REALTIME, was configured with the
TFD_TIMER_CANCEL_ON_SET flag, and the system
realtime clock experienced a discontinuous change.
- [
EINVAL]
- The size of the read buffer is not large enough to hold the
uint64_t sized timer expiration counter.
The timerfd system calls originated from
Linux and are non-standard.
The timerfd facility was originally ported
to FreeBSD's Linux compatibility layer by
Dmitry Chagin
<dchagin@FreeBSD.org>
in FreeBSD 12.0. It was revised and adapted to be
native by Jake Freeland
<jfree@FreeBSD.org>
in FreeBSD 14.0.