我具有执行popen()
的tail -f sometextfile
函数。只要文件流中显然有数据,我就可以通过fgets()
获得数据。现在,如果没有新数据来自尾部,则fgets()
将挂起。我尝试ferror()
和feof()
无济于事。当文件流中没有新内容时,如何确定fgets()
不尝试读取数据?
建议之一是select()
。由于这是针对Windows平台的,因此select似乎不起作用,因为匿名管道似乎不适用于它(请参见this post)。
在Linux(或任何Unix-y OS)中,您可以将popen()使用的基础文件描述符标记为非阻塞。
#include <fcntl.h>
FILE *proc = popen("tail -f /tmp/test.txt", "r");
int fd = fileno(proc);
int flags;
flags = fcntl(fd, F_GETFL, 0);
flags |= O_NONBLOCK;
fcntl(fd, F_SETFL, flags);
如果没有可用的输入,则fgets将errno设置为EWOULDBLOCK时返回NULL。
fgets()
是阻塞读取,如果没有数据,则应该等待直到数据可用为止。
您将要使用select()
,poll()
或epoll()
执行异步I / O。当有可用数据时,然后从文件描述符执行读取。
这些功能使用FILE*
句柄的文件描述符,通过以下方式检索:int fd = fileno(f);
我通过使用线程(特别是_beginthread
, _beginthreadex
解决了我的问题。
您可以尝试使用低级IO功能(open(),read()等)读取某些文本文件,就像tail本身一样。当没有更多要读取的内容时,read()返回零,但下次仍将尝试读取更多内容,这与FILE *函数不同。
我将对IO使用POSIX函数而不是C库,可以使用_beginthread
或_beginthreadex
。