以下代码输出“非法搜寻”:
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main() {
errno = 0;
getchar();
getchar();
getchar();
ftell( stdin );
printf( "%s\n", strerror(errno) );
}
当我运行“cat script | ./a.out”以及运行“./a.out”时,会发生这种情况。当然,问题在于ftell。我的问题是:为什么会发生这种情况?我认为stdin可以寻找。 fseek也会导致同样的错误。如果stdin不可寻找,有什么方法可以做同样的事情吗?
感谢您的回复。
答案 0 :(得分:12)
Fifos不可寻求。它们只是一个缓冲区。一旦来自fifo缓冲区的数据为read()
,就永远无法检索它。
请注意,如果您运行了程序:
./a.out < script
然后标准输入将是文件而不是 fifo ,因此ftell()
将执行您期望的操作。