linux 下的gettimeofday 函数在windows上的替换方案
方案一:
#include <time.h>
#ifdef WIN32
# include <windows.h>
#else
# include <sys/time.h>
#endif
#ifdef WIN32
int
gettimeofday(struct timeval *tp, void *tzp)
{
time_t clock;
struct tm tm;
SYSTEMTIME wtm;
GetLocalTime(&wtm);
tm.tm_year = wtm.wYear - 1900;
tm.tm_mon = wtm.wMonth - 1;
tm.tm_mday = wtm.wDay;
tm.tm_hour = wtm.wHour;
tm.tm_min = wtm.wMinute;
tm.tm_sec = wtm.wSecond;
tm. tm_isdst = -1;
clock = mktime(&tm);
tp->tv_sec = clock;
tp->tv_usec = wtm.wMilliseconds * 1000;
return (0);
}
#endif
方案二:
gettimeofday的使用
//copy from muduo Timestamp Timestamp::now() {struct timeval tv;gettimeofday(&tv, NULL);//返回1970年至今的秒+微秒int64_t seconds = tv.tv_sec;return Timestamp(seconds * kMicroSecondsPerSecond + tv.tv_usec); }
gettimeofday要求传入一个timeval和一个时区。因为存在微秒数,显然它比 time_t now = ::time(NULL)更精确。
但是这个函数是linux下的。所以我们需要一个跨平台的实现。
以下是一个实现,使用c++的chrono库。
#include <chrono> int gettimeofday(struct timeval *__restrict __tv, __timezone_ptr_t __tz) { auto now = std::chrono::system_clock::now(); auto now_ticks = std::chrono::duration_cast<std::chrono::microseconds>(now.time_since_epoch());// __tv->tv_sec = (long)now_ticks.count() / 1000000; __tv->tv_usec = (long)now_ticks.count() % 1000000; return 0; }
now.time_since_epoch()返回的duration比较奇怪,需要转化成微秒。其实主要是windows没有这个函数,那么我们实现它。
//copy from evpp #ifdef WIN32 int gettimeofday(struct timeval* tp, void* tzp) {uint64_t intervals;FILETIME ft;GetSystemTimeAsFileTime(&ft);/** A file time is a 64-bit value that represents the number* of 100-nanosecond intervals that have elapsed since* January 1, 1601 12:00 A.M. UTC.** Between January 1, 1970 (Epoch) and January 1, 1601 there were* 134744 days,* 11644473600 seconds or* 11644473600,000,000,0 100-nanosecond intervals.** See also MSKB Q167296.*/intervals = ((uint64_t)ft.dwHighDateTime << 32) | ft.dwLowDateTime;intervals -= 116444736000000000;tp->tv_sec = (long)(intervals / 10,000,000);tp->tv_usec = (long)((intervals % 10000000) / 10);return (0); }
linux 下的gettimeofday 函数在windows上的替换方案相关推荐
- Linux下通过gettimeofday函数获取程序段执行时间
在Linux下计算某个程序段执行的时间一般使用gettimeofday函数,此函数的声明在sys/time.h文件中.此函数接收两个结构体参数,分别为timeval.timezone. ...
- sleep头文件linux,Linux下的sleep函数 要用的话得包涵什么头文件啊?
Linux下的sleep函数 要用的话得需要#include sleep把进程的运行状态改为睡眠,将其从系统可执行队列去掉,这样系统就不会调度到该进程,不会分配CPU时间片,同时根据该进程的睡眠时间, ...
- linux getline参数,Linux下的getline函数
最近在做国嵌的mp3项目,在mp3主控程序中用到了这个函数,挺好使的,在这里记录一下.注意是linux下的,不是C++中的. 函数原型 ssize_t getline(char **lineptr, ...
- 进程间通信管道进阶篇:linux下dup/dup2函数的用法
由于利用管道实现进程间通信,是通过创建两个文件描述符,但是描述符的初始化是通过随机的,就是从可用的文件描述符中取出,并将可用的文件描述符与file对象相关联,如果我们需要将管道的两头与其他的流相关时, ...
- [转帖]关于Linux下的icotl函数
关于Linux下的icotl函数 最近接触android开发,因为有时间所以就关注了下android的源码,在跟踪源码过程中到最后都会遇到icotl函数,虽然在Symbian中曾经遇到过RSocket ...
- 双用户windows linux系统,Windows与Linux合二为一?终于能在windows上运行Linux了!
原标题:Windows与Linux合二为一?终于能在windows上运行Linux了! 目前在PC端操作系统市场份额中,微软旗下的windows系统占据超过50%的比例. 作为微软旗下发布的产品之一, ...
- Linux下的延时函数
Linux下的延时函数 1.sleep函数 头文件:#include<unistd.h> 功能:执行挂起操作一段时间,以秒为单位 一般形式:unsigned sleep(unsigned ...
- linux 多播路由查看,Linux下多播路由的实现Windows系统 -电脑资料
前言(只是一些废话,不想看的可以略过) ===================================== 多播路由是一个很好的技术,在Internet上实现了对数据的"广播&quo ...
- 【samba】Wodows同步Linux文件|搭建共享文件服务器——在windows上映射网络驱动器
目录 Linux做samba服务器 Linux上的操作 windows上的操作 windows做samba服务器 windows上的操作 linux上的操作 错误记录 Linux Samba服务主配文 ...
最新文章
- Programming C# 学习笔记(二) 出发:“Hello World”
- [zz] 几种类间关系:继承、实现、依赖、关联、聚合、组合及UML实现图
- 模为2的逆元是什么_两种求模m逆元的方法
- mysql数据库版本不同_MySQL不同版本数据同步
- NODE安装N管理出错
- 数据结构 【实验 串的基本操作】
- 如何通过C#开发一个媒体播放器(中)
- 基于观察者模式——创建显示天气数据
- Web敏感目录快速扫描软件 wwwscan
- Python 处理人民币金额,大小写互转
- 产业升级再加码 鼎捷软件助力宜兴打造智造新名片
- RuntimeError: CUDA error (10): invalid device ordinal
- 分享: Vue微信浏览器ios音乐自动播放
- Openerp对象字段定义详解
- Unity太空大战游戏-Socket网络通信教学示例
- deepin 作为日常办公系统
- wxpython wx.Destroy()和wx.Close()区别
- 一些Mac OS X技巧
- 指定JDK运行Jar包
- linux如何重新分区