Chinaunix首页 | 论坛 | 博客
  • 博客访问: 395795
  • 博文数量: 68
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 491
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-19 20:11
文章分类

全部博文(68)

文章存档

2015年(13)

2014年(30)

2013年(25)

我的朋友

分类: 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);

纳秒级延时,不安全,可被信号打断提前返回

 

二、利用selectpselect实现延时

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也是安全的

 

 

阅读(2753) | 评论(0) | 转发(0) |
1

上一篇:select函数总结

下一篇:ubuntu10.04 下设置IBUS

给主人留下些什么吧!~~