2014-01-26 222 views
25

我被K.2.2.R中的1.5.2問題難住了。我搜索了一段時間,發現在輸入字符後我必須提供EOF輸入。在mac osx終端中的信號EOF

long nc = 0; 

while (getchar() != EOF) 
    ++nc; 
printf("%ld\n", nc); 

return 0; 

我試過commnad-D和control-D作爲EOF輸入,但沒有任何工作。任何想法如何爲mac osx提供EOF?

+2

https://discussions.apple.com/message/11198745#11198745 – Dave

回答

48

默認情況下,OS X(以前的Mac OS X)終端識別EOF

詳細地,實際操作是,當Ctrl鍵按下 - d,在終端的輸入緩衝器中的所有字節使用該終端被髮送到正在運行的進程。在行的開始處,緩衝區中沒有字節,因此該過程被告知有零字節可用,並且這起到EOF指示符的作用。

此過程兼作輸送輸入到過程中的線的端部之前的方法:用戶可以鍵入一些字符,然後按Ctrl鍵 - d,字符將被立即發送到過程中,沒有通常的等待輸入/返回被按下。在「立即發送所有緩衝的字節」操作之後,緩衝區中沒有剩餘字節。所以,當Ctrl - D被第二次按下時,它與一行的開始一樣(沒有字節被髮送,並且該過程被賦予零字節),並且其行爲如同EOF

通過在終端中使用命令「man 4 tty」,您可以瞭解更多關於終端行爲的信息。默認的線路規程是termios。通過使用命令man termios,您可以瞭解有關termios line紀律的更多信息。

+0

你能幫我理解'getchar()'是如何工作的嗎?我認爲char一次只能容納一個角色。當我在終端輸入一個像'hdjshj'這樣的字符串並輸入文件末尾時,'getchar'會立即存儲整個字符嗎?或者一旦將字符輸入終端並在遇到EOF時停止存儲該字符,它就會存儲該字符嗎? – Morpheus

+3

@Morpheus:在我的回答中討論的字符處理在'getchar'看到字符之前/之前。 'getchar'是程序中軟件的一部分(由軟件庫鏈接),用於管理文件和緩衝區。該軟件調用類似「read」系統調用來獲取字節。另外,還有一些軟件可以操作您看到的「終端」窗口,以及從鍵盤讀取字符的軟件。終端軟件通過鍵盤接收字符(通過附加層系統軟件)並對其進行處理... –

+2

@Morpheus:...通常,終端軟件會在它所維護的緩衝區中記住普通字符,並以各種方式處理特殊字符。例如,當它看到一個控制C時,它可能會向正在運行的進程發送一個信號來中斷它。當它看到一個return/enter時,它會將緩衝的字符和return/enter發送到正在運行的進程。當字符以這種方式發送到正在運行的進程時,'read'系統調用將它們返回給調用者。調用者是該軟件的一部分,用於管理程序中的文件和緩衝區... –

7

我只是想通了。您必須按Ctrl + D + D。按住該控件並按兩次D。我必須說出一個奇怪的鍵序列。 d在一行的開頭按下 - 當按Ctrl

+0

這不回答這個問題:「任何想法如何爲mac osx提供EOF?」 – user3629249

+0

它適用於Mac!謝謝 – Hoto

8

如果你想看到什麼EOF被設置爲在終端中,可以鍵入

stty all 
在我的Mac

,這給輸出 -

speed 9600 baud; 24 rows; 80 columns; 
lflags: icanon isig iexten echo echoe -echok echoke -echonl echoctl 
    -echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo 
-extproc 
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel iutf8 
-ignbrk brkint -inpck -ignpar -parmrk 
oflags: opost onlcr -oxtabs -onocr -onlret 
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow 
-dtrflow -mdmbuf 
discard dsusp eof  eol  eol2 erase intr kill lnext 
^O  ^Y  ^D  <undef> <undef> ^?  ^C  ^U  ^V  
min  quit reprint start status stop susp time werase 
1  ^\  ^R  ^Q  ^T  ^S  ^Z  0  ^W  

你可以看到四個排隊從底部開始,eof中的三個單元是^ D。

有一個更全面的描述here這是我找到的信息。