您的位置:首页 > 其它

获取qemu系统当前时间(纳秒级)并输出到log的C实现

2018-01-09 09:46 1746 查看
主要过程:

1.获取纳秒级系统时间

2.将该输出重定向至log

主要函数:

1.clock_gettime

2.write_log

函数分析:

1.时间函数:

包含于头文件stdio.h和time.h中;具体的实现有以下几种

(1). Middleware对POSIX提供的标准计时器API进行封装,主要提供了两种类型的时钟的封装。一种是CLOCK_REALTIME,另一种是CLOCK_MONOTONIC。对与man手册的解释是:

CLOCK_REALTIME: Systemwide realtime clock. 系统范围内的实时时钟。用的是绝对时间,当系统时钟源被改变,会受到影响

CLOCK_MONOTONIC:Represents monotonic time. Cannot be set.表示单调时间,不能被设置,它表示的是体统启动至今的时间。

(2). 至于说为何采用clock_gettime()函数,是因为它提供精确到纳秒级,qemu是采用纳秒级的时间函数的。

2.输出重定向

调用write_log(pFile, format, …);方法写日志;

会使用到va_list :va_list 是在C语言中解决变参问题的一组宏,所在头文件:#include

#include <stdio.h>
#include <stdarg.h>
#include <time.h>
#include <inttypes.h>

static inline uint64_t time_now(void)
{
struct timespec time;
clock_gettime(CLOCK_MONOTONIC, &time);
return ((uint64_t) time.tv_sec) * 1000000000 + time.tv_nsec;
}

int write_log(FILE* pFile,const char *format,...)
{
va_list arg;
int done;

va_start (arg,format);
uint64_t time = time_now();
fprintf(pFile,"%"PRIu64"\n",time);
done = vfprintf(pFile,format,arg);
va_end(arg);

fflush(pFile);
return done;
}
int main()
{
FILE* pFile = fopen("time.txt","a");
write_log(pFile,"%s\n","running!!!");
fclose(pFile);
return 0;
}


解析:

va_list (ap):定义va_list类型的变量ap

va_start(ap,v):初始化,将ap指针指向第一个可变参数的地址

va_arg(ap,t):获取当前指针指向的资源,并将指针指向下一位

va_end:释放va_list

编译:

gcc time.c -o time

结果:

61575921805135

running!!!

参考链接:

http://blog.csdn.net/aihao1984/article/details/5953668

http://blog.csdn.net/subaofa/article/details/53609857
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: