- 论坛徽章:
- 0
|
#include
unsigned int alarm(unsigned int seconds);
系 统调用alarm安排内核为调用进程在指定的seconds秒后发出一个SIGALRM的信号。默认动作是终止调用进程,可以捕获信号在超时后执行我们用signal设定的信号处理函数。后一次设定将取消前一次的设定。如果指定的参数seconds为0,则不再发送 SIGALRM信号,所以可用参数0取消先前设置的alarm定时器。该调用返回值为上次定时调用到发送之间剩余的时间,或者因为没有前一次定时调用而返回0。
注意,在使用时,alarm只设定为发送一次信号,如果要多次发送,就要多次使用alarm调用。 alarm不挂起调用进程。有时需要调用alarm后使进程挂起,这时可以在调用pause函数,该函数使进程休眠,直到接收到一个信号(任何信号)并从信号处理程序返回时才唤醒进程。
如果不要求很精确的话,用alarm()和signal()就够了。
void sigalrm_fn(int sig)
{ printf("alarm!\n");
alarm(2); //alarm只设定为发送一次信号,如果要多次发送,就要多次使用alarm调用
return;
}
int main(void)
{ signal(SIGALRM, sigalrm_fn);
alarm(1);
while(1) pause();
}
#include
unsigned int sleep(unsigned int seconds); 被中断返回未休眠够的秒数,超时到返回0
挂起调用进程,直到定时时间到或者捕捉到一个信号(此信号不能是被忽略的信号)并从信号处理程序返回。此函数一般用来使进程挂起指定时间,不能设定信号处理函数,所以不能用来超时后执行特定动作。一般不作为定时器。
#include
int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout);
如果函数的第2、3、4这三个指针参数均为null,则select提供了比select更精确的定时器,因为sleep等待整数秒,而struct timeval结构精确到毫秒。定时器将阻塞进程直到超时(返回0)或者被信号中断(返回-1)。此函数一般用来使进程挂起指定时间,不能设定信号处理函数,所以不能用来超时后执行特定动作。一般不作为定时器。
timeout参数指向的struct timeval结构不一定返回剩余的秒数,如果我们需要这个值,必须在调用select前取得系统时间,返回后再取得系统时间,两者相减。
#include
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);
setitimer()有两个功能,一是指定一段时间后,才执行某个function,二是每间格一段时间就执行某个function,setitimer() 为Linux的API,并非C语言的Standard Library
参数:
which:间歇计时器类型,有三种选择
ITIMER_REAL //数值为0, 以系统真实的时间来计算,计时器的值实时递减,发送的信号是SIGALRM。
ITIMER_VIRTUAL //数值为1,以该进程在用户态下花费的时间来计算,进程执行时递减计时器的值,发送的信号是SIGVTALRM。
ITIMER_PROF //数值为2, 以该进程在用户态下和内核态下所费的时间来计算,进程和系统执行时都递减计时器的值,发送的信号是SIGPROF。
value,ovalue:时间参数,原型如下
struct itimerval {
struct timeval it_interval; /* 计时器重启动的间歇值 */
struct timeval it_value; /* 计时器安装后首先启动的初始值 */
};
struct timeval {
long tv_sec; /* 秒 */
long tv_usec; /* 微妙(1/1000000) */
};
int getitimer(int which, struct itimerval *value);//用计时器的当前值填写value指向的结构体。
20#include stdio.h> // for printf()
21#include unistd.h> // for pause()
22#include signal.h> // for signal()
23#include string.h> // for memset()
24#include sys/time.h> // struct itimeral. setitimer()
25
26void printMsg(int);
27
28int main() {
29 // Get system call result to determine successful or failed
30 int res = 0;
31 // Register printMsg to SIGALRM
32 signal(SIGALRM, printMsg)
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/103462/showart_2086461.html |
|