我被 K&R 中的 1.5.2 问题难住了。我在谷歌上搜索了一段时间,发现我必须在输入字符后提供 EOF 输入。
long nc = 0;
while (getchar() != EOF)
++nc;
printf("%ld\n", nc);
return 0;
我尝试将 command-D 和 control-D 作为 EOF 输入,但没有任何效果。知道如何为 Mac OS X 提供 EOF 吗?
最佳答案
默认情况下,当在行首按下 Control-D 时,macOS(以前称为 OS X 和 Mac OS X)软件会识别 EOF
。 (我相信其他版本的 Unix 也有类似的行为。)
具体来说,实际操作是,当按下 Control-D 时,终端输入缓冲区中的所有字节都使用终端发送到附加/前台进程。在一行的开头,缓冲区中没有字节,因此进程被告知可用字节为零,这充当 EOF
指示器。
此过程兼作在行尾之前向进程传递输入的方法:用户可以键入一些字符并按 Control-D,这些字符将被发送到进程立即,无需通常等待输入/返回被按下。执行此“立即发送所有缓冲字节”操作后,缓冲区中不会留下任何字节。因此,当 Control-D 被第二次按下时,它与一行的开头相同(没有字节被发送,并且进程被赋予零字节),并且它的作用就像一个 EOF
。
您可以通过在终端中使用命令“man 4 tty”来了解有关终端行为的更多信息。默认的行规程是 termios。您可以使用命令 man termios
了解有关 termios 行规程的更多信息。
关于c - mac osx 终端中的信号 EOF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21364313/