mac osx终端中的信号EOF

时间:2014-01-26 14:02:42

标签: c kernighan-and-ritchie

我对K& R的1.5.2问题感到困惑。我用Google搜索了一段时间,发现在输入字符后我必须提供EOF输入。

long nc = 0;

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

return 0;

我尝试将commnad-D和control-D作为EOF输入,但没有任何效果。任何想法如何为mac osx提供EOF?

3 个答案:

答案 0 :(得分:59)

默认情况下,OS X(以前称为Mac OS X)终端在行开头按 Ctrl - D 时识别EOF

详细说明,实际操作是,当按下 Ctrl - D 时,终端输入缓冲区中的所有字节都将使用终端发送到正在运行的进程。在一行的开头,缓冲区中没有字节,因此告诉进程可用零字节,这就是EOF指示符。

此过程兼作在行结束前向流程传递输入的方法:用户可以键入一些字符并按 Ctrl - D ,并且字符将立即发送到进程,而不是通常等待进入/返回按下。在执行“立即发送所有缓冲的字节”操作之后,缓冲区中不会留下任何字节。因此,当第二次按 Ctrl - D 时,它与行的开头相同(不发送任何字节,并且该过程被赋予零字节) ,它就像一个EOF

您可以在终端中使用命令“man 4 tty”了解有关终端行为的更多信息。默认的线路规则是termios。您可以使用命令man termios了解有关termios线路规则的更多信息。

答案 1 :(得分:11)

如果要查看终端中设置的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,这是我找到信息的地方。

答案 2 :(得分:7)

我只是想通了。您必须按 Ctrl + D + D 。按住控件并按 D 两次。我不得不说一个奇怪的键序列。