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 みるしかないのかな?