MacOS X で空きメモリ容量を取得

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

コメントを残す