linux timerfd_create说明简单翻译

linux timerfd说明简单翻译

        #include <sys/timerfd.h>
       int timerfd_create(int clockid, int flags);
       int timerfd_settime(int fd, int flags,
                           const struct itimerspec *new_value,
                           struct itimerspec *old_value);
       int timerfd_gettime(int fd, struct itimerspec *curr_value);   

是一系列定时器相关的api不同的是是通过文件描述符来通知定时器是否到期的,
难免让人想起那句老话,linux中一切皆文件.
通过文件描述符的读写状态表明是否有事件到达,则可以搭配select, poll, 和 epoll食用;

timerfd_create()

创建一个 定时器对象, 并返回一个指向该对象的文件描述符. clockid 参数 限定了这个定时器使用的时钟类型,必须是 CLOCK_REALTIME 或者CLOCK_MONOTONIC. CLOCK_REALTIME是一个可设置的系统宽度始终. CLOCK_MONOTONIC不可设置的时钟不会受到系统时间变化的影响 (e.g., 人为的改变系统时间). 通过clock_gettime可以获取这些时钟的当前值.
从 Linux 2.6.27开始,下列的值可以位或到 flags参数以控制timerfd_create()行为:
TFD_NONBLOCK设置O_NONBLOCK文件状态标志在返回的这个新文件描述符. 使用fcntl可以获得一样的效果.
TFD_CLOEXEC 设置close-on-exec (FD_CLOEXEC) 标志 到文件描述符.参见fopen中的O_CLOEXEC标志说明看看有什么用途.
I在Linux versions up to and including 2.6.26, flags必须是0.

timerfd_settime()

   timerfd_settime() 启动 或 停止文件描述符指向的定时器.
   new_value参数指定定时器初始的到期时间间隔和间隔.  这个参数是itimer结构体类型,包含两个成员, 这两个成员都是结构体类型
         timespec:
           struct timespec {
               time_t tv_sec;                /* 秒 */
               long   tv_nsec;               /* 纳秒 */
           };
           struct itimerspec {
               struct timespec it_interval;  /* 周期性间隔 */
               struct timespec it_value;     /* 初始到期时间 */
           }; 
   new_value.it_value 指定定时器初始到期时间, 以秒和纳秒计. 设置new_value.it_value两者中任意一个 为非零即唤醒定时器. 设置new_value.it_value中的两者都为0停止该定时器.
   设置new_value.it_interval的一个或者两个成员都为非零值会指定间隔,以秒和纳秒计, 对于循环定时器到期在初始到期时间之后. 如果new_value.it_interval两个成员都是0, 定时器只会到期一次, 在new_value.it_value指定的时间点.

   flags参数为0时,会启动相对定时器 (new_value.it_value指定一个相对时间相对于clockid指定的时钟的当前值), 当设为TFD_TIMER_ABSTIME时, 会启动
   一个绝对定时器(new_value.it_value指定一个绝对时间相对于clockid指定的时钟的当前值;就是,这个定时器timer会到期当这个时钟的值到达value在new_value.it_value中指定的时间).

   如果old_value参数非NULL,itimerspec结构体指向是用来返回该定时器的设置在当前时间的调用时的; 查看timerfd_gettime()描述.

timerfd_gettime()

   timerfd_gettime() 返回, 在curr_value, 一个 itimerspec 结构包含当前定时器指向的文件描述符.

   it_value成员返回下一次到期的定时器数量.如果它的两个成员都是0, 该定时器当前会被停止. 这个成员总是包含一个相对值,对于不管是TFD_TIMER_ABSTIME 标志设置的定时器或者不是.

   it_interval 成员返回定时器间隔. 如果它的两个成员都是0,定时器会被设置为只会到期一次,在curr_value.it_value指定的时间点.

可以对时间文件描述符进行的操作:

   timerfd_create()返回的文件描述符支持以下操作:
read
          如果定时器已经到期一次或者多次自从它的设置最后一次被用timerfd_settime()修改, 或者自从最后一次成功的读, 之后buffer被设为可读返回一个
          无符号8字节整数(uint64_t)包含一个数字表示总到期次数.  ( 这个返回值是主机序, 即为当前机器的大小端顺序.)
          如果没有定时器到期过在这次读的时间点之前,那么这次调用会阻塞直到定时器到期,或者返回直接返回失败并设置错误码为EAGAIN如果该文件描述符是非阻塞的(通过使用fcntl F_SETFL操作设置O_NONBLOCK标志).

          一次读会失败以错误EINVAL, 如果提供的buffer大小小于8字节.
poll, select 或者 相似的
          这个文件描述符是可读的 (select的readfds 参数; poll的POLLIN 标志)如果一次或者多次定时器到期发生.

          这个文件描述符同样支持其他文件描述符操作APIs: pselect, ppoll, 和 epoll.
ioctl
         下列 timerfd-限定的指令被支持:
          TFD_IOC_SET_TICKS (从Linux 3.17开始)
                 调整定时器已经到期的计数值.  参数是一个指向一个非0 8字节整数的指针 (uint64_t*) 包含新的到期值数字. 一旦这个数字被设置, 任何这个定时器的等待会被唤醒. 这个命令的唯一目的是重新设置到期计数以checkpoint/restore. 这个操作可以使用仅仅如果内核被设置了 CONFIG_CHECKPOINT_RESTORE选项.
close
          当这个文件描述符不再被需要时,它需要被关闭.  当所有相关的文件描述符连接到同一个定时器对象的都被关闭,该定时器被挂起并且它的资源被内核回收.
fork 后的语义
   在一个fork之后, 子进程继承了这个文件描述符的副本,前面使用timerfd_create()创建的. 复制后的文件描述符指向同一个定时器对象, 并且在子进程中读会返回定时器到期数.
execve 下的语义
   一个用timerfd_create()创建的文件描述符会被保持通过execve, 并继续产生定时器到期如果定时器是启动的.
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值