2012-08-31 148 views
2

首先,有點背景:我正在VirtualBox VM中運行Crunchbang Linux的最新穩定版本。我正在設計一個自定義的基於文本的用戶界面,以在bash之上運行。這是通過C++和bash腳本的組合完成的。Linux - 丟棄鍵盤輸入

我有時需要完全徹底地消除用戶爲系統提供任何標準鍵盤輸入的能力。這是因爲,當我運行系統的一部分時,用戶被迫等待一段時間。
不幸的是,用戶仍然可以在輸入時輸入,而他們輸入的內容都會顯示在屏幕上。當我運行C++程序和bash腳本時,會發生這種情況。這是一個問題,原因是屏幕上有用戶要閱讀的文本,如果他們可以輸入文本,則會替換文本。稍後還會有其他用途,例如使系統看起來像凍結了一樣。

所以,問題 - 如何

  1. 禁用鍵盤,或
  2. 防止在屏幕上顯示了在鍵盤上按下什麼?
+1

如果您得到的答案不令人滿意,請提供有關所涉及過程的實際交互的更多詳細信息。另外,用戶甚至不能離開終端或做任何事情,都需要一個「信息亭模式」嗎? –

+0

您是否考慮過使用'readline'或'ncurses'庫?你有沒有考慮使用或定製一些受限制的shell(可能不是'bash')?什麼,爲什麼你試圖達到? –

回答

4

關閉回波模式stty -echo或等效C代碼(這將使用tcgetattrtcsetattr)。當您準備好再次接受輸入時,將其重新打開。您也可能希望放棄在您不期待的情況下到達的輸入。這將與tcflush完成,但請注意,一些用戶(如我)會認爲這是一個煩惱。 Typeahead是一個功能,而不是一個bug!

+0

感謝您的幫助。這工作正是我需要它。雖然typeahead當然是一個功能,但它只是一個功能,只要它實際上被用作打字頭。當我需要它被禁用的時候,當用戶沒有什麼可做的時候。就像你可以使用這個術語,一個遊戲一樣,並且在模擬處理時間(比如,Linux通常顯示其啓動信息的時間)內打印一個字符,這將會很麻煩。 –

0

要查看用戶輸入到某個進程或tty的方式可以被攔截,手冊頁和interceptty的源代碼可能是有啓發性的。 (沒有經驗)

但是,你很難(完全)阻止用戶輸入。如果未禁用,用戶可能總是能夠切換到不同的虛擬終端(如果有的話)或至少使用Alt + Print + B(Magic SysRq_key)重新啓動系統。忽略給定tty上的輸入並完全禁用鍵盤輸入是兩件不同的事情。

+1

這個答案是基於一些公然錯誤的想法。 「當一個進程正在運行時,任何按鍵都由該進程處理,而不是(自動)在終端上打印」?你應該仔細閱讀tty是如何工作的。提示:在shell提示符下運行'sleep 30'。當它運行時,鍵入一些東西。它呼應。你認爲睡眠計劃是這樣做的嗎? –

+0

思考了一下,並適應了......在這裏和時間可能就太遲了;) –