Нечто похожее на linux
cat /proc/uptime
который возвращает время безотказной работы в секундах и предпочтительно не проверяет время безотказной работы (1).
Нечто похожее на linux
cat /proc/uptime
который возвращает время безотказной работы в секундах и предпочтительно не проверяет время безотказной работы (1).
статья о времени выхода в Википедии имеет интересное преимущество:
Использование sysctl
Существует также метод использования sysctl для вызова последней загрузки системы время: $sysctl kern.boottime kern.boottime: {sec = 1271934886, usec = 667779} Чт Апр 22 12:14:46 2010
Какие ссылки sysctl (8), который ссылается на sysctl (3).
Старый вопрос, я знаю, но мне нужно было сделать то же самое, поэтому я подумал, что отправлю код, который я использую, который я получил из 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 be 92 55
Первые 4 байта (может быть, первые 8, не будут известны до января 2012 года) - это время эпохи в порядке порядка младших байтов.
В DriverServices.h есть функция UpTime
. Я считаю, что это эквивалентно другой функции mach_absolute_time
. Оба, похоже, недокументированы.
К сожалению, "sysctl kern.boottime" возвращает секунды временной метки, а не истекшие секунды. Несколько вызовов не увеличивают второй счет, но должны быть секундами от epoc самой даты загрузки.
Простой Lua script, чтобы выполнить именно то, что вы просите:
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
правильный путь:
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