小编Bri*_*ian的帖子

为什么我可以从STDOUT读取并获得用户的终端输入?

我很困惑.在OSX和Linux下(使用BASH,TCSH,FISH和DASH),当直接通过终端提供输入时,此代码成功读取用户输入,而不是通过管道提供用户输入时.

更令人困惑的是:我不希望这些代码完全起作用!此代码是从STDOUT读取的.我希望读取调用返回错误,因为我实际上是从只写管道读取.

#include <unistd.h>
#include <stdio.h>

int main(int argc, char** argv) {
  char buffer[11];
  size_t nread;
  if((nread=read(1, buffer, sizeof(buffer)-1)) <= 0) {
    fprintf(stderr, "error!\n");
    return 1;
  }
  buffer[nread] = '\0';
  printf("I read '%s'\n", buffer);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

要构建(假设您将示例命名为test.c):

$ gcc -o test test.c
Run Code Online (Sandbox Code Playgroud)

然后,这将读取用户输入:

$ ./test
abcd
I read 'abcd

'
Run Code Online (Sandbox Code Playgroud)

但是,这不是:

$ echo "abcd" | ./test
<< program still waiting for the read to finish
Run Code Online (Sandbox Code Playgroud)

任何见解?

c linux

8
推荐指数
1
解决办法
310
查看次数

标签 统计

c ×1

linux ×1