执行以下C代码
#include <stdio.h>
int main(int argc, char **argv) {
char stdinput[10];
while (1) {
fgets(stdinput, 10, stdin);
fputs(stdinput, stdout);
}
}
Run Code Online (Sandbox Code Playgroud)
生产:
通过控制台:
./a.out
input
input
Run Code Online (Sandbox Code Playgroud)
然后等待更多输入.也就是说,它与stdout一样回应stdout,类似于cat.
通过管道:
echo input | ./a.out
input
input
input
[...]
Run Code Online (Sandbox Code Playgroud)
启动后,它会自动充斥控制台,无需互动.
这个示例程序正是我用于测试的程序; 这不是削减.我希望这两个测试的行为方式相同.发生了什么?
一旦EOF到达,fgets立即返回NULL而不等待输入(或修改缓冲区).因此,它将无限循环.在您的管道箱中,echo一旦写入管道就会关闭管道"input\n",从而产生EOF.
将您的fgets通话更改为
if(fgets(stdinput, 10, stdin) == NULL)
break;
Run Code Online (Sandbox Code Playgroud)
你可以通过fgets电话替换你的循环条件,给出:
#include <stdio.h>
int main(int argc, char **argv) {
char stdinput[10];
while (fgets(stdinput, 10, stdin)) {
fputs(stdinput, stdout);
}
}
Run Code Online (Sandbox Code Playgroud)
这将循环,直到你得到一个EOF,在这种情况下fgets()返回NULL正如@nneonneo所说.但是在这种情况下你不必打破你的while().