执行以下C代码
#include <stdio.h>
int main(int argc, char **argv) {
char stdinput[10];
while (1) {
fgets(stdinput, 10, stdin);
fputs(stdinput, stdout);
}
}
产生
通过控制台:
./a.out
input
input
然后等待更多输入。也就是说,它与stdout相似,与cat
类似。
通过管道
echo input | ./a.out
input
input
input
[...]
启动后,它会自动淹没控制台,无需互动。
这个示例程序正是我用于测试的程序;这不是削减。 我希望这两个测试的行为方式相同。发生了什么事?
答案 0 :(得分:7)
一旦达到EOF
,fgets
立即返回NULL而不等待输入(或修改缓冲区)。因此,它将无限循环。在您的管道案例中,echo
会在写入"input\n"
后关闭管道,从而产生EOF。
将fgets
来电更改为
if(fgets(stdinput, 10, stdin) == NULL)
break;
答案 1 :(得分:6)
您可以通过fgets
来代替您的循环条件,并提供:
#include <stdio.h>
int main(int argc, char **argv) {
char stdinput[10];
while (fgets(stdinput, 10, stdin)) {
fputs(stdinput, stdout);
}
}
这将循环,直到你得到一个EOF,在这种情况下fgets()
返回NULL就像@nneonneo said一样。但是在这种情况下,您不必破坏while()
。
答案 2 :(得分:0)
[注意:解决了错误的问题。]
请参阅http://sweslo17.blogspot.tw/2012/04/c-standard-input-redirection.html。
在fgets()
之后,您可以添加以下代码以再次恢复stdin
以解决管道问题。
freopen("/dev/tty","rb",stdin);