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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
【工作中遇到的小问题】select 用来定时
 usleep功能把进程挂起一段时间, 单位是微秒(百万分之一秒);    头文件: unistd.h    语法: void usleep(int micro_seconds);    返回值: 无    内容说明:本函数可暂时使程序停止执行。参数 micro_seconds 为要暂停的微秒数(us)。    注意:这个函数不能在windows操作系统下运行 Sleep(uni
Linux下用 select 函数实现定时器(也可用作线程内延时)
Linux下用 select 函数实现定时器,也可用作线程内延时。   直接上源代码:   #include #include int main() { struct timeval tv; while(1) { tv.tv_sec = 1; tv.tv_usec = 0; switch(select(0, NULL, NU
inux下的定时器类实现(select定时+线程)
更好的计时器类实现:LINUX RTC机制实现计时器类(原创)       很多时候需要在LINUX下用到定时器,但像setitimer()和alarm()这样的定时器有时会和sleep()函数发生冲突,这样就给编程带来了很大的困难。     写了一个定时器的类,使用select进行精确定时。而且可以在系统中创建不限数量的定时器,且互不干扰。类的内部采用线程实现。即线程+selec
请教定时执行任务问题
用asp和js都可以 有个任务往数据库写入信息,并显示信息 比如设置9点开始,然后页面就在9点开始执行这个任务,然后每隔1分钟执行这个任务,然后还可以设置结束时间 如果用js定时刷新页面的话怕手动刷新破坏这个规则 请问该如果做?? 谢谢
利用python在linux下分布式任务管理
本人是新手,还请各位大神指教,觉得可以的话记得点赞!!! 我们先建一个python文件 import random, time, queue,uuid from multiprocessing.managers import BaseManager import threading import pymysql def settask(n):     connect = pymysq
英文邮件礼仪:向教授请教学术问题
英文邮件礼仪:向教授请教学术问题   邮件主题 邮件主题(subject)不需要写自己的名字。名字是在邮件系统设置里设定好的,在发件时会替换显示实际地址,所以无需在主题里再写一遍。 [关键内容是要在主题里就写明白是否有推荐人,以及主要是什么事。很多教授只看主题。]   一个好的标题,要能简洁地概括邮件的目的或内容。如果你对教授的某个研究项目感兴趣,就可以用这个研究方向作标题,例如"De
(笔记)linux下用select函数的超时实现timer(时间定时器s)
一、select函数: #include #include #include #include int select(int nfds,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,struct timeval *timeout); 参数说明: nfds为fd_set集合中最大的文件描述符的值+1,fd_set是一个位数
linux下定时器的实现(select+线程)
更好的计时器类实现:LINUX RTC机制实现计时器类       很多时候需要在LINUX下用到定时器,但像setitimer()和alarm()这样的定时器有时会和sleep()函数发生冲突,这样就给编程带来了很大的困难。     写了一个定时器的类,使用select进行
Linux系统时间偏差的纠正 adjtimex
实际上,linux系统有两个时钟:一个是由主板电池驱动的“Real Time Clock”也叫做RTC或者叫CMOS时钟,硬件时钟。当操作系统关机的时候,用这个来记录时间,但是对于运行的系统是不用这个时间的。另一个时间是 “System clock”也叫内核时钟或者软件时钟,是由软件根据时间中断来进行计数的,内核时钟在系统关机的情况下是不存在的,所以,当操作系统启动的时候,内核时 钟是要读取R
在Windows上, 为什么不要将select函数作为定时器?---因为经常返回WSAEINVAL
我们知道, 在linux上, sleep函数的单位是s, 那怎么进行微妙级别的定时呢? 用select函数即可。 但是, 在Windows上, 强烈不建议将select函数用作定时器(该语句出自大名鼎鼎的Windows Socket这本书), 下面我们来实战一下:        看程序: #include #include #pragma comment(lib, "ws2_32.lib"