2009-09-03 11 views
2

C++アプリケーションから。 AIX、HP-UX、Linux、OSX、Solaris向けにコンパイルされているかどうかは、アプリケーションの有無を判断する簡単な方法です。システムの起動から5分以内に実行されていますか?どのようにしてPOSIXアプリケーションがあるかを判断できます。システムの起動から5分以内に実行されていますか?

Windowsでは、私はこれを行うことができます。

// return true if OS has recently booted up 
bool at_os_boot_time() 
{ 
    /* GetTickCount() returns the number of miliseconds since system start. 
     So "...the time will wrap around to zero if the system is run 
     continuously for 49.7 days" - so this function will erroneously 
     return true for a 5 minute period 49.7 days after boot */ 
    return ::GetTickCount() < 5 * 60 * 1000; 
} 

私はUnixの世界に相当するものを見つけることができません。

答えて

3

これは、Linux上でkernel.hをからです:

struct sysinfo; 
extern int do_sysinfo(struct sysinfo *info); 

#endif /* __KERNEL__ */ 

#define SI_LOAD_SHIFT 16 
struct sysinfo { 
    long uptime;   /* Seconds since boot */ 
    unsigned long loads[3];  /* 1, 5, and 15 minute load averages */ 
    unsigned long totalram;  /* Total usable main memory size */ 
    unsigned long freeram;  /* Available memory size */ 
    unsigned long sharedram; /* Amount of shared memory */ 
    unsigned long bufferram; /* Memory used by buffers */ 
    unsigned long totalswap; /* Total swap space size */ 
    unsigned long freeswap;  /* swap space still available */ 
    unsigned short procs;  /* Number of current processes */ 
    unsigned short pad;  /* explicit padding for m68k */ 
    unsigned long totalhigh; /* Total high memory size */ 
    unsigned long freehigh;  /* Available high memory size */ 
    unsigned int mem_unit;  /* Memory unit size in bytes */ 
    char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding: libc5 uses this.. */ 
}; 
2

最後のシステムブートの時間を決定する最もポータブル方法は、それがシステムを使用して取得するために、BOOT_TIMEut_typeで、getutxid()を使用することです会計データ特に効率的ではないかもしれないが、あなたが言及したシステムのすべてがこれをサポートすべきだと私は思う。 uptimewho-b、またはwのようなコマンドラインプログラムを呼び出すこともできます。

システムによっては、この情報を取得するためのより効率的なインターフェイスがサポートされていますが、OS固有のものがあります。 Mac OS X(およびFreeBSD)はsysctl()CTL_KERNKERN_BOOTTIMEです。 HP-UXはpstat_getstatic()です。 Tru64にはTBL_SYSINFOパラメータを持つtable()があります。別の答えで述べたように、Linuxにはsysinfo()がありますが、起動後の時刻は/proc/uptime(最初の数字です)から読むこともできます。

+0

非常に有益な答えです。ありがとうございました。 – Ant

+0

getutxidでは、utmpファイルをセットアップし、正しく更新し、切り捨てるなどの必要がありません。組み込みデバイスでは、それはうまくいかないでしょう。 sysinfo(2)でカーネルからの稼働時間を得ることは、はるかに良い計画です。 –

関連する問題