“冻结”终端输出(/ dev / tty1)

时间:2011-06-24 19:23:39

标签: linux console freeze

我正在编写一个直接在framebuffer(/ dev / fb0)上运行的应用程序(在java中)。

当我启动我的应用程序时,当前活动控制台的光标仍然闪烁,如果我使用上/下键盘键,控制台将显示最近使用的命令并覆盖帧缓冲区的内容。

我只能阻止光标闪烁:

setterm -cursor off > /dev/tty1

有没有办法完全冻结(后来解冻)控制台?

似乎X-Server做同样的事情。如果启动过程在GraphicsCard-1和GraphicsCard-2上的X-Server上运行,则当X启动时,GraphicsCard-1上的输出将立即停止(没有闪烁的光标)。我想mplayer也会这样做,如果将视频输出设置为帧缓冲区。

感谢任何想法:)

3 个答案:

答案 0 :(得分:0)

严格来说,您观察到的行为更多的是错误,而不是功能。这是因为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.

答案 1 :(得分:0)

openvt(1)允许您在新的虚拟终端中打开程序,chvt(1)允许您切换到另一个虚拟终端。

答案 2 :(得分:0)

得到我想要的东西有点棘手:

我必须执行(从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();
}

也许pipe()方法不是最优的,但它对我来说就像它一样。