1 .\" Copyright (C) 2008 Michael Kerrisk <mtk.manpages@gmail.com>
3 .\" SPDX-License-Identifier: GPL-2.0-or-later
5 .TH timerfd_create 2 (date) "Linux man-pages (unreleased)"
7 timerfd_create, timerfd_settime, timerfd_gettime \-
8 timers that notify via file descriptors
11 .RI ( libc ", " \-lc )
14 .B #include <sys/timerfd.h>
16 .BI "int timerfd_create(int " clockid ", int " flags );
18 .BI "int timerfd_settime(int " fd ", int " flags ,
19 .BI " const struct itimerspec *" new_value ,
20 .BI " struct itimerspec *_Nullable " old_value );
21 .BI "int timerfd_gettime(int " fd ", struct itimerspec *" curr_value );
24 These system calls create and operate on a timer
25 that delivers timer expiration notifications via a file descriptor.
26 They provide an alternative to the use of
30 with the advantage that the file descriptor may be monitored by
36 The use of these three system calls is analogous to the use of
38 .BR timer_settime (2),
40 .BR timer_gettime (2).
41 (There is no analog of
42 .BR timer_getoverrun (2),
43 since that functionality is provided by
49 creates a new timer object,
50 and returns a file descriptor that refers to that timer.
53 argument specifies the clock that is used to mark the progress
54 of the timer, and must be one of the following:
57 A settable system-wide real-time clock.
60 A nonsettable monotonically increasing clock that measures time
61 from some unspecified point in the past that does not change
64 .BR CLOCK_BOOTTIME " (Since Linux 3.15)"
65 .\" commit 4a2378a943f09907fb1ae35c15de917f60289c14
68 this is a monotonically increasing clock.
71 clock does not measure the time while a system is suspended, the
73 clock does include the time during which the system is suspended.
74 This is useful for applications that need to be suspend-aware.
76 is not suitable for such applications, since that clock is affected
77 by discontinuous changes to the system clock.
79 .BR CLOCK_REALTIME_ALARM " (since Linux 3.11)"
80 .\" commit 11ffa9d6065f344a9bd769a2452f26f2f671e5f8
83 but will wake the system if it is suspended.
84 The caller must have the
86 capability in order to set a timer against this clock.
88 .BR CLOCK_BOOTTIME_ALARM " (since Linux 3.11)"
89 .\" commit 11ffa9d6065f344a9bd769a2452f26f2f671e5f8
92 but will wake the system if it is suspended.
93 The caller must have the
95 capability in order to set a timer against this clock.
99 for some further details on the above clocks.
101 The current value of each of these clocks can be retrieved using
102 .BR clock_gettime (2).
104 Starting with Linux 2.6.27, the following values may be bitwise ORed in
106 to change the behavior of
107 .BR timerfd_create ():
112 file status flag on the open file description (see
114 referred to by the new file descriptor.
115 Using this flag saves extra calls to
117 to achieve the same result.
120 Set the close-on-exec
122 flag on the new file descriptor.
123 See the description of the
127 for reasons why this may be useful.
129 In Linux versions up to and including 2.6.26,
131 must be specified as zero.
132 .SS timerfd_settime()
133 .BR timerfd_settime ()
134 arms (starts) or disarms (stops)
135 the timer referred to by the file descriptor
140 argument specifies the initial expiration and interval for the timer.
143 structure used for this argument is described in
144 .BR itimerspec (3type).
146 .I new_value.it_value
147 specifies the initial expiration of the timer,
148 in seconds and nanoseconds.
149 Setting either field of
150 .I new_value.it_value
151 to a nonzero value arms the timer.
152 Setting both fields of
153 .I new_value.it_value
154 to zero disarms the timer.
156 Setting one or both fields of
157 .I new_value.it_interval
158 to nonzero values specifies the period, in seconds and nanoseconds,
159 for repeated timer expirations after the initial expiration.
161 .I new_value.it_interval
162 are zero, the timer expires just once, at the time specified by
163 .IR new_value.it_value .
166 the initial expiration time specified in
168 is interpreted relative to the current time
169 on the timer's clock at the time of the call (i.e.,
170 .I new_value.it_value
171 specifies a time relative to the current value of the clock specified by
173 An absolute timeout can be selected via the
179 argument is a bit mask that can include the following values:
183 .I new_value.it_value
184 as an absolute value on the timer's clock.
185 The timer will expire when the value of the timer's
186 clock reaches the value specified in
187 .IR new_value.it_value .
189 .B TFD_TIMER_CANCEL_ON_SET
190 If this flag is specified along with
192 and the clock for this timer is
195 .BR CLOCK_REALTIME_ALARM ,
196 then mark this timer as cancelable if the real-time clock
197 undergoes a discontinuous change
198 .RB ( settimeofday (2),
199 .BR clock_settime (2),
201 When such changes occur, a current or future
203 from the file descriptor will fail with the error
208 argument is not NULL, then the
210 structure that it points to is used to return the setting of the timer
211 that was current at the time of the call;
212 see the description of
213 .BR timerfd_gettime ()
216 .SS timerfd_gettime()
217 .BR timerfd_gettime ()
222 structure that contains the current setting of the timer
223 referred to by the file descriptor
228 field returns the amount of time
229 until the timer will next expire.
230 If both fields of this structure are zero,
231 then the timer is currently disarmed.
232 This field always contains a relative value, regardless of whether the
234 flag was specified when setting the timer.
238 field returns the interval of the timer.
239 If both fields of this structure are zero,
240 then the timer is set to expire just once, at the time specified by
241 .IR curr_value.it_value .
242 .SS Operating on a timer file descriptor
243 The file descriptor returned by
244 .BR timerfd_create ()
245 supports the following additional operations:
248 If the timer has already expired one or more times since
249 its settings were last modified using
250 .BR timerfd_settime (),
251 or since the last successful
253 then the buffer given to
255 returns an unsigned 8-byte integer
257 containing the number of expirations that have occurred.
258 (The returned value is in host byte order\[em]that is,
259 the native byte order for integers on the host machine.)
261 If no timer expirations have occurred at the time of the
263 then the call either blocks until the next timer expiration,
264 or fails with the error
266 if the file descriptor has been made nonblocking
278 if the size of the supplied buffer is less than 8 bytes.
280 If the associated clock is either
283 .BR CLOCK_REALTIME_ALARM ,
284 the timer is absolute
285 .RB ( TFD_TIMER_ABSTIME ),
287 .B TFD_TIMER_CANCEL_ON_SET
288 was specified when calling
289 .BR timerfd_settime (),
294 if the real-time clock undergoes a discontinuous change.
295 (This allows the reading application to discover
296 such discontinuous changes to the clock.)
298 If the associated clock is either
301 .BR CLOCK_REALTIME_ALARM ,
302 the timer is absolute
303 .RB ( TFD_TIMER_ABSTIME ),
305 .B TFD_TIMER_CANCEL_ON_SET
308 specified when calling
309 .BR timerfd_settime (),
310 then a discontinuous negative change to the clock (e.g.,
311 .BR clock_settime (2))
314 to unblock, but return a value of 0 (i.e., no bytes read),
315 if the clock change occurs after the time expired,
318 on the file descriptor.
325 The file descriptor is readable
333 if one or more timer expirations have occurred.
335 The file descriptor also supports the other file-descriptor
343 The following timerfd-specific command is supported:
346 .BR TFD_IOC_SET_TICKS " (since Linux 3.17)"
347 .\" commit 5442e9fbd7c23172a1c9bc736629cd123a9923f0
348 Adjust the number of timer expirations that have occurred.
349 The argument is a pointer to a nonzero 8-byte integer
351 containing the new number of expirations.
352 Once the number is set, any waiter on the timer is woken up.
353 The only purpose of this command is to restore the expirations
354 for the purpose of checkpoint/restore.
355 This operation is available only if the kernel was configured with the
356 .B CONFIG_CHECKPOINT_RESTORE
361 When the file descriptor is no longer required it should be closed.
362 When all file descriptors associated with the same timer object
364 the timer is disarmed and its resources are freed by the kernel.
366 .SS fork(2) semantics
369 the child inherits a copy of the file descriptor created by
370 .BR timerfd_create ().
371 The file descriptor refers to the same underlying
372 timer object as the corresponding file descriptor in the parent,
375 in the child will return information about
376 expirations of the timer.
378 .SS execve(2) semantics
379 A file descriptor created by
380 .BR timerfd_create ()
383 and continues to generate timer expirations if the timer was armed.
386 .BR timerfd_create ()
387 returns a new file descriptor.
388 On error, \-1 is returned and
390 is set to indicate the error.
392 .BR timerfd_settime ()
394 .BR timerfd_gettime ()
396 on error they return \-1, and set
398 to indicate the error.
400 .BR timerfd_create ()
401 can fail with the following errors:
411 or, in Linux 2.6.26 or earlier,
416 The per-process limit on the number of open file descriptors has been reached.
419 The system-wide limit on the total number of open files has been
423 Could not mount (internal) anonymous inode device.
426 There was insufficient kernel memory to create the timer.
431 .B CLOCK_REALTIME_ALARM
433 .B CLOCK_BOOTTIME_ALARM
434 but the caller did not have the
438 .BR timerfd_settime ()
440 .BR timerfd_gettime ()
441 can fail with the following errors:
445 is not a valid file descriptor.
452 is not a valid pointer.
456 is not a valid timerfd file descriptor.
458 .BR timerfd_settime ()
459 can also fail with the following errors:
466 is not properly initialized (one of the
468 falls outside the range zero to 999,999,999).
471 .\" This case only checked since Linux 2.6.29, and Linux 2.2.2[78].some-stable-version.
472 .\" In older kernel versions, no check was made for invalid flags.
481 Suppose the following scenario for
484 .B CLOCK_REALTIME_ALARM
485 timer that was created with
486 .BR timerfd_create ():
488 The timer has been started
489 .RB ( timerfd_settime ())
493 .B TFD_TIMER_CANCEL_ON_SET
496 A discontinuous change (e.g.,
497 .BR settimeofday (2))
498 is subsequently made to the
502 the caller once more calls
503 .BR timerfd_settime ()
504 to rearm the timer (without first doing a
506 on the file descriptor).
508 In this case the following occurs:
511 .BR timerfd_settime ()
516 (This enables the caller to know that the previous timer was affected
517 by a discontinuous change to the clock.)
520 .I "is successfully rearmed"
521 with the settings provided in the second
522 .BR timerfd_settime ()
524 (This was probably an implementation accident, but won't be fixed now,
525 in case there are applications that depend on this behaviour.)
529 .BR timerfd_create ()
530 supports fewer types of clock IDs than
531 .BR timer_create (2).
533 The following program creates a timer and then monitors its progress.
534 The program accepts up to three command-line arguments.
535 The first argument specifies the number of seconds for
536 the initial expiration of the timer.
537 The second argument specifies the interval for the timer, in seconds.
538 The third argument specifies the number of times the program should
539 allow the timer to expire before terminating.
540 The second and third command-line arguments are optional.
542 The following shell session demonstrates the use of the program:
546 .RB "$" " a.out 3 1 100"
548 3.000: read: 1; total=1
549 4.000: read: 1; total=2
550 .BR "\[ha]Z " " # type control\-Z to suspend the program"
551 [1]+ Stopped ./timerfd3_demo 3 1 100
552 .RB "$ " "fg" " # Resume execution after a few seconds"
554 9.660: read: 5; total=7
555 10.000: read: 1; total=8
556 11.000: read: 1; total=9
557 .BR "\[ha]C " " # type control\-C to suspend the program"
562 .\" SRC BEGIN (timerfd_create.c)
564 .\" The commented out code here is what we currently need until
565 .\" the required stuff is in glibc
568 .\"/* Link with \-lrt */
569 .\"#define _GNU_SOURCE
570 .\"#include <sys/syscall.h>
571 .\"#include <unistd.h>
573 .\"#if defined(__i386__)
574 .\"#define __NR_timerfd_create 322
575 .\"#define __NR_timerfd_settime 325
576 .\"#define __NR_timerfd_gettime 326
580 .\"timerfd_create(int clockid, int flags)
582 .\" return syscall(__NR_timerfd_create, clockid, flags);
586 .\"timerfd_settime(int fd, int flags, struct itimerspec *new_value,
587 .\" struct itimerspec *curr_value)
589 .\" return syscall(__NR_timerfd_settime, fd, flags, new_value,
594 .\"timerfd_gettime(int fd, struct itimerspec *curr_value)
596 .\" return syscall(__NR_timerfd_gettime, fd, curr_value);
599 .\"#define TFD_TIMER_ABSTIME (1 << 0)
601 .\"////////////////////////////////////////////////////////////
603 #include <inttypes.h>
606 #include <sys/timerfd.h>
611 print_elapsed_time(void)
614 static int first_call = 1;
615 struct timespec curr;
616 static struct timespec start;
620 if (clock_gettime(CLOCK_MONOTONIC, &start) == \-1)
621 err(EXIT_FAILURE, "clock_gettime");
624 if (clock_gettime(CLOCK_MONOTONIC, &curr) == \-1)
625 err(EXIT_FAILURE, "clock_gettime");
627 secs = curr.tv_sec \- start.tv_sec;
628 nsecs = curr.tv_nsec \- start.tv_nsec;
633 printf("%d.%03d: ", secs, (nsecs + 500000) / 1000000);
637 main(int argc, char *argv[])
641 uint64_t exp, tot_exp, max_exp;
643 struct itimerspec new_value;
645 if (argc != 2 && argc != 4) {
646 fprintf(stderr, "%s init\-secs [interval\-secs max\-exp]\en",
651 if (clock_gettime(CLOCK_REALTIME, &now) == \-1)
652 err(EXIT_FAILURE, "clock_gettime");
654 /* Create a CLOCK_REALTIME absolute timer with initial
655 expiration and interval as specified in command line. */
657 new_value.it_value.tv_sec = now.tv_sec + atoi(argv[1]);
658 new_value.it_value.tv_nsec = now.tv_nsec;
660 new_value.it_interval.tv_sec = 0;
663 new_value.it_interval.tv_sec = atoi(argv[2]);
664 max_exp = atoi(argv[3]);
666 new_value.it_interval.tv_nsec = 0;
668 fd = timerfd_create(CLOCK_REALTIME, 0);
670 err(EXIT_FAILURE, "timerfd_create");
672 if (timerfd_settime(fd, TFD_TIMER_ABSTIME, &new_value, NULL) == \-1)
673 err(EXIT_FAILURE, "timerfd_settime");
675 print_elapsed_time();
676 printf("timer started\en");
678 for (tot_exp = 0; tot_exp < max_exp;) {
679 s = read(fd, &exp, sizeof(uint64_t));
680 if (s != sizeof(uint64_t))
681 err(EXIT_FAILURE, "read");
684 print_elapsed_time();
685 printf("read: %" PRIu64 "; total=%" PRIu64 "\en", exp, tot_exp);
699 .BR timer_create (2),
700 .BR timer_gettime (2),
701 .BR timer_settime (2),