我试图让正常运行时间为iOS。 我是用mach_absolute_time - 但我发现它在睡眠时暂停。
我发现这个片断:
- (time_t)uptime
{
struct timeval boottime;
int mib[2] = {CTL_KERN, KERN_BOOTTIME};
size_t size = sizeof(boottime);
time_t now;
time_t uptime = -1;
(void)time(&now);
if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 && boottime.tv_sec != 0)
{
uptime = now - boottime.tv_sec;
}
return uptime;
}
它的伎俩。 但是,它返回整秒。 没有办法让毫秒出来呢?
内核不(显然)存储它的开机时间更高分辨率的时间戳。
KERN_BOOTTIME
被执行的sysctl_boottime
在功能bsd/kern/kern_sysctl.c
。 它要求boottime_sec
。
boottime_sec
在实现bsd/kern/kern_time.c
。 它调用clock_get_boottime_nanotime
,其中有一个有希望的名字。
clock_get_boottime_nanotime
在实施osfmk/kern/clock.c
。 这是硬编码始终在其返回0 nanosecs
说法。
如果你想要的东西纯粹的Objective-C,尝试
NSTimeInterval uptime = [[NSProcessInfo processInfo] systemUptime];
( NSTimeInterval
是一个typedef double
,代表秒。)
我知道这可能为时已晚,但你去那里:
+ (NSTimeInterval)uptime {
struct timeval boottime;
int mib[2] = {CTL_KERN, KERN_BOOTTIME};
size_t size = sizeof(boottime);
struct timeval now;
struct timezone tz;
gettimeofday(&now, &tz);
double uptime = -1;
if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 && boottime.tv_sec != 0) {
uptime = now.tv_sec - boottime.tv_sec;
uptime += (double)(now.tv_usec - boottime.tv_usec) / 1000000.0;
}
return uptime;
}