当文件流没有新数据时如何防止fgets块

问题描述 投票:12回答:5

我具有执行popen()tail -f sometextfile函数。只要文件流中显然有数据,我就可以通过fgets()获得数据。现在,如果没有新数据来自尾部,则fgets()将挂起。我尝试ferror()feof()无济于事。当文件流中没有新内容时,如何确定fgets()不尝试读取数据?

建议之一是select()。由于这是针对Windows平台的,因此select似乎不起作用,因为匿名管道似乎不适用于它(请参见this post)。

c popen fgets
5个回答
27
投票

在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。


15
投票

fgets()是阻塞读取,如果没有数据,则应该等待直到数据可用为止。

您将要使用select()poll()epoll()执行异步I / O。当有可用数据时,然后从文件描述符执行读取。

这些功能使用FILE*句柄的文件描述符,通过以下方式检索:int fd = fileno(f);


1
投票

我通过使用线程(特别是_beginthread , _beginthreadex解决了我的问题。


0
投票

您可以尝试使用低级IO功能(open(),read()等)读取某些文本文件,就像tail本身一样。当没有更多要读取的内容时,read()返回零,但下次仍将尝试读取更多内容,这与FILE *函数不同。


0
投票

我将对IO使用POSIX函数而不是C库,可以使用_beginthread_beginthreadex

© www.soinside.com 2019 - 2024. All rights reserved.