sysinfo関数でシステム情報取得。

Linuxのはなし。
とりあえずサンプル見てだだだーって書いてみました的。

#include <stdio.h>
#include <sys/sysinfo.h>

/* getla : Load Average を取得。値はuptimeで出る値の100倍。 */
unsigned long getla( long int * la01 , long int * la05 ) {
        struct  sysinfo         s_info          ;
        int                     rerror          ;
        unsigned long           la15            ;
        unsigned long           lashift         ;

        /* SI_LOAD_SHIFT のビット分が小数点以下の部分。 */
        lashift = ( 1 << SI_LOAD_SHIFT ) / 100 ;

        rerror = sysinfo( &s_info ) ;

        /* [0]=1min,[1]=5min,[2]=15min  */
        if ( la01 != NULL ) {
                *la01 = s_info.loads[0] / lashift ;
                *la05 = s_info.loads[1] / lashift ;
        }
        la15 = s_info.loads[2]  /lashift ;
        return la15 ;
}

main() {
        unsigned long la01 , la05 , la15 ;
        la15 = getla( &la01 , &la05 ) ;
        printf( "LoadAverage %lu / %lu / %lu\n" , la01 , la05 , la15 ) ;
}

sysinfo構造体のloadsで戻ってきた値を読んでもわからん数字だった。
どうやら、2のSI_LOAD_SHIFT乗の数字で割らないと正しい数字は得られないようだ。
ちなみに私んとこではこうなってた。
linux/kernel.h:

#define SI_LOAD_SHIFT    16

上記例の関数の引数があからさまにおかしいのは、テスト用にあとからla01とla05を追加した結果です(爆)本当にやりたいところでは、la15とれれば十分だったので・・・(^^;

参考:
man 2 sysinfo
sysinfo – システムコールの説明 – Linux コマンド集 一覧表
Linux の sysinfo での load average – spiritlooseのはてなダイアリー

Comments are closed.