OSX: программно получить время безотказной работы? - PullRequest
11 голосов
/ 17 июля 2010

Что-то похожее на linux

cat /proc/uptime

, которое возвращает время безотказной работы в секундах и предпочтительно не обрабатывает время безотказной работы (1).

Ответы [ 7 ]

14 голосов
/ 26 июля 2012

Старый вопрос, я знаю, но мне нужно было сделать то же самое, поэтому я решил опубликовать код, который я использую, полученный от 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);
}
14 голосов
/ 17 июля 2010

Статья Uptime в Википедии имеет интересное преимущество:

Использование sysctl

Существует также метод использования sysctl вызвать последнюю загрузку системы время: $ sysctl kern.boottime kern.boottime: {sec = 1271934886, usec = 667779} чт 22 апреля 12:14:46 2010

Какие ссылки sysctl (8) , ссылки sysctl (3) .

2 голосов
/ 19 ноября 2011

Если кто-то пытается сделать это программно, используя 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 голос
/ 27 июня 2014

правильный путь:

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

0 голосов
/ 03 декабря 2010

Простой скрипт 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
0 голосов
/ 21 июля 2010

К сожалению, «sysctl kern.boottime» возвращает секунды метки времени, а не истекшие секунды. Многократные вызовы не увеличивают второй отсчет, но должны быть секундами от epoc самой даты загрузки.

0 голосов
/ 17 июля 2010

В DriverServices.h объявлена ​​функция UpTime. Я считаю, что это эквивалентно другой функции mach_absolute_time. Кажется, что оба документа недокументированы.

...