【发布时间】:2015-08-06 12:50:38
【问题描述】:
我遇到了一些我无法解释的事情。没有比举个例子更好的解释方式了:
#include <stdio.h>
int main ()
{
char c;
while (1) {
c = getchar();
printf("%x\n", c);
}
return(0);
}
如果我执行这个命令,它只是以这种方式无限迭代:
$ echo -n "A" | ./binary
41
ffffffff
ffffffff
ffffffff
ffffffff
...
根据我所知道和读到的 (Confusion about how a getchar() loop works internally),我认为 echo -n "A" 会将 A 发送到 stdin,然后触发 EOF 事件 (我不确定 EOF 到底是什么)一次,因此我的循环最多会迭代两次,然后会休眠等待 stdin 中的新输入。 p>
但是不,它遍历 EOF,我不明白为什么。
我运行这个命令试图理解:
$ echo -n "A" | strace ./binary
read(0, "A", 4096) = 1
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 4), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ffff7ff6000
write(1, "41\n", 341
) = 3
read(0, "", 4096) = 0
write(1, "ffffffff\n", 9ffffffff
) = 9
read(0, "", 4096) = 0
write(1, "ffffffff\n", 9ffffffff
) = 9
...
所以看起来 read() 没有读取任何内容,并返回 0,getchar() 将其解释为 EOF。但是为什么,哦,为什么它会这样迭代,而当我以正常方式执行这个二进制文件时,它会按预期工作:
$ ./binary
A
41
a
B
42
a
^C
$
(上面的输出可能有点混乱,但是当我输入 A 然后 Return 时,我将 A 然后 \n (0x0a) 发送到标准输入,所以二进制文件只是以它们的十六进制表示形式显示这些,41 和 a)
有人可以向我解释一下吗?我错过了什么?
非常感谢阅读!
【问题讨论】:
标签: c loops pipe stdin getchar