(1)alarm()
头文件:#include <unistd.h>
原型:unsigned int alarm(unsigned int seconds);
描述:alarm()指定在经过seconds秒后向进程发送SIGALRM信号,如果有事件发生,alarm取消。
由于sleep()可能是用SIGALRM实现的,混合调用alarm()和sleep()可不是个好主意。
(2)setitimer()
头文件:#include <sys/time.h>
原型:int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);
描述:setitimer()可以设置3中类型的定时器,当定时器超时后,向进程发送信号,
并且定时器重新计时。
ITIMER_REAL:以系统实时时间计时,超时后发送SIGALRM
ITIMER_VIRTUAL:以进程的用户态执行时间计时,超时后发送SIGVTALRM
ITIMER_PROF:以进程的执行时间(包括用户态和核心态的执行时间)计时,超时后
发送SIGPROF。
参数描述:value:新的定时时间;ovalue:原来的定时时间
struct itimerval {
struct timeval it_interval; /* next value */
struct timeval it_value; /* current value */
};
struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* microseconds */
};
简单示例:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/time.h>
#include <unistd.h>
struct timeval curtime;
void sighandler(int signo)
{
if(signo == SIGALRM)
{
gettimeofday(&curtime, NULL);
printf("curtime:%d:%03d\n", curtime.tv_sec, curtime.tv_usec/1000);
}
}
int main()
{
struct itimerval ival;
struct itimerval oval;
ival.it_interval.tv_sec = 0;
ival.it_interval.tv_usec = 30000;
ival.it_value.tv_sec = 0;
ival.it_value.tv_usec = 30000;
signal(SIGALRM, sighandler);
setitimer(ITIMER_REAL, &ival, &oval);
while(1)
{
pause();
}
}
评论