簡體   English   中英

為什么Linux(?)終端不“消耗”'\\ n'EOF?

[英]Why does the Linux(?)-Terminal not “consume” '\n' EOF?

根據我的閱讀,Linux終端(默認設置)將緩沖輸入,並且僅在接收到EOF'\\n'之后才發送輸入。

當我循環c = getchar(); 並檢查每個c是否為EOF (結束然后中斷),我需要做兩次 CTRL-D以停止讀取,因為第一個EOF總是被終端消耗(我知道一個人可以將終端更改為raw,但是也許這是有點矯kill過正)。

但是,當我檢查c是否為'\\n' (也會發送輸入)時,它不會被使用。

例:

  • 輸入:“ abc \\ n”
    • 讀取的字符: 'a''b''c''\\n'
  • 輸入:“ abc”和Ctrl-D
    • 讀取的字符: 'a''b''c'
  • 輸入:“ abc”,再次按Ctrl-D和Ctrl-D
    • 讀取的字符: 'a''b''c'EOF
  • 輸入:“ abc”,返回和Ctrl-D
    • 讀取的字符: 'a''b''c''\\n'EOF

這不是很矛盾嗎? 還是背后有任何理由?

我想解析包含空格的輸入,因此無法檢查'\\n'而是檢查EOF在不將終端更改為raw的情況下是否可行?

我也嘗試過feof(stdin) ,但是顯然這也不起作用:/

您誤解了Ctrl-D的功能。 Ctrl-D不會發送EOF,而是將終端緩沖區的當前內容發送到文件描述符,因此它將在下一個read調用中返回。

另一方面,EOF是read調用返回0個字符時。 因此,當終端緩沖區為時,ctrl-D僅會導致EOF。

那不是它的工作原理。 ^D在當前緩沖的行上發送,因此,如果您在換行符之后沒有立即擊中它,則您的程序將不會看到空讀取,並且也不知道輸入已結束。 因此,您需要另一個^D來不發送任何內容。 但是您的程序永遠不會看到^D

實際上,您可以使用stty更改終端的EOF字符,例如, ^N將結束輸入; 您的程序將完全相同地運行,因為它不依賴於EOF鍵盤字符的值。

PS。 由於您正在嘗試編寫C程序,因此當它們嘗試讀取文件時,輸入調用將返回EOF ,並獲得一個空緩沖區(0個字符)。 事實上, EOF不是^D如你想象,但-1 :之所以選擇這個值,因為它適合在一個字節,而read()可以合法地返回任何可能的字節(是的,甚至'\\04' aka ^D )。 這就是為什么getchar()的簽名說它返回一個int

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM