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

主要过程:
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 
#include 
#include 
#include 

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

你可能感兴趣的:(c)