c - mac osx 终端中的信号 EOF

标签 c kernighan-and-ritchie

我被 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/

相关文章:

C Web 服务器,图像未显示在浏览器上?

c - 访问和修改局部静态变量

c - typedef 内部如何工作(在编译器级别)?

c - K&R 第 2 版,示例 1.9 字符数组

c - 删除显示的字符

c - 为什么来自 K&R 的某些代码在代码 :Blocks? 中不起作用

c - K&R 第 5.4 章 : Questions on passage regarding stacks

C程序在字符串中存储特殊字符

c - 如何在 Xcode 中用 C 执行文件 I/O?

c - C 问题 : Vacated Bits Not 0 When Shifting ~0? 中的右移无符号整数