【发布时间】:2014-02-22 16:24:21
【问题描述】:
我很困惑。在 OSX 和 Linux 下(使用 BASH、TCSH、FISH 和 DASH),当用户输入直接通过终端提供时,此代码成功读取用户输入,但当用户输入通过管道提供时则不会。
更令人困惑的是:我不希望这段代码能正常工作!此代码正在从 STDOUT 读取。我希望 read 调用返回一个错误,因为我实际上是从只写管道读取的。
#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;
}
构建(假设您将示例命名为 test.c):
$ gcc -o test test.c
然后,这会读取用户输入:
$ ./test
abcd
I read 'abcd
'
但是,这不是:
$ echo "abcd" | ./test
<< program still waiting for the read to finish
有什么见解吗?
【问题讨论】:
-
两件事:你并没有真正终止你正确读取的字符串。从
stdout读取?你不是说stdin吗? -
另外,
read在出错时返回-1,在“文件关闭”时返回0。 -
我修复了空终止和不正确的读取错误检查。我感到困惑的原因是,鉴于我是从标准输出读取的,这段代码完全有效。我不希望这段代码“工作”,但它确实如此!