12

Linuxに似たもの

cat /proc/uptime

アップタイムを秒単位で返し、できれば uptime(1) を解析しません。

4

7 に答える 7

17

ウィキペディアのアップタイムの記事には、興味深いリードがあります。

sysctl の使用

sysctl を使用してシステムの最終起動時間を呼び出す方法もあります: $ sysctl kern.boottime kern.boottime: { sec = 1271934886, usec = 667779 } Thu Apr 22 12:14:46 2010

sysctl(3)を参照するsysctl(8)を参照するもの。

于 2010-07-16T22:44:38.603 に答える
16

古い質問ですが、同じことをする必要があったので、使用しているコードを投稿すると思いました。これは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);
}
于 2012-07-26T19:00:51.283 に答える
2

誰かがプログラムでこれを実行しようとしていてsysctl.h、コマンドラインに表示されるような文字列が返されることを期待している場合、返される値は文字列ではなく 16 バイト配列です。

sysctlbyname("kern.boottime", value, &size, NULL, 0);

value[0] インデックスから始まる 16 進数に入れられるものの例:

a9 af c6 4e 0 0 0 0 0 0 0 0 28 be 92 55

最初の 4 バイト (おそらく最初の 8 バイト、2012 年 1 月までわからない) は、リトルエンディアンのバイト順でのエポック時間です。

于 2011-11-19T00:27:35.497 に答える
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;
}

また、QuartzCore.framework (おそらく同じコード) から使用することもできますCACurrentMediaTime()- OS X v10.5 および iOS 2.0 以降で利用可能

于 2014-06-27T12:23:11.947 に答える
0

UpTimeDriverServices.h で宣言されている関数があります。これは別の関数と同等だと思いますmach_absolute_time。どちらも文書化されていないようです。

于 2010-07-16T22:48:43.293 に答える
0

あなたが求めていることを正確に実行するための単純な 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
于 2010-12-03T17:04:56.723 に答える
0

残念ながら、「sysctl kern.boottime」は、経過秒数ではなく、タイムスタンプの秒数を返します。複数回呼び出しても秒数は増加しませんが、起動日自体のエポックからの秒数である必要があります。

于 2010-07-20T22:46:22.843 に答える