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

时间:2012-09-21 08:39:56

标签: 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);
  }
}

产生

通过控制台:

./a.out
input
input

然后等待更多输入。也就是说,它与stdout相似,与cat类似。

通过管道

echo input | ./a.out
input
input
input
[...]

启动后,它会自动淹没控制台,无需互动。

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

3 个答案:

答案 0 :(得分:7)

一旦达到EOFfgets立即返回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);