OSX: программно ускорить работу?

Нечто похожее на linux

cat /proc/uptime

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

Ответ 1

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

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

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

Какие ссылки sysctl (8), который ссылается на sysctl (3).

Ответ 2

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

Ответ 3

Если кто-то пытается сделать это программно с помощью 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 года) - это время эпохи в порядке порядка младших байтов.

Ответ 4

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

Ответ 5

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

Ответ 6

Простой 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

Ответ 7

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

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