Linux信号实践(5)

三种不同精度的睡眠

1.sleep

#include <unistd.h>unsigned int sleep(unsigned int seconds);

RETURNVALUE

Zeroiftherequestedtimehaselapsed,orthenumberofsecondslefttosleep,

ifthecallwasinterruptedbyasignalhandler.

//示例int sleepTime = 5;do{sleepTime = sleep(sleepTime);}while (sleepTime > 0);

2.usleep(以微秒为单位)

int usleep(useconds_t usec);

Thetypeuseconds_tisanunsignedintegertypecapableofholdingintegersintherange[0,1000000].

Programswillbemoreportableiftheynevermentionthistypeexplicitly.

3.nanosleep(以纳秒为单位)

#include <time.h>int nanosleep(const struct timespec *req, struct timespec *rem);

req指定睡眠的时间,rem返回剩余的睡眠时间

struct timespec{time_t tv_sec;/* seconds: 秒 */long tv_nsec;/* nanoseconds: 纳秒 */};三种时间结构time_tstruct timeval {long tv_sec;/* seconds */long tv_usec;/* microseconds 微秒*/};struct timespec {time_t tv_sec;/* seconds */long tv_nsec;/* nanoseconds */};setitimer#include <sys/time.h>int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue));

setitimer()比alarm功能强大,支持3种类型的定时器

参数

第一个参数which指定定时器类型

第二个参数是请求的时间

第三个参数是定时器原来所关联的值

struct itimerval{struct timeval it_interval; /* next value : 产生信号的间隔时间*/struct timeval it_value; /* current value : 第一次产生信号的时间*/};struct timeval{time_ttv_sec;/* seconds: 秒 */suseconds_t tv_usec;/* microseconds: 微秒 */};

which值

ITIMER_REAL:经过指定的时间后,,内核将发送SIGALRM信号给本进程(用的较多)

ITIMER_VIRTUAL:程序在用户空间执行指定的时间后,内核将发送SIGVTALRM信号给本进程

ITIMER_PROF:进程在内核空间中执行时,时间计数会减少,通常与ITIMER_VIRTUAL共用,代表进程在用户空间与内核空间中运行指定时间后,内核将发送SIGPROF信号给本进程。

/**示例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();}/**示例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,1ms=1000μs,1μs=1000ns

福报不够的人,就会常常听到是非;

Linux信号实践(5)

相关文章:

你感兴趣的文章:

标签云: