您的位置:首页 > 运维架构 > Linux

Linux信号实践(5) --时间与定时器

2016-01-02 12:47 495 查看

三种不同精度的睡眠

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] view
plaincopy





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] view
plaincopy





#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: