HACK#73 使用SystemTap编写对话型程序

本节使用SystemTap在内核中执行交互式(interactive)程序。

虽然在执行时有一些制约,但SystemTap还是可以作为一种脚本语言来处理。既可以向控制台输出,也可以调用外部程序。另外,还可以追踪Linux内核上获取的信息,因此也可以得到键盘输入或鼠标输入的情况。也可以编写内核计时器的处理程序,因此可以每隔一定时间更新状态。但是反过来说,复杂且花费时间的处理就会长时间停止内核自身的处理,因此不适合使用SystemTap。

也就是说,SystemTap是适用于编写游戏等对话型程序的语言。特别是,计时器周边的处理不会发生延迟,因此如果无视禁止硬件中断的影响,就可以进行最快的周期处理。本节将介绍怎样使用SystemTap接受用户的输入,怎样进行简单的界面控制。

使用SystemTap进行输出界面控制

SystemTap的输出为控制台。要对控制台进行控制,使用ANSI转义序列(escape sequence)是最简单的。SystemTap为此准备了库函数(见表8-14)。

HACK#73 使用SystemTap编写对话型程序 - 图1

HACK#73 使用SystemTap编写对话型程序 - 图2

熟练使用ansi_clear_screen和ansi_cursor_move,就可以每隔一定时间更改控制台界面,或者在任意位置写入任意文字。例如,执行下列脚本,就可以在看到“@”在界面上斜着运动。


global x=40,y=1;

probe timer.ms(100){

ansi_clear_screen()

ansi_cursor_move(x—,y++/2)

print("@")

if(x==0)

exit()

}


像这样重复地使计时器失效,每隔一定时间刷新界面,并绘制新状态,就可以在界面上自由显示文字。