簡體   English   中英

“凍結”終端輸出(/ dev / tty1)

[英]“freeze” terminal output (/dev/tty1)

我正在編寫一個直接在幀緩沖區(/ dev / fb0)上運行的應用程序(用Java)。

當我啟動我的應用程序時,當前活動控制台的光標仍然閃爍,並且如果我使用向上/向下之類的鍵盤鍵,控制台將顯示最近使用的命令並覆蓋幀緩沖區的內容。

我只能阻止光標閃爍:

setterm -cursor off > /dev/tty1

有沒有一種方法可以完全凍結(然后取消凍結)控制台?

似乎X服務器做同樣的事情。 如果引導進程在GraphicsCard-1上運行,而X-Server在GraphicsCard-2上運行,則當X啟動時,GraphicsCard-1上的輸出將立即停止(光標不閃爍)。 我想如果將video-out設置為framebuffer,mplayer也會這樣做。

謝謝你的任何想法:)

嚴格來說,您觀察到的行為更多是錯誤而不是功能。 這歸因於Linux沒有正確地使用多頭。 您所看到的是X服務器將其自己的已分配虛擬終端切換到控制台的效果。 這當然-因為只有一個虛擬終端可以在一個時間全系統的活性-切換出正被顯示的虛擬終端,即使它被顯示在另一顯示適配器完全。

您必須做一些X服務器正在做的事情,然后將自己的虛擬終端切換到控制台上。

openvt(1)允許您在新的虛擬終端中打開程序,而chvt(1)允許您切換到另一個虛擬終端。

要獲得我真正想要的東西,會有些棘手:

我必須執行(從外殼程序)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()方法不是最佳方法,但它對我來說卻是如此。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM