4

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

然后它等待更多的输入。也就是说,它将 stdin 回显到 stdout,类似于cat.

通过管道:

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

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

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

4

3 回答 3

7

一旦EOF达到,fgets立即返回 NULL 而不等待输入(或修改缓冲区)。因此,它将无限循环。在您的管道情况下,echo一旦写入,将关闭管道"input\n",导致 EOF。

fgets将您的呼叫更改为

if(fgets(stdinput, 10, stdin) == NULL)
    break;
于 2012-09-21T08:43:27.673 回答
6

您可以通过fgets调用替换循环条件,给出:

#include <stdio.h>
int main(int argc, char **argv) {
  char stdinput[10];
  while (fgets(stdinput, 10, stdin)) {
    fputs(stdinput, stdout);
  }
}

这将循环直到你得到一个EOF,在这种情况下,fgets()就像@nneonneo 所说的那样返回NULL 。但是在这种情况下,您将不必破坏您的while().

于 2012-09-21T08:49:21.023 回答
0

[注意:解决了错误的问题。]

http://sweslo17.blogspot.tw/2012/04/c-standard-input-redirection.html

之后fgets(),您可以添加以下代码以再次恢复stdin以解决管道问题。

freopen("/dev/tty","rb",stdin);
于 2014-01-28T00:31:47.880 回答