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);
}
  1. コマンドライン引数をうけとってsleepを呼び出す。
  2. sleepはnanosleepシステムコールを呼び出すので、その終了時をフック。
  3. 一応実行コマンド名と、親コマンド名があってるかどうかチェック(適当ですね)。
  4. 引数の秒数部分を表示(本当はちゃんとユーザ空間アクセスチェックをすべき(笑))。

実行するとこんな感じ。

# stap sleepsort.stp 2 4 1 3  
1
2
3
4
^CToo many interrupts received, exiting.

最後自分でCtrl+Cを押す必要がある。最大値でもとっておけばいいんだろうけどねー。
やはり 「sleep」 sortなので、sleepを呼び出すところは譲れない。