2011-06-24 127 views
0

我正在写一个直接在帧缓冲区(/ dev/fb0)上运行的应用程序(在java中)。“freeze”终端输出(/ dev/tty1)

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

我才能够从停止闪烁光标:

setterm -cursor off > /dev/tty1 

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

这似乎是一个X - 服务器做同样的事情。如果引导进程在GraphicsCard-1和GraphicsCard-2上的X-Server上运行,则在X启动时,GraphicsCard-1上的输出将立即停止(不闪烁光标)。我想mplayer也会这样做,如果将视频输出设置到帧缓冲区。

感谢任何想法:)

回答

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.

+0

啊,我明白了。这就说得通了。谢谢! – kazu

0

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

0

它更多的是一个有点棘手得到什么我正是想:

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

也许管道()方法是不是最佳的,但它的工作对我来说是这样的。