2014-01-26 225 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这是我找到的信息。