gpt4 book ai didi

c - C中getitimer和setitimer的使用

转载 作者:太空宇宙 更新时间:2023-11-04 03:31:59 27 4
gpt4 key购买 nike

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

#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;
}

我编译了:

$ gcc -o timer -std=c99 -Wall -pedantic getitimer.c -lrt -03

但是,我的答案始终是 999999(我增加和减少了 100):

 ./timer 
999999
Time started = 999999
; Time endd = 0
: Time taken = 999999

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

非常感谢!

最佳答案

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

initial.it_value.tv_sec     = INTERVAL/1000000;

在 tv.sec 中放置 0

initial.it_value.tv_usec    = (INTERVAL/1000000) * 1000000;

将 0 放入 tv_usec

initial.it_interval = initial.it_value;

一般来说,在分配多字段结构时,使用memcpy() 而不是直接分配。 (直接赋值适用于初始化但不适用于赋值。)

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

所以当然,结果值为0

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

“定时器从 it_value 递减到零,产生一个信号,并重置为 它_间隔。设置为零的计时器(it_value 为零或计时器到期且 it_interval 为零)停止。”

建议:已编辑

initial.it_value.tv_set = INTERVAL;
initial.it_value.tv_usec = 0;

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

...

关于c - C中getitimer和setitimer的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35666008/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com