fgets():通过控制台确定,坏通过管道

dav*_*ide 4 c linux io pipe

执行以下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)

启动后,它会自动充斥控制台,无需互动.

这个示例程序正是我用于测试的程序; 这不是削减.我希望这两个测试的行为方式相同.发生了什么?

nne*_*neo 7

一旦EOF到达,fgets立即返回NULL而不等待输入(或修改缓冲区).因此,它将无限循环.在您的管道箱中,echo一旦写入管道就会关闭管道"input\n",从而产生EOF.

将您的fgets通话更改为

if(fgets(stdinput, 10, stdin) == NULL)
    break;
Run Code Online (Sandbox Code Playgroud)


Sim*_*HAU 6

你可以通过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().