Путеводитель по Руководству Linux

  User  |  Syst  |  Libr  |  Device  |  Files  |  Other  |  Admin  |  Head  |



   timerfd_settime    ( 2 )

таймеры, которые уведомляют через файловые дескрипторы (timers that notify via file descriptors)

  Name  |  Synopsis  |  Description  |  Return value  |  Error  |  Versions  |  Conforming to  |  Note  |  Bugs  |    Examples    |  See also  |

Примеры (Examples)

The following program creates a timer and then monitors its
       progress.  The program accepts up to three command-line
       arguments.  The first argument specifies the number of seconds
       for the initial expiration of the timer.  The second argument
       specifies the interval for the timer, in seconds.  The third
       argument specifies the number of times the program should allow
       the timer to expire before terminating.  The second and third
       command-line arguments are optional.

The following shell session demonstrates the use of the program:

$ a.out 3 1 100 0.000: timer started 3.000: read: 1; total=1 4.000: read: 1; total=2 ^Z # type control-Z to suspend the program [1]+ Stopped ./timerfd3_demo 3 1 100 $ fg # Resume execution after a few seconds a.out 3 1 100 9.660: read: 5; total=7 10.000: read: 1; total=8 11.000: read: 1; total=9 ^C # type control-C to suspend the program

Program source

#include <sys/timerfd.h> #include <time.h> #include <unistd.h> #include <inttypes.h> /* Definition of PRIu64 */ #include <stdlib.h> #include <stdio.h> #include <stdint.h> /* Definition of uint64_t */

#define handle_error(msg) \ do { perror(msg); exit(EXIT_FAILURE); } while (0)

static void print_elapsed_time(void) { static struct timespec start; struct timespec curr; static int first_call = 1; int secs, nsecs;

if (first_call) { first_call = 0; if (clock_gettime(CLOCK_MONOTONIC, &start) == -1) handle_error("clock_gettime"); }

if (clock_gettime(CLOCK_MONOTONIC, &curr) == -1) handle_error("clock_gettime");

secs = curr.tv_sec - start.tv_sec; nsecs = curr.tv_nsec - start.tv_nsec; if (nsecs < 0) { secs--; nsecs += 1000000000; } printf("%d.%03d: ", secs, (nsecs + 500000) / 1000000); }

int main(int argc, char *argv[]) { struct itimerspec new_value; int max_exp, fd; struct timespec now; uint64_t exp, tot_exp; ssize_t s;

if ((argc != 2) && (argc != 4)) { fprintf(stderr, "%s init-secs [interval-secs max-exp]\n", argv[0]); exit(EXIT_FAILURE); }

if (clock_gettime(CLOCK_REALTIME, &now) == -1) handle_error("clock_gettime");

/* Create a CLOCK_REALTIME absolute timer with initial expiration and interval as specified in command line. */

new_value.it_value.tv_sec = now.tv_sec + atoi(argv[1]); new_value.it_value.tv_nsec = now.tv_nsec; if (argc == 2) { new_value.it_interval.tv_sec = 0; max_exp = 1; } else { new_value.it_interval.tv_sec = atoi(argv[2]); max_exp = atoi(argv[3]); } new_value.it_interval.tv_nsec = 0;

fd = timerfd_create(CLOCK_REALTIME, 0); if (fd == -1) handle_error("timerfd_create");

if (timerfd_settime(fd, TFD_TIMER_ABSTIME, &new_value, NULL) == -1) handle_error("timerfd_settime");

print_elapsed_time(); printf("timer started\n");

for (tot_exp = 0; tot_exp < max_exp;) { s = read(fd, &exp, sizeof(uint64_t)); if (s != sizeof(uint64_t)) handle_error("read");

tot_exp += exp; print_elapsed_time(); printf("read: %" PRIu64 "; total=%" PRIu64 "\n", exp, tot_exp); }

exit(EXIT_SUCCESS); }