分类: LINUX
2014-04-22 15:35:19
Linux下延时函数总结
一、主要的延迟函数有:sleep/usleep/nanosleep
unsigned int sleep(unsigned int seconds);
秒级延时,不安全,可被信号打断提前返回
int usleep(useconds_t usec);
微秒级延时,不安全,可被信号打断提前返回
int nanosleep(const struct timespec *req, struct timespec *rem);
纳秒级延时,不安全,可被信号打断提前返回
二、利用select和pselect实现延时
select实现延时
{
struct timeval tv;
tv.tv_sec=10;
tv.tv_usec=0;
select(0, NULL, NULL, NULL, &tv);
}
毫秒级精确延时,不安全,可被信号打断提前返回
pselect实现延时
{
struct timespec ts;
ts.tv_sec=10;
ts.tv_nsec=0;
sigset_t sigmask;
sigemptyset(&sigmask);
sigaddset(&sigmask, SIGALRM); //要屏蔽的信号,此处为定时器的SIGALRM信号
pselect(0, NULL, NULL, NULL, &ts, &sigmask);
}
纳秒级精确延时,安全,可以屏蔽信号而不被打断。
三、利用setitimer实验延时
static sem_t sem_timeout;
sem_init(&sem_timeout, 0, 0);
void delay_s(unsigned int time)
{
struct itimerval val;
val.it_value.tv_sec = time;
val.it_value.tv_usec = 0;
val.it_interval.tv_sec = 0;
val.it_interval.tv_usec = 0;
setitimer(ITIMER_REAL,&val,NULL);
signal(SIGALRM,delay_fun);
Sem_wait(&sem_timeout);
}
void delay_fun(int sig)
{
if(sig == SIGALRM)
Sem_post(&sem_timeout);
}
微秒级精确延时,安全,不会被信号打断
四、安全性
sleep/usleep/nanosleep/select,以上四种延时都可能被系统的某个信号打断(如定时器SIGALRM信号),从而提前返回,不能完成延时。
pselect函数可以屏蔽信号,从而不被打断,所以pselect是最安全的。
settimer实现的延时本身不能被信号打断,故settimer也是安全的。