从终端运行时,hexdump
不会对行首的单个做出反应^D
,就像cat
, od
,bc
等一样,除非还没有输入:
prompt% hexdump -C
<control-D>
prompt% hexdump -C
hello
<control-D><control-D> # a single ^D won't do
00000000 68 65 6c 6c 6f 0a |hello.|
00000006
我可以在 fedora 28 和 debian 9 上重现它。尽管hexdump
由bsdmainutils
Debian 提供,但在 bsd 上不会发生这种情况。
这只是一个错误吗?是否有任何其他已知的程序表现出这种行为?
感谢@JdeBP 的提示,我能够创建一个与以下内容相同的小测试用例
hexdump
:在基于 glibc 的系统(典型的 linux 桌面)上运行时。
在 bsd、solaris、busybox (uclibc)、android 等上运行时:
根据我对标准的不专业解释,这看起来像是 glibc(GNU C 库)中的一个错误。
关于
fread
:关于
fgetc
:即使设置了 eof 指示符,glibc 似乎也会尝试“获取下一个字节”。
事实上,它实际上是GNU C 库中的一个错误,而不存在于 BSD 或 musl C 库中。 它在 2005 年就已为人所知。Ulrich Drepper 在 2007 年关闭了错误报告,但没有修复错误。 在 2012 年进行了讨论,注意到其他 C 库没有也没有这种行为,1999 年的 C 标准对此非常具体,并且 Solaris甚至有一个特殊的机制,当
c99
被用作编译器而不是cc
.它终于在 2018 年修复。该修复程序位于 GNU C 库的 2.28 版中。当前 Debian 的“稳定”版本,版本 9,在 GNU C 库的 2.24 版本上,因此这个错误在被报告 14 年后继续表现出来。
正如 GNU C 库讨论中所指出的,有可能编写的软件需要 GNU C 库的怪癖,而不考虑其他 C 库,例如 musl 或其他平台上的行为。然而,在上述多年来的讨论中,没有发现这样的计划。鉴于一些程序被旧的 GNU C 库破坏,要求用户连续两次发出 EOF 信号,已被确定;
hexdump
包括这里和patch
2018 年的 StackOverflow 上的其他内容。strace 的输出
在这里,我做了 hello «ctrl-d» hello «ctrl-d» «ctrl-d» (第二个 hello 在日志输出中被截断)。所以看起来它是这样编程的。
运行 strace
ll /proc/self/fd/1
strace hexdump -C 2>/dev/pts/«number-at-end-of-output-of-previous-command»