一、gettimeofday函数的介绍
在 Linux 下使用 gettimeofday 可以获取当前精确到微秒级别的时间。该函数在头文件 <sys/time.h> 中定义,其函数原型如下:
int gettimeofday(struct timeval *tv, struct timezone *tz);
其中参数 tv 代表获取到的时间,是一个 timeval 结构指针。timezone 结构指针 tz 被废弃不再使用,可以传入 NULL。
二、使用gettimeofday获取当前时间
下面是一个简单的示例,使用 gettimeofday 函数获取当前时间,并将时间信息打印出来:
#include <sys/time.h>
#include <stdio.h>
int main()
{
struct timeval tv;
gettimeofday(&tv, NULL);
printf("当前时间为 %ld.%06ld 秒\n", tv.tv_sec, tv.tv_usec);
return 0;
}
在上述代码中,首先定义了一个 timeval 结构体变量 tv,调用 gettimeofday 函数获取当前时间,并将获取到的时间信息打印出来。其中 tv_sec 存储了秒数,tv_usec 存储了微秒数。
三、使用定时器实现精确计时
gettimeofday 不仅可以获取当前时间,还可以使用这个函数实现精确计时功能。下面的示例代码展示了如何使用定时器进行计时,输出程序执行的时间。
#include <stdio.h>
#include <sys/time.h>
int main()
{
struct timeval start, end;
gettimeofday(&start, NULL);
// 模拟程序执行
int res = 0;
for (int i = 0; i < 1000000; i++) {
res += i;
}
gettimeofday(&end, NULL);
long sec = end.tv_sec - start.tv_sec;
long usec = end.tv_usec - start.tv_usec;
long elapsed = sec * 1000000 + usec;
printf("程序执行时间为 %ld 微秒\n", elapsed);
return 0;
}
在上述代码中,首先使用 gettimeofday 获取程序开始执行时的时间,然后进行一些耗时的操作,最后再使用 gettimeofday 获取程序结束执行时的时间。通过计算时间差,可以得到程序执行的时间,输出到控制台。
四、使用gettimeofday实现精准延时
使用 gettimeofday 不仅可以实现计时,还可以实现精准的延时。下面的示例代码演示了如何使用 gettimeofday 实现精准的 1 秒钟延时。
#include <stdio.h>
#include <sys/time.h>
void delay(unsigned int msec)
{
struct timeval tv;
tv.tv_sec = msec / 1000;
tv.tv_usec = (msec % 1000) * 1000;
select(0, NULL, NULL, NULL, &tv);
}
int main()
{
printf("延时开始...\n");
delay(1000);
printf("延时结束!\n");
return 0;
}
在上述代码中,首先定义了一个 delay 函数,传入需要延时的时间(以毫秒为单位)。然后创建一个 timeval 结构体变量 tv,计算出需要延时的秒数和微秒数,使用 select 函数实现精准的延时。
五、小结
gettimeofday 函数是一个非常实用的函数,在 Linux 编程中经常会用到。通过 gettimeofday 可以获取当前时间,实现计时和精准延时等功能。在实际编程中,可以根据自己的需求进行灵活运用。