类似于linux的东西
cat /proc/uptime
它以秒为单位返回正常运行时间,最好不解析正常运行时间(1)。
老问题,我知道,但我需要做同样的事情,所以我想我会发布我正在使用的代码,我从http://cocoadev.com/wiki/FindingUptime 获得
#include <time.h>
#include <errno.h>
#include <sys/sysctl.h>
double uptime()
{
struct timeval boottime;
size_t len = sizeof(boottime);
int mib[2] = { CTL_KERN, KERN_BOOTTIME };
if( sysctl(mib, 2, &boottime, &len, NULL, 0) < 0 )
{
return -1.0;
}
time_t bsec = boottime.tv_sec, csec = time(NULL);
return difftime(csec, bsec);
}
如果有人试图以编程方式执行此操作sysctl.h
并且期望返回一个字符串,就像您在命令行中看到的那样,我得到的返回值是一个 16 字节数组,而不是字符串:
sysctlbyname("kern.boottime", value, &size, NULL, 0);
value
从 [0] 索引开始以十六进制输入的示例:
a9 af c6 4e 0 0 0 0 0 0 0 0 28 是 92 55
前 4 个字节(可能是前 8 个,直到 2012 年 1 月才知道)是小端字节顺序的纪元时间。
正确方法:
CFTimeInterval getSystemUptime(void)
{
enum { NANOSECONDS_IN_SEC = 1000 * 1000 * 1000 };
static double multiply = 0;
if (multiply == 0)
{
mach_timebase_info_data_t s_timebase_info;
kern_return_t result = mach_timebase_info(&s_timebase_info);
assert(result == noErr);
// multiply to get value in the nano seconds
multiply = (double)s_timebase_info.numer / (double)s_timebase_info.denom;
// multiply to get value in the seconds
multiply /= NANOSECONDS_IN_SEC;
}
return mach_absolute_time() * multiply;
}
您也可以CACurrentMediaTime()
从 QuartzCore.framework 使用(可能具有相同的代码) - 自 OS X v10.5 和 iOS 2.0 起可用
UpTime
DriverServices.h 中声明了一个函数。我相信这相当于另一个功能mach_absolute_time
。两者似乎都没有证件。
不幸的是,“sysctl kern.boottime”返回时间戳的秒数,而不是经过的秒数。多次调用不会增加秒数,但必须是启动日期本身的 epoc 秒数。
一个简单的 Lua 脚本,可以完全按照您的要求进行操作:
local now=tonumber(io.popen("date +%s"):read())
local boottime=tonumber(io.popen("sysctl -n kern.boottime"):read():match("sec = (%d+)"))
local uptime=now-boottime