首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++中getitimer和setitimer的使用

C++中getitimer和setitimer的使用
EN

Stack Overflow用户
提问于 2016-02-27 13:15:06
回答 3查看 5K关注 0票数 1

我正在编写以下C代码,以获取使用getitimer和setitimer执行简单操作所需的时间。

代码语言:javascript
复制
#include <sys/time.h>
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>
#include <string.h>

#define INTERVAL 1        /* number of milliseconds to go off */

int main() {
    double sum = 0;
    struct itimerval initial, updated;

    initial.it_value.tv_sec     = INTERVAL;
    initial.it_value.tv_usec    = 999999;
    initial.it_interval = initial.it_value;
    memcpy(&(initial.it_interval), &(initial.it_value), sizeof( initial.it_value )); 
    printf("%ld\n", initial.it_value.tv_usec);

    if (setitimer(ITIMER_VIRTUAL, &initial, NULL) == -1) {
        perror("error calling setitimer()");
        exit(1);
    }

    for (unsigned int i; i < 100; i++) 
        sum += 1./i;

    if (getitimer(ITIMER_REAL, &updated) == -1) {
        perror("error calling getitimer()");
        exit(1);
    }

    printf("Time started = %ld\n; Time ended = %ld\n: Time taken = %ld\n",
           initial.it_value.tv_usec, updated.it_value.tv_usec,
           initial.it_value.tv_usec - updated.it_value.tv_usec);
    return 0;
}

我使用以下命令进行编译:

代码语言:javascript
复制
$ gcc -o timer -std=c99 -Wall -pedantic getitimer.c -lrt -03

然而,我的答案始终是999999 (我已经提高并减少了100):

代码语言:javascript
复制
 ./timer 
999999
Time started = 999999
; Time endd = 0
: Time taken = 999999

我的错误是什么?另外,我想问一下,使用这样的程序,我能获得的最高精度是多少?

非常感谢!

EN

回答 3

Stack Overflow用户

发布于 2016-02-27 14:08:37

我看到的主要是除法运算使用整数除法。所以:

代码语言:javascript
复制
initial.it_value.tv_sec     = INTERVAL/1000000;

tv.sec中的位置0

代码语言:javascript
复制
initial.it_value.tv_usec    = (INTERVAL/1000000) * 1000000;

tv_usec中的位置0

代码语言:javascript
复制
initial.it_interval = initial.it_value;

通常,在赋值多字段结构时,使用memcpy()而不是直接赋值。(直接赋值将适用于初始化,但不适用于赋值。)

因此,发布的代码将“间隔”设置为0

因此,当然,结果值是0

这是手册页中setitimer()和getitimer()的关键语句

计时器从it_value递减到零,生成信号,然后重置为it_interval。设置为零(it_value为零或计时器过期且it_interval为零)的计时器停止。

建议:以下编辑

代码语言:javascript
复制
initial.it_value.tv_set = INTERVAL;
initial.it_value.tv_usec = 0;

memcpy( &(initial.it_interval), &(initial.it_value), sizeof( initial.it_value ) );

...
票数 1
EN

Stack Overflow用户

发布于 2016-02-27 13:53:22

setitimergetitimer不是用于分析的正确函数。它们涉及间隔定时器,间隔定时器是在定时器到期时生成警报(更准确地说是信号)的定时器。

实现您想要的功能的主要选项是clockclock_gettime API。

票数 0
EN

Stack Overflow用户

发布于 2016-02-28 07:24:30

最新代码的主要问题是,与调用setitime()相比,对getitimer()的调用引用了不同的计时器

但是,下面的代码使其易于使用

代码语言:javascript
复制
#include <sys/time.h>
#include <stdlib.h>
#include <stdio.h>
//#include <limits.h>
//#include <string.h>

// do not place comments on same line as #define statement
// always surround numeric values with parens to avoid 'text replacement' errors
// wrong comment:  number of milliseconds to go off

// number of seconds in interval
#define INTERVAL (1)

// number of usec in interval
#define MICRO_INTERVAL (999999)

int main() {
    //double sum = 0;
    struct itimerval initial;
    struct itimerval updated;

    initial.it_value.tv_sec     = INTERVAL;
    initial.it_value.tv_usec    = MICRO_INTERVAL;
    initial.it_interval.tv_sec  = INTERVAL;
    initial.it_interval.tv_usec = MICRO_INTERVAL;

    // remove this line: initial.it_interval = initial.it_value;
    // remove this line: memcpy(&(initial.it_interval), &(initial.it_value), sizeof( initial.it_value ));
    //printf("%ld\n", initial.it_value.tv_usec);

    printf( "Time value: %ld.%ld\n", initial.it_value.tv_sec, initial.it_value.tv_usec );
    printf( "Time interval: %ld.%ld\n", initial.it_interval.tv_sec, initial.it_interval.tv_usec );

    if (setitimer(ITIMER_VIRTUAL, &initial, &updated) == -1)
    {
        perror("error calling setitimer()");
        exit(1);
    }

    //for (unsigned int i=0; i < 10; i++)  // must initialize the 'i' variable
    //    sum += 1./i;

    // the 'which' parameter should be 'ITIMER_VIRTUAL'
    //     as that is what was started in the call to setitimer()
    //if (getitimer(ITIMER_REAL, &updated) == -1)
    //{
    //    perror("error calling getitimer()");
    //    exit(1);
    //}

    if (setitimer(ITIMER_VIRTUAL, &initial, &updated) == -1)
    {
        perror("error calling setitimer()");
        exit(1);
    }

    printf( "end interval counter: %ld.%ld\n", updated.it_interval.tv_sec, updated.it_interval.tv_usec );
    printf( "end value counter: %ld.%ld\n", updated.it_value.tv_sec, updated.it_value.tv_usec );

    //printf("Time started = %ld\n; Time ended = %ld\n: Time taken = %ld\n",
    //       initial.it_value.tv_usec, updated.it_value.tv_usec,
    //       initial.it_value.tv_usec - updated.it_value.tv_usec);
    return 0;
}

// accuracy is +/-1 microsecond, not millisecond

即使在两次setitimer()调用之间没有执行任何操作,结果输出也是:

代码语言:javascript
复制
Time value: 1.999999
Time interval: 1.999999
end interval counter: 1.999999
end value counter: 2.3999
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35666008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档