2017-03-28 82 views
0

我有下面一個很簡單的C函數:
在linux終端中輸入鍵的意思是什麼?

#include <stdio.h> 
#include <stdlib.h> 
int main(int argc, char *argv[]) 
{ 
    int c; 
    while ((c = getchar()) != EOF) 
     putchar(c); 
    return EXIT_SUCCESS; 
} 


我用gcc我的Linux操作系統終端上進行測試。 結果是:

d 
d 
e 
e 
f 
f 
5 
5 
56 
56 


我只是想知道:

1.爲什麼每次我按下回車鍵時,終端重複我剛纔輸入的字符?

2.爲什麼我會放兩個字符(56),這也起作用,這是如何工作的?

3.爲什麼只有輸入密鑰使終端重複,而不是其他密鑰?

4.在Linux終端或C程序中按Enter鍵是什麼意思?

+6

該代碼回顯您輸入的所有內容?什麼令人困惑呢? –

+1

你的應用程序只是複製輸入。一些關於重複的問題很簡單。 –

+0

@ChrisTurner這就是爲什麼輸入鍵執行這項工作,爲什麼不是其他鍵。 – SWIIWII

回答

6

終端輸入通過一個稱爲「tty」的內核特定對象進行管理。這個tty緩衝你之前輸入的數據(默認情況下)將數據傳遞給你的過程。這非常有用,因爲它可以讓您(作爲用戶)在將您的命令行發送到進程之前進行更正。 Tty緩衝通常處於行模式,這意味着輸入數據可以在緩衝區已滿或輸入換行符時傳遞。

所以,當你鍵入一個字符時,該字符不可用於你的進程,它在tty緩衝區內。然後你輸入一個新行,這兩行對你的進程是可用的,然後它可以讀取第一行,將它推送到輸出,然後讀取換行並將其壓入輸出。

Tty的行爲可以改變,例如參見命令stty。我鼓勵你閱讀「POSIX終端」。

+0

「_e if buffer is full_」 - 多少字符/字節會是?它的大小是否依賴於實現?它的典型尺寸是多少? –

+0

@CoolGuy至少記不住數百個。 –

3

爲什麼每次按下我的回車鍵,終端都會重複剛輸入的字符?

默認情況下,終端處理程序會回顯您輸入的所有內容。你的程序也迴應你輸入的所有內容。你可以用命令行stty來改變這種行爲,但是,老實說,你可能會發現它很混亂。還有一個POSIX C API可能會更有用。

爲什麼我把兩個字符(56),這也起作用,這是如何工作的?

你輸入的每個字符都被髮送到程序。您的程序一次只讀一個。

爲什麼只有回車鍵讓終端重複,而不是其他鍵?

終端程序的正常模式是緩衝字符,直到收到換行符,然後一次發送它們。你的程序實際上大部分時間都在getchar()上等待角色,然後當你按下新的一行時,它會一邊處理每個角色一邊發生一連串的活動。

相關問題