我正在编写一个(用java编写的)应用程序,它直接在framebuffer (/dev/fb0)上操作。
当我启动我的应用程序时,当前活动控制台的光标仍然闪烁,如果我使用键盘键,如向上/向下,控制台将显示最近使用的命令并覆盖帧缓冲区的内容。
我只能让光标停止闪烁:
setterm -cursor off > /dev/tty1有没有办法完全冻结(然后解冻)控制台?
看起来X-Server做了同样的事情。如果引导过程在GraphicsCard-1和GraphicsCard-2上的X-Server上运行,则当X启动时,GraphicsCard-1上的输出将立即停止(光标不闪烁)。我猜如果将video-out设置到帧缓冲区,mplayer也会这样做。
感谢您的任何想法:)
发布于 2011-06-25 04:28:20
严格地说,您所观察到的行为与其说是一个特性,不如说是一个bug。这是因为Linux并不是真正的多头系统。您看到的是X服务器将自己分配的virtual terminal切换到控制台的效果。当然,这是因为在系统范围内一次只有一个虚拟终端是活动的,所以即使虚拟终端完全显示在另一个显示适配器上,也会切换出正在显示的虚拟终端。
You have to do some of what the X server is doing, and switch your own virtual terminal onto the console.
发布于 2011-06-25 05:18:36
openvt(1)允许您在新的虚拟终端中打开程序,而chvt(1)允许您切换到另一个虚拟终端。
发布于 2011-06-25 14:58:11
要得到我真正想要的东西就有点棘手了:
我必须执行(从shell) 2个命令来让终端安静下来:
chvt 9
setterm -cursor > /dev/tty9稍后可以切换回1号航站楼:
setterm cursor > /dev/tty9
chvt 1我选择9号航站楼,但是任何大于7的数字都可以。如果从java应用程序中执行这些调用(如JdeBP所说,系统范围内只有一个虚拟终端),则这些调用也可以工作。只有setterm命令需要一些额外的步骤才能将输出通过管道传输到/dev/tty9:
Runtime.getRuntime().exec("chvt 9");
pipe("setterm -cursor off", "/dev/tty9");
private static void pipe(String cmd, String file) {
FileOutputStream fos = new FileOutputStream(file);
Process p = Runtime.getRuntime().exec(cmd);
InputStream is = p.getInputStream();
int i;
while ( (i = is.read()) != -1 ) {fos.write(i);}
p.waitFor();
fos.close();
is.close();
}也许管道()方法并不是最优的,但它对我来说是有效的。
https://stackoverflow.com/questions/6472780
复制相似问题