POSIX 可移植
POSIX:可移植操作系统接口(Portable Operating System Interface of UNIX,缩写为 POSIX 。
POSIX Timer C API
总结POSIX系统的C标准库:
函数 | 描述 |
---|---|
clock_settime() | 通过指定Value设置clock的分辨率 |
clock_gettime() | 获取时钟值 |
timer_settime() | 设置和装备或者解除一个定时器 |
timer_gettime() | |
timer_create() | 创建一个POSIX预处理的定时器 |
timer_delete() | 删除一个定时器 |
clock_getres() | 获取时钟分辨率 |
timer_getoverrun() | 获取当前超时的定时器的计数 |
nanosleep() | 高分辨率延时当前线程 |
timer_create()
创建一个POSIX预处理的定时器。
语法
#include <signal.h>
#include <time.h>
描述
timer_create()创建一个新的间隔预处理定时器。参数timerid在一个buffer指针返回一个型的定时器ID,必定是一个非空的指针。ID在进程里是唯一的,直到定时器被清除。新的定时器是初始化解除的。
clockid参数指定新的定时器时钟去测量定时。它能够指定下述其中一个值:
参数值 | 描述 |
---|---|
CLOCK_REALTIME | 一个可设置的系统级的实时时钟。 |
CLOCK_MONO | |
clock_settime()和clock_settime()
时钟和时间函数
语法
#include <time.h>
int clock_getres(clockid_t clk_id, struct timespec *res);
int clock_gettime(clockid_t clk_id, struct timespec *tp);
int clock_settime(clockid_t clk_id, const struct timespec *tp);
描述
clock_getres()函数寻找指定时钟clk_id的分辨率。如果res不为NULL,通过res指针存储到结构timespec里。
时钟的分辨率取决于指定的进程执行,而不能通过配置。如果参数 tp 的 clock_settime() 指向的时间值不是 res 的倍数,则它将被截断为 res 的倍数。
setitimer定时器
getitimer和setitimer定时器 获取或者设置内部定时器的值。
语法
#include <sys/time.h>
int getitimer(int which, struct itimerval *curr_value);
int setitimer(int which, const struct itimerval *new_value,struct itimerval *old_value);
描述
这个系统调用提供访问内部定时器,并初始化一些点调用,和可调内部值。当定时器到期时,调用晶灰层产生一个信号,和定时器重置到指定的时间间隔。
指定三个类型定时器结果提供的参数,每个计数器不支持不同的时钟和当时钟到期,生成一个不同的信号:
which选项 | 描述 |
---|---|
ITIMER_REAL | 在real time(当前系统时间)下,定时器计数。在每个定时器到期时,生成一个SIGALRM信号。 |
ITIMER_VIRTUAL | 此计时器根据进程消耗的用户模式 CPU 时间进行倒计时,当每一个时间到期,产生一个SIGBTALRM信号。 |
ITIMER_PROF | 这个根据进程消耗总的(包括用户和系统)CPU时间进行倒计时。每个时间到期,产生一个SIGPROF信号。 |
一个进程只能有三种类型定时器其中的一种。若程序which选择ITIMER_REAL。 linux中的sleep、usleep、select、poll等函数的超时结果均也是使用的SIGALRM作为结束信号。若你的定时器按一定周期一直在发SIGALRM信号,那么以上几个函数均有极大可能被提前打断.
定时器的值定义通过下述结构体:
struct itimerval{
struct timeval it_interval; /* 周期性定时器的时间间隔 */
struct timeval it_value; /* 定时直到下一个周期为止 */
}
struct tiemval{
time_t tv_sec; /* 秒 */
suseconds_t tv_usec; /* 微妙 */
}
settimer()
函数setitimer()装载或者解除通过指定的which定时器,通过设置new_value指定定时器值。如果old_value是non-NULL,buffer指向前先使用过的返回定时的值。如果两个场都是new_value.itval为0,定时器将被解除。
new_value.it_interval区域指定定时器的新的间隔值;如果两个子场都是零,定时器将一次生效。
返回值
成功返回0.错误返回-1,并适当设置errno.