传统的 UNIX 对 tty 字符的解释是在读取熟 tty 行缓冲区中缓冲的任何内容后EOF
使阻塞返回。read
在新行的开头,这意味着read
返回 0(读取零字节),顺便提一下,0-sizedread
是如何检测普通文件的文件结束条件。
这就是为什么行中间的第 EOF
一个只是强制行的开头是read
,而不是让 C 运行时库检测到文件的结尾。一行中的两个 EOF
字符会产生 0 大小的读取,因为第二个字符会强制read
应用程序使用空缓冲区。
$ cat
foo[press ^D]foo <=== after ^D, input printed back before EOL, despite cooked mode. No EOF detected
foo[press ^D]foo[press ^D] <=== after first ^D, input printed back, and on second ^D, cat detects EOF
$ cat
Some first line<CR> <=== input
Some first line <=== the line is read and printed
[press ^D] <=== at line start, ^D forces 0-sized read to happen, cat detects EOF
我假设您的 C 运行时库模仿了上述语义(在 Windows 上没有调用^Z
级别的特殊处理kernel32
,更不用说系统调用了)。这就是为什么它可能会^Z^Z
在输入行中间检测到 EOF 的原因。