上一回我們介紹了透過 stty 系統指令關閉終端緩衝,這次將改用終端的 termios 程式介面來達成同樣目標。termios 的基本概念已於第 171 回說明,此處直接進入實作步驟。
tcgetattr() 取得目前終端設定,並備份以便稍後還原。c_lflag 的 ICANON 位清除。tcsetattr() 套用修改後的設定(這裡示範 TCSAFLUSH 與 TCSANOW 兩種模式)。tcsetattr() 還原終端原狀。// 取得並備份終端設定
tcgetattr(fd, &init_setting);
change_setting = init_setting;
// 關閉標準輸入緩衝(非標準模式)
change_setting.c_lflag &= ~ICANON;
printf("--- buffer function is closed ---\n");
printf("please input a character: ");
// 套用新設定,TCSAFLUSH 會先清空輸入/輸出佇列
res = tcsetattr(fd, TCSAFLUSH, &change_setting);
ch = getchar(); // 此時無需按 Enter 即可讀取單一字元
if (ch != 0) {
// 立即還原終端設定
tcsetattr(fd, TCSANOW, &init_setting);
printf("\ninput is: %c\n", ch);
}
fd 可由 fileno(stdin) 取得。位元操作 &= ~ICANON 將 ICANON 位清零,即關閉規範模式(緩衝)。TCSAFLUSH 會在套用前刷清佇列;TCSANOW 則立即生效。
--- buffer function is open ---
please input a character
a // 緩衝開啟:需按 Enter 才送出
input is: a
--- buffer function is closed ---
please input a character
a // 緩衝關閉:輸入即送出
input is: a
完整原始碼可至資源區下載。下一回將繼續帶來更多 C 語言實戰範例,敬請期待。