2017-01-09 59 views
2

我創建了一個使用AppKit讀取系統範圍擊鍵的ncurses程序。要在運行程序時清除在命令行上累積的文本的牆,我在退出程序之前執行這一行代碼。C禁用命令行輸入

while((c = getch()) != '\n' && c != EOF) {} 

我的問題是如果有一個更有效的方法來解決這個問題。例如,在程序執行時禁用命令行輸入。

編輯:

我跑了一些測試,我的問題似乎根植於usleep而不是ncurses的或AppKit的。這裏有一個例子:

#include <unistd.h> 

int main() { 
    usleep(5000000); 
    return 0; 
} 
+0

當程序運行時,終端中的輸入應該在程序退出時被丟棄。應該沒有必要明確地做到這一點。 –

+0

對我來說,這是當我退出(0)程序的命令行: 的bash-4.4 $ ddddddaaaaaaaaaaawwwwwwwwwwdddddddddddddddddddddddddddddddddddddddddddddddddaaaaaaaaaaaaaaaaaaaaax –

+3

聽起來像一個XY問題。目前還不清楚你想完成什麼。提供一個[mcve]的細節。 – Olaf

回答

3

exit()之前嘗試tcflush(STDIN_FILENO, TCIFLUSH)


根據tcflush(3)

int tcflush(int fd, int queue_selector);

tcflush()寫入到對象丟棄數據通過fd稱爲但不傳送或接收的數據,但不能讀取,取決於queue_selector值:

TCIFLUSH :刷新收到的數據但不是r元首。
TCOFLUSH :刷新已寫入但未傳輸的數據。
TCIOFLUSH:刷新收到但未讀取的數據,以及寫入但未發送的數據。

+0

謝謝,它的作品,但我不知道這個功能可以完全禁用。 –

+0

我不認爲這是可能的。您的應用程序可以輕鬆忽略輸入,因此終端驅動程序無需提供此類功能,因爲它不能真正阻止用戶從鍵盤輸入。 – pynexj

2

詛咒提供的功能對於這一點,叫flushinp

flushinp常規扔掉已經 被用戶鍵入,並且還沒有被 程序讀取任何預輸入。

您的兩個節目片段不顯示這一點,但ncurses的手冊頁對initialization節建議您關閉回聲(由詛咒)開始:

initscr(); cbreak(); noecho(); 

無論你做或沒有,詛咒實際上將終端置於原始模式並選擇是否在程序以curses模式運行時回顯鍵入的字符。

第一個片段,使用getch是一個curses函數。 ncurses嘗試將所有輸入字符讀入自己的緩衝區,並按照程序需要的速度處理它們。 flushinp調用告訴它放棄緩衝的輸入。順便說一句,您的代碼應該使用ERR作爲檢查而不是EOF,儘管對於curses的大多數實現它們是相同的數值。

當程序停止curses模式(使用endwin)時,它將終端恢復到最初的模式,即回顯緩衝輸入。

代碼的其它片段不是一個詛咒應用。終端停留在烹飪模式(回聲,緩衝),並在終端驅動程序中累積,未被您的程序讀取。在退出程序時,下一個程序(或您的shell)有機會閱讀該程序。

至於建議(而隱含的),如果你的程序是不是在詛咒模式下運行它退出時,您可以使用POSIX termios calltcflush丟棄輸入端子,這是的ncurses做什麼(見source)未決。