2 klozz klozz 于 2016.04.12 23:03 提问

请教select定时偏差,linux平台

代码如下:

 #include <sys/time.h>
#include <time.h>
#include <errno.h>
#include <sys/select.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>


int main()
{

    while(1)
    {
        struct timeval stStart, stEnd;
        gettimeofday(&stStart, NULL);

        struct timeval tv={0, 33000};
        select(0,NULL,NULL,NULL,&tv);

        gettimeofday(&stEnd, NULL);
        unsigned int iDelayUseTime = ((stEnd.tv_sec-stStart.tv_sec)*1000*1000+(stEnd.tv_usec-stStart.tv_usec));

        printf("use time:%u\n", iDelayUseTime);
        if(iDelayUseTime < 30000 || 35000 < iDelayUseTime)
            exit(0);
    }


    return 0;
}

运行结果:
图片说明

使用usleep的话也会出现这种情况

2个回答

devmiao
devmiao   Ds   Rxr 2016.04.12 23:50
z617490935
z617490935   2016.04.14 16:08

函数在处理的时候会占用时间,因此在用select做定时器的时候,最好另外起一个线程,使用多线程的select定时器。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!