2008-12-11 100 views
34

我正在學習考試,對於在Unix中canonical與non-canonical輸入/輸出如何工作(例如curses)我感到困惑。我知道有一個緩衝「線條」適用於規範輸入。這是否意味着緩衝區被非規範輸入繞過,還是僅僅意味着沒有行規則被應用?輸入和輸出操作的過程如何不同?典型與非典型終端輸入

在我使用過的演示規範輸入的curses程序中,用戶輸入的輸入會在輸入一定數量的字符或經過一定的時間後自動輸入。這些事情中的任何一種都被視爲「線條規範」還是完全不同?

回答

72

對於規範輸入 - 思考殼;實際上,認爲好的老式Bourne shell,因爲Bash和親戚都有命令行編輯。你輸入一行輸入;如果您犯了錯誤,則使用擦除字符(默認爲退格,通常;有時刪除)刪除前一個字符。如果你完全搞砸了,你可以用行殺字符取消整行(不完全標準化,通常是Control-X)。在某些系統上,您可以使用Control-W進行單詞擦除。所有這些都是標準輸入。整行收集並編輯,直到行尾字符— 返回 —被按下。於是,整條線路可用於等待節目。根據未完成的read()系統調用,整行可供讀取(通過對read()的一個或多個調用)。

對於非規範輸入—認爲vivim或任何—你按一個字符,它可以立刻提供給程序。在你迴歸之前,你不會被阻止。系統不會編輯字符;只要輸入它們,程序就可以使用它們。這個程序要適當地解釋事情。現在,vim的確做了許多看起來有點像標準輸入的東西。例如,退格鍵向後移動,並在輸入模式下刪除那裏的內容。但那是因爲vim選擇使其表現如此。

典型和非典型輸出是一個不那麼嚴重的業務。這裏有一些不同之處,涉及到是否在換行前回顯回車,以及是否延遲(電子設備不必要;在輸出設備可能是110分鐘的時候很重要)波特電傳)。它也可以做一些事情,例如再次處理不區分大小寫的輸出設備— teletypes。小寫字母以大寫形式輸出,大寫字母以反斜槓和大寫字母形式輸出。

它曾經是因爲如果您輸入所有大寫字母到登錄提示符,那麼登錄程序會自動轉換到所有大寫字母都在每個實際大寫字母前加反斜槓輸出的模式。我懷疑這不再是在電子終端上完成的。


在評論,TitaniumDecoy問:

因此,與非規範輸入,是完全繞過輸入緩衝區?此外,線路規程是在哪裏進行的?

對於非規範輸入,仍然使用輸入緩衝區;如果沒有read()呼叫等待終端輸入的程序,則字符保存在輸入緩衝區中。沒有發生什麼是輸入緩衝區的任何編輯。

線條規則就像輸入編輯所做的一組操作一樣。因此,線條規則的一個方面是,擦除字符會在規範輸入模式中擦除前一個字符。如果設置了icase(輸入大小寫映射),則大寫字符將映射爲小寫,除非前面加反斜槓;這是一條線條規範,我相信,或者線條規範的一個方面。


我忘了提及,EOF處理(控制-d)在規範模式處理;它實際上意味着'使累積輸入可用於read()';如果沒有累積輸入(如果在行的開頭鍵入Control-D),則read()將返回零字節,然後程序將其解釋爲EOF。當然,你可以在鍵盤上快樂地鍵入更多的字符,而忽略EOF(或者以非規範模式運行)的程序會很開心。

當然,在規範模式下,鍵盤上鍵入的字符通常會回顯到屏幕上;您可以控制是否發生回聲。但是,這與標準輸入有點切線。即使回聲關閉,也會進行正常編輯。

類似地,中斷和退出信號是規範模式處理的假象。作業控制信號也是如此,例如Control-Z暫停當前進程並返回到shell。同樣,流量控制(Control-S,Control-Q停止並開始輸出)由規範模式提供。

Rochkind的Advanced Unix Programming, 2nd Edn的第4章介紹了終端I/O,並提供了大量信息 - 以及更多信息。其他的UNIX編程書籍(至少是好的)也會覆蓋它。

+1

因此,對於非規範輸入,輸入緩衝區是否完全被旁路?此外,線路規程是在哪裏進行的? – titaniumdecoy 2008-12-11 03:45:14