首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"freeze“终端输出(/dev/tty1)

"freeze“终端输出(/dev/tty1)
EN

Stack Overflow用户
提问于 2011-06-25 03:23:39
回答 3查看 1.7K关注 0票数 0

我正在编写一个(用java编写的)应用程序,它直接在framebuffer (/dev/fb0)上操作。

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

我只能让光标停止闪烁:

代码语言:javascript
复制
setterm -cursor off > /dev/tty1

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

看起来X-Server做了同样的事情。如果引导过程在GraphicsCard-1和GraphicsCard-2上的X-Server上运行,则当X启动时,GraphicsCard-1上的输出将立即停止(光标不闪烁)。我猜如果将video-out设置到帧缓冲区,mplayer也会这样做。

感谢您的任何想法:)

EN

回答 3

Stack Overflow用户

发布于 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.

票数 0
EN

Stack Overflow用户

发布于 2011-06-25 05:18:36

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

票数 0
EN

Stack Overflow用户

发布于 2011-06-25 14:58:11

要得到我真正想要的东西就有点棘手了:

我必须执行(从shell) 2个命令来让终端安静下来:

代码语言:javascript
复制
chvt 9
setterm -cursor > /dev/tty9

稍后可以切换回1号航站楼:

代码语言:javascript
复制
setterm cursor > /dev/tty9
chvt 1

我选择9号航站楼,但是任何大于7的数字都可以。如果从java应用程序中执行这些调用(如JdeBP所说,系统范围内只有一个虚拟终端),则这些调用也可以工作。只有setterm命令需要一些额外的步骤才能将输出通过管道传输到/dev/tty9:

代码语言:javascript
复制
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();
}

也许管道()方法并不是最优的,但它对我来说是有效的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6472780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档