SystemtapでSleep sort
なんか書かねばならぬ気がしたのでやってしまった。
probe begin { foreach(i in argv) system("sleep " . argv[i]) } probe syscall.nanosleep.return { ctsk = task_current(); ptsk = task_parent(ctsk); if (task_execname(ctsk) != "sleep" || task_execname(ptsk) != "stapio") next; println($rqtp->tv_sec); }
- コマンドライン引数をうけとってsleepを呼び出す。
- sleepはnanosleepシステムコールを呼び出すので、その終了時をフック。
- 一応実行コマンド名と、親コマンド名があってるかどうかチェック(適当ですね)。
- 引数の秒数部分を表示(本当はちゃんとユーザ空間アクセスチェックをすべき(笑))。
実行するとこんな感じ。
# stap sleepsort.stp 2 4 1 3 1 2 3 4 ^CToo many interrupts received, exiting.
最後自分でCtrl+Cを押す必要がある。最大値でもとっておけばいいんだろうけどねー。
やはり 「sleep」 sortなので、sleepを呼び出すところは譲れない。