一、睡眠函数
Linux 下有 2 个睡眠函数,原型分别为:
#include <unistd.h>
unsigned int sleep(unsigned int seconds);
void usleep(unsigned long usec);
函数 sleep 让进程睡眠 seconds 秒,函数 usleep 让进程睡眠 usec 微秒。
sleep 睡眠函数内部是用信号机制进行处理的,用到的函数有:
#include <unistd.h>
unsigned int alarm(unsigned int seconds);//告知自身进程,要进程在 seconds 秒后自动产生一个 SIGALRM 信号
int pause(void);//将自身进程挂起,直到有信号发生时才从 pause 返回
注意:因为 sleep 在内部是用 alarm 实现的,所以在程序中最好不要 sleep 与 alarm 混用,以免造成混乱。
二、时钟处理
Linux 为每个进程维护 3 个计时器,分别是真实计时器、虚拟计时器和实用计时器。
- 真实计时器计算的是程序运行的实际时间;
- 虚拟计时器计算的是程序运行在用户态时所消耗的时间(可以认为是实际时间减掉系统调用和程序睡眠所消耗的时间);
- 实用计时器计算的是程序处于用户态和处于内核态所消耗的时间之和。
例如:一个程序在用户态运行了 5 秒,在内核态运行了 6 秒,还睡眠了 7 秒,则真实计时器计算的结果是 18 秒,虚拟计时器计算的是 5 秒,实用计时器计算的是 11 秒。
用指定的初始间隔和重复间隔时间为进程设定好一个计时器后,该计时器就会定时的向进程发送时钟信号。3 个计时器发送的时钟信号分别为:SIGALRM、SIGVTALRM 和 SIGPROF。
用到的函数与数据结构:
#include <sys/time.h>
int getitimer(int which, struct itimerval * value);//获取计时器的设置
参数 which 指定哪个计时器,可选项为 ITIMER_REAL(真实计时器)、ITIMER_VIRTUAL(虚拟计时器)、ITIMER_PROF(实用计时器)。
参数 value 为一结构体的传出参数,用于传出该计时器的初始间隔时间和重复间隔时间。
返回值:如果成功,返回0,否则返回 -1。
int setitimer(int which, const struct itimerval * value, struct itimerval * ovalue);//设置计时器
参数 which 指定哪个计时器,可选项为 ITIMER_REAL(真实计时器)、ITIMER_VIRTUAL(虚拟计时器)、ITIMER_PROF(实用计时器)。
参数 value 为一结构体传入参数,指定该计时器的初始间隔时间和重复间隔时间。
参数 ovalue 为一结构体传出参数,用于传出以前的计时器时间设置。
返回值:如果成功,返回 0, 否则 -1 。
struct itimerval{
struct timeval it_interval; //重复间隔
struct timeval it_value; //初始间隔
};
struct timeval{
long tv_sec; //时间的秒数部分
long tv_usec; //时间的微秒部分
};