任意のコマンドで実行したプロセスの最大メモリ使用量を取得する

time ってコマンドありますよね。任意のコマンドの実行時間を計るやつ。あれと同じ感じで、あるコマンドの最大メモリ使用量を知りたいと思ったわけです。
GNU timeコマンドだと、メモリ使用量が取れるみたいなことが書いてあったんですよね。Fedora Core 2だと、/usr/bin/time がそのコマンドで、`which time`すると、ちゃんと/usr/bin/time って出てくるのですが、 普通にtimeって打つと、実行時間しか計れないバージョンのtimeが実行されるらしく、フルパスで/usr/bin/timeと打たないとメモリ使用量が測れるGNU timeが実行できませんでした。
で、次のようなコマンドで試してみました。


$ /usr/bin/time -f "M:%M K:%K" ./a.out arg1 arg2
でも、結果は

M:0 K:0
と、0しか出力されない。
ちなみに、%Mと%Kの説明は

%M Maximum resident set size of the process during its lifetime, in Kbytes.
%K Average total (data+stack+text) memory use of the process, in Kbytes.
多分、%Mじゃないかと思うのですが、ちゃんとメモリ使用量取れないですね。%Kは"Average"って書いてある時点ってちょっと違いそうだし。しかし、どちらにしても、メモリ使用量に関係ありそうな値が出ないので、このコマンド使うのはあきらめました。64Gメモリのサポート有りでカーネルコンパイルしているのと関係があるのかな?
仕方ないので、コマンドを自作することを考えます。プロセスとシグナルでお勉強。
メモリ使用量の取得はpsコマンドをpopenして取得します。forkで指定された任意のコマンドをexecします。親プロセスでは、forkしたPIDをpsコマンドに与えてやることで子プロセスのメモリ使用量を取得します。

fp = popen("ps up PID","r");
N秒毎にpsコマンドを呼び出してメモリ使用量を計測し最大値を覚えておきます。で、子プロセスが終了したらメモリ使用量を出力して終了するという使用にします。
子プロセスの終了を待つにはwait4()関数を使うみたい。しかし、wait4()関数にはタイムアウトという概念がなさそうなので、alarm()関数を使ってSIGALRMシグナルを送り、永久にwait4()関数で待たないようにする。この段落のことがうまく行くかどうかは、まだ未検証。
こういう仕様のコマンドって絶対どっかにありそうな気がするんだけどなぁ。