[英]Reading data from stdin in C
我正在尝试从stdin
读取并输出数据,但是一切正常,除了它没有输出新的传入数据 。 我不太确定问题出在哪里。 我猜它在确定stdin
大小时有事可做。 任何帮助将不胜感激! 谢谢
tail -f file | my_prog
#include <stdio.h>
#include <sys/stat.h>
long size(FILE *st_in) {
struct stat st;
if (fstat(fileno(st_in), &st) == 0)
return st.st_size;
return -1;
}
int main (){
FILE *file = stdin;
char line [ 128 ];
while ( fgets ( line, sizeof line, file ) != NULL )
fputs ( line, stdout ); /* write the line */
long s1, s2;
s1 = size(file);
for (;;) {
s2 = size (file);
if (s2 != s1) {
if (!fseek (file, s1, SEEK_SET)) {
while ( fgets ( line, sizeof line, file ) != NULL ) {
fputs ( line, stdout ); /* write the line */
}
}
s1 = s2;
usleep(300000);
}
}
return 0;
}
编辑 :固定!
FILE *
到达EOF之后,它将保持在不再读取任何数据的状态,直到您用clearerr()
或fseek()
清除'EOF'位为止。 但是,如果将标准输入连接到终端,则该设备不是可搜索的设备,因此除了清除错误之外,它可能没有任何用处:
POSIX说:
fseek()在无法查找的设备上的行为是实现定义的。
您的循环进入条件是可疑的; 您需要在启动之前先入睡,并且每次迭代都需要入睡。 确实,通常您编写tail -f
无需担心文件大小; 您入睡后,尝试阅读直到下一个'EOF',重设文件EOF指示器,然后重复。 还要注意,没有定义管道或终端的尺寸。
单独地,调用FILE *
参数到函数filename
惯例是; 它具有完全错误的含义。 文件名是一个字符串。
这不是真正的标准C:
size(file);
调用stat()获取文件信息-文件的组织类型,文件大小和权限。
您的代码要做的是最终在尝试读取文件时将文件指针设置为文件末尾。 考虑使用stat()(或在打开的文件上使用fstat())代替。
rewind()将文件指针重置为文件的开头,fseek()会将其放置在您需要的任何位置。
tail -f在尝试之间短暂睡眠的情况下,在EOF点反复尝试文件。...并不“认为” EOF为错误。 它会记住EOF的当前文件偏移,然后使用SEEK_END记住fseeks(),然后调用ftell()并比较这些偏移。 如果存在差异,则fseek()-s返回最后一个已知的端点并读取数据。
此说明来自旧的Unix来源。 我敢肯定,从那时起它已经被调整了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.