MacOS X の top とかで表示される空きメモリ容量を、自分のプログラムからシステムコールとか使って取得したいなー、と思ってたのだけれど、どうも sysctl ではダメらしい。で、いろんなフリーのツールのソースを読んだりしてびびっときたのが host_statistics() というやつだ。Mach のシステムコールらしい。
直接参考になったのはこれ。ユーザランドは BSD だけど、カーネルは Mach なんだよなー、なるほどなー、という感じだ。
C のプログラムにするとこんな感じ。
#include <stdio.h> #include <mach/mach_init.h> #include <mach/host_info.h> #include <mach/mach_host.h> int main(){ vm_statistics_data_t page_info; vm_size_t pagesize; mach_msg_type_number_t count; kern_return_t kret; pagesize = 0; kret = host_page_size (mach_host_self(), &pagesize); count = HOST_VM_INFO_COUNT; kret = host_statistics (mach_host_self(), HOST_VM_INFO, (host_info_t)&page_info, &count); if (kret == KERN_SUCCESS){ unsigned int pw, pa, pi, pf; pw = page_info.wire_count*pagesize; pa = page_info.active_count*pagesize; pi = page_info.inactive_count*pagesize; pf = page_info.free_count*pagesize; printf("wired %d\n", pw); printf("active %d\n", pa); printf("inactive %d\n", pi); printf("free %d\n", pf); } return 0; }
実行すればこうだ。
% ./a.out wired 136630272 active 330928128 inactive 348598272 free 526020608
めでたい。FreeBSD では sysctl でいけるんだけど、Linux は procfs みるしかないのかな?