2011-06-24 90 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(); 
} 

也許管道()方法是不是最佳的,但它的工作對我來說是這樣的。