2014-04-26 38 views
3

考慮下面的代碼:輸入回顯在Linux終端中如何工作?

#include <stdio.h> 
#include <termios.h> 
#include <unistd.h> 

void disable_echoing() 
{ 
    termios t; 
    tcgetattr(STDIN_FILENO, &t); 
    t.c_lflag &= ~ECHO; 
    tcsetattr(STDIN_FILENO, TCSANOW, &t); 
} 

int main() 
{ 
    sleep(1); 
    printf("disabling echoing\n"); 
    disable_echoing(); 
    getchar(); 
} 

此方案休眠一秒鐘,然後禁用輸入字符呼應,然後讀取的輸入字符。

如果我在禁用回聲後鍵入輸入字符,則不回顯字符。到現在爲止還挺好。

如果我在回顯被禁用前鍵入一個輸入字符,該字符會被回顯。但是這個節目現在正在睡覺。我的問題是:如果程序正在睡覺,請問在做什麼迴響?

我問這個問題的動機是,Windows上的一個類似程序(顯然,禁用回顯的具體機制不同)的行爲不同:即使在程序處於睡眠狀態時鍵入輸入字符,也不會發生回顯,程序從睡眠狀態中醒來,它會在運行會執行回顯的代碼(getchar())之前禁用回顯,因此仍然不會發生回顯。

+0

可能是您的終端程序... –

+0

@MarcusRickert但是,當連接到遠程計算機時,輸入通常回聲緩慢,如果連接速度慢... – aschepler

+0

回聲似乎以許多不同的方式處理。也許https://en.wikipedia.org/wiki/Echo_%28computing%29可以揭示一些事情。 –

回答

4

我的問題是:如果程序正在休眠,那麼回顯是什麼?

The kernel's tty layer.

輸入和輸出穿過一個tty - 無論它是一個串行端口,一個虛擬控制檯或PTY - 由內核根據其TTY的當前配置處理。該處理是極其複雜的,並且可以包括所有以下特徵:輸入和輸出的

  • 排隊和處理流控制
  • 波特率和奇偶校驗處理(對於串行線)的
  • 飼養軌道終端的大小,以行和列
  • 線緩衝和編輯
  • 呼應輸入到輸出
  • 字符轉換:
    • 轉換輸出換行的以CR + NL序列
    • 輸入退格轉化爲DEL字符選項卡
    • 轉換爲空格(默認關閉)
    • 轉換退格字符的交替序列,例如abc^H^H^Habc\cba/(默認關閉,使用用於不能抹去字符硬拷貝終端)
  • 解釋的各種類型的輸入的控制序列:
    • 一些將信號發送到前臺進程,像^C^Z
    • 某些觸發基本行編輯在內核,諸如1 H退格鍵,用於殺滅字^W,和爲^ U爲殺線。
    • 一些與流量控制相互作用,如^S^Q

總之,有一個很多工作由內核的TTY層完成!它不僅僅是將輸入傳遞給輸出。

Windows沒有與UNIX系統相同的tty層。它確實有一個控制檯,但它的工作原理非常不同 - 我的理解是,它主要是用來模擬PC BIOS的文本模式,而不是終端。