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服务主配文 ...
最新文章
- PoseFormer:首个纯基于Transformer的 3D 人体姿态估计网络,性能达到 SOTA
- AI论文引用排行榜丨微软第一,清华第九;Alphabet董事长看AI:美国仅领先5年,大陆追赶速度快;
- 使Git与代理服务器一起使用-因“请求超时”而失败
- python 安装使用saltstack salt-api 简介
- scikit-learn K近邻法类库使用小结
- 阿里云华北区挂了。。。
- 【USACO 2.1】The Castle
- UVa11882,Biggest Number
- 5、vsphere6-ESXI主机的安装及配置
- Java程序员需要注意的五大Docker误区
- aop日志(记录方法调用日志)
- python人脸识别代码实现
- 策略战棋游戏开发计划
- update与upgrade的区别
- 面向交付的IT软件管理流程
- 【已解决】macbook软件卸载了图标还在launchpad上怎么办?一分钟搞定!
- Element Plus 跟踪表格数据总数,包括查询、筛选等操作
- 虚拟机linux关机halt,linux关机命令halt
- 【BBED】BBED模拟并修复ORA-08102错误
- 土地利用/土地覆盖(LUCC)——知识汇总