我有执行“尾-f sometextfile”一个POPEN()函数。 Aslong因为有数据的FILESTREAM显然我可以通过与fgets数据()。 现在,如果没有新的数据来自于尾部,与fgets()挂起。 我试图ferror()函数和FEOF()无济于事。 我怎样才能确保与fgets()不尝试读取数据时,没有什么新的文件流吗?
其中的建议之一是选择()。 由于这是Windows平台选择似乎并不为工作似乎匿名管道不为它工作(见这个职位 )。
我有执行“尾-f sometextfile”一个POPEN()函数。 Aslong因为有数据的FILESTREAM显然我可以通过与fgets数据()。 现在,如果没有新的数据来自于尾部,与fgets()挂起。 我试图ferror()函数和FEOF()无济于事。 我怎样才能确保与fgets()不尝试读取数据时,没有什么新的文件流吗?
其中的建议之一是选择()。 由于这是Windows平台选择似乎并不为工作似乎匿名管道不为它工作(见这个职位 )。
在Linux中(或任何Unix-γ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将返回NULL,并将errno设置为EWOULDBLOCK。
fgets()
是一个阻塞读,它应该要等到数据可用,如果没有数据。
你会想用执行异步I / O select()
poll()
或epoll()
然后从文件描述符进行读取时有可用的数据。
这些函数使用的文件描述符FILE*
手柄,通过检索到: int fd = fileno(f);
我通过使用线程,特别是解决了我的问题_beginthread
, _beginthreadex
。
你可以尝试,而不是阅读sometextfile使用低级别的IO功能(开放(),阅读()等),像尾巴本身并。 当有什么更多的阅读,阅读()返回零,但仍然尝试更多的下一次,不像FILE *功能。
我应该使用POSIX功能IO,而不是那些C库,你可以使用选择或调查 。