2013-03-12 24 views
-3

有了這個代碼未知的行爲,當我把輸入時,將不會出現,當我註釋掉它的出現,這是什麼代碼做以下,結構termios的用C

struct termios origConfig; 
tcgetattr(0, &origConfig); 
struct termios newConfig = origConfig; 
newConfig.c_lflag &= ~(ICANON|ECHO); 
newConfig.c_cc[VMIN] = 1; 
newConfig.c_cc[VTIME] = 1; 
tcsetattr(fileno(stdin), TCSANOW, &newConfig); 
+0

你可以添加結構termois聲明和一個小代碼,可以重現問題嗎? – Pradheep 2013-03-12 05:42:39

+0

@Pradheep不需要添加聲明,它是一個標準頭文件。 – 2013-03-12 05:43:12

+0

@Pradheep該結構位於termios.h中。 http://man7.org/linux/man-pages/man3/termios.3.html – 2013-03-12 06:12:17

回答

1
newConfig.c_lflag &= ~(ICANON|ECHO); 

將重置回聲和規範輸入標誌。如果您不想要重置回波標識(但保留一切),只需使用:

newConfig.c_lflag &= ~(ICANON); 

altough你可能還需要檢查規範輸入標記是如何工作的,以及。例如,請參閱Linux termios man page

在任何情況下,它可能是不明智的,因爲對非規範輸入的主要用例一個使用一個沒有其他的東西像編輯器,在那裏你想要的字符呼應。

非caconical輸入給你每個字符,因爲它是鍵入(而不是一個完整的行當你擊中ENTER),編輯的理想選擇。如果您的編輯需要處理諸如CTRL-W以前進一個單詞,那麼您可能不希望它在屏幕顯示中間敲擊^W

相反,你會希望它把輸出留給程序,而不是終端界面。非規範的非回聲終端I/O爲您提供了更多的接口功能。

0

tcsetattr()功能控制用戶終端的行爲。在這種情況下,代碼將清除控制結構中的ECHO標誌(newConfig.c_lflag &= ~ECHO這樣做),因此用戶輸入的內容不會回顯。

+0

@ H2C03我該如何解決它,同時保持代碼? – NoNameY0 2013-03-12 05:44:06

+1

:-O你不是真正的H2CO3,他在他的DisplayPicture上有Penguin :-P – 2013-03-12 05:44:40

+0

呃......這就是這段代碼的重點。如果你不想關閉輸入回顯,不要運行這個! – duskwuff 2013-03-12 05:44:46