linux定时器

linux定时器

  • Timerfd ---定时器 fd 类型
    • 一、创建定时器
    • 二、启动和停止定时器
    • 三、获取定时器及剩余时间
    • 三、关闭定时器

Timerfd —定时器 fd 类型

  timerfd是linux提供的定时器机制,基于文件描述符,定时器精度最高可达纳秒级别,可以利用 select()、poll()和 epoll()对 timerfd 文件描述符进行监控。如果定时器到期,会将对应的文件描述符标记为可读。接口包括定时器创建、启动定时器、关闭定时器和删除定时器。头文件#include

  调用 fork()期间,子进程会继承 timerfd_create()所创建文件描述符的拷贝。这些描述符与父进程的对应描述符均指代相同的定时器对象,任一进程都可读取定时器的到期信息。timerfd_create()创建的文件描述符能跨越 exec()得以保存(除非将描述符置为运行时关闭),已配备的定时器在 exec()之后会继续生成到期通知

一、创建定时器

int timerfd_create(int clockid, int flags)

 * 功能 : 创建定时器
 * 返回值:成功返回定时器文件描述符,失败返回-1 
 * clockid:可以是CLOCK_REALTIME(实时时钟)或者CLOCK_MONOTONIC(递增时钟),实时时钟可以被系统时间改变,后者不会。
 如果这里使用实时时钟,当手动更改系统时间定时器也会受影响,而递增时钟则只受设置的时间值影响。
 * flags : 最初实现将参数 flags 预留供未来使用,必须设置为 0;内核从 2.6.27可选项包括TFD_NONBLOCK(非阻塞)和TFD_CLOEXEC
 TFD_CLOEXEC 
	为新的文件描述符设置运行时关闭标志(FD_CLOEXEC)。与 open()标志O_CLOEXEC 适用于相同情况。
TFD_NONBLOCK 
	为底层的打开文件描述设置 O_NONBLOCK 标志,随后的读操作将是非阻塞式的。这样
设置省却了对 fcntl()的额外调用,却能达到相同效果
    阻塞指的是当定时器未超时的时候,如果调用read(timerfd)会阻塞直到定时器超时,如果设置TFD_NONLOCK,则会直接返回并返回-1

  timerfd_create()创建的定时器使用完毕后,应调用 close()关闭相应的文件描述符,以便于
内核能够释放与定时器相关的资源。系统调用 timerfd_settime()可以配备(启动)或解除(停止)由文件描述符 fd 所指代的定时器

二、启动和停止定时器

int timerfd_settime(int fd, int flags, const struct itimerspec *new_value, struct itimerspec *old_value);

 * 功能 定时器启动和关闭
 *    返回值 : 成功返回0,失败返回-1,并存储错误码到errno
 *    fd    : 定时器描述符
 *    flags : 0 或者TFD_TIMER_ABSTIME,0代表相对时间,即相对于当前时间多少,后者是绝对时间。
 * new_value: 为定时器指定新设置。
 		      new_value.it_value非0时,用于设置定时器第一次超时时间,0代表停止定时器
        	  new_value.it_interval:表示第一次超时后下一次超时的时间,为0代表定时器只超时一次
 *old_value: 如果不为NULL,返回定时器的前一设置。


struct timespec {
    time_t tv_sec;                /* Seconds */
    long   tv_nsec;               /* Nanoseconds */
};

struct itimerspec {
    struct timespec it_interval;  /* Interval for periodic timer */
    struct timespec it_value;     /* Initial expiration */
};

三、获取定时器及剩余时间

int timerfd_gettime(int fd, struct itimerspec *curr_value)

* 功能 获取定时fd所标识定时器的时间间隔以及距离下次定时器到期的
时间
* 返回值 : 0成功 -1失败
* curr_value:间隔以及距离下次到期的时间
             curr_value.it_value 中所有字段值均为 0,那么该定时器已经被解除。否则返回是距离定时器下次到期的时间值。
             curr_value.it_interval 中两字段值均为 0,那么定时器只会到期一次,到期时间在 curr_value.it_value 中给出

三、关闭定时器

*
 * 功能: 和普通描述符一样,用完后使用close释放
 * 参数:timerfd为timerfd_create()创建的定时器描述符
 */
close(timerfd);

你可能感兴趣的:(linux,linux)