Linux信号实践(5) --时间与定时器
2016-01-02 12:47
501 查看
三种不同精度的睡眠
1.sleep[cpp] view
plaincopy
#include <unistd.h>
unsigned int sleep(unsigned int seconds);
RETURN VALUE
Zero if the requested time has elapsed, or the number of seconds left to sleep,
if the call was interrupted by a signal handler.
[cpp] view
plaincopy
//示例
int sleepTime = 5;
do
{
sleepTime = sleep(sleepTime);
}
while (sleepTime > 0);
2.usleep(以微秒为单位)
[cpp] view
plaincopy
int usleep(useconds_t usec);
The type useconds_t is an unsigned integer type capable of holding integers in the range [0,1000000].
Programs will be more portable if they never mention this type explicitly.
3.nanosleep(以纳秒为单位)
[cpp] view
plaincopy
#include <time.h>
int nanosleep(const struct timespec *req, struct timespec *rem);
req指定睡眠的时间, rem返回剩余的睡眠时间
[cpp] view
plaincopy
struct timespec
{
time_t tv_sec; /* seconds: 秒 */
long tv_nsec; /* nanoseconds: 纳秒 */
};
三种时间结构
[cpp] viewplaincopy
time_t
[cpp] view
plaincopy
struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* microseconds 微秒*/
};
[cpp] view
plaincopy
struct timespec {
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
setitimer
[cpp] viewplaincopy
#include <sys/time.h>
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue));
setitimer()比alarm功能强大,支持3种类型的定时器
参数
第一个参数which指定定时器类型
第二个参数是请求的时间
第三个参数是定时器原来所关联的值
[cpp] view
plaincopy
struct itimerval
{
struct timeval it_interval; /* next value : 产生信号的间隔时间*/
struct timeval it_value; /* current value : 第一次产生信号的时间*/
};
struct timeval
{
time_t tv_sec; /* seconds: 秒 */
suseconds_t tv_usec; /* microseconds: 微秒 */
};
which值
ITIMER_REAL: 经过指定的时间后,内核将发送SIGALRM信号给本进程 (用的较多)
ITIMER_VIRTUAL : 程序在用户空间执行指定的时间后,内核将发送SIGVTALRM信号给本进程
ITIMER_PROF : 进程在内核空间中执行时,时间计数会减少,通常与ITIMER_VIRTUAL共用,代表进程在用户空间与内核空间中运行指定时间后,内核将发送SIGPROF信号给本进程。
[cpp] view
plaincopy
/**示例1:
1.在启动进程的5秒之后产生信号
2.然后每隔1秒产生一次信号
**/
int main()
{
if (signal(SIGALRM, signalAction) == SIG_ERR)
err_exit("signal error");
struct itimerval it;
struct timeval it_interval = {1, 0};
struct timeval it_value = {5, 0};
it.it_interval = it_interval;
it.it_value = it_value;
if (setitimer(ITIMER_REAL, &it, NULL) == -1)
err_exit("setitimer error");
while (true)
pause();
}
[cpp] view
plaincopy
/**示例2:
获取itimerval 结构体
**/
int main()
{
struct itimerval it;
struct timeval it_interval = {1, 0};
struct timeval it_value = {5, 0};
it.it_interval = it_interval;
it.it_value = it_value;
if (setitimer(ITIMER_REAL, &it, NULL) == -1)
err_exit("setitimer error");
for (int i = 0; i < 100000; ++i)
;
struct itimerval oldIt;
// if (setitimer(ITIMER_REAL, &it, &oldIt) == -1)
// err_exit("setitimer error");
// 在不重新设置时钟的情况下获取剩余时间
if (getitimer(ITIMER_REAL, &oldIt) == -1)
err_exit("getitimer error");
cout << oldIt.it_interval.tv_sec << ' ' << oldIt.it_interval.tv_usec
<< ' ' << oldIt.it_value.tv_sec << ' ' << oldIt.it_value.tv_usec << endl;
}
附:秒-微秒-纳秒的转换
S(秒)、ms(毫秒)、μs(微秒)、ns(纳秒),其中:1s=1000ms,1 ms=1000μs,1μs=1000ns
相关文章推荐
- Linux信号实践(4) --可靠信号
- Linux信号实践(3) --信号内核表示
- Linux/Ubuntu上使用Qt Creator创建非Qt项目
- linux0.11系列之(一): 实验环境搭建
- centos下一台机器多个Mysql实例
- CentOS系统启动流程
- CentOS系统启动流程
- linux系统中source命令
- linux io超详细
- Linux设备驱动中的ioctl
- 虚拟机Linux上网配置
- centos7 显示中文乱码
- LINUX O_Direact
- CentOS 7 最小安装后的 简易桌面安装
- LINUX CACHE IO THREAD
- linux挂载
- Linux五种IO模型
- 《linux性能及调优指南》
- Linux下安装Eclipse(tar.gz版本)
- Linux学习之:系统启动流程