当文件流没有新数据时如何防止fgets阻塞
我有一个执行 tail -f sometextfile
的 popen()
函数。 显然只要文件流中有数据我就可以通过fgets()
获取数据。 现在,如果没有新数据来自 tail,fgets()
就会挂起。 我尝试了ferror()
和feof()
但没有成功。 当文件流中没有新内容时,如何确保 fgets() 不会尝试读取数据?
其中一项建议是select()
。 由于这是针对 Windows 平台的,因此选择似乎不起作用,因为匿名管道似乎不适用于它(请参阅 此帖子)。
I have a popen()
function which executes tail -f sometextfile
. Aslong as there is data in the filestream obviously I can get the data through fgets()
. Now, if no new data comes from tail, fgets()
hangs. I tried ferror()
and feof()
to no avail. How can I make sure fgets()
doesn't try to read data when nothing new is in the file stream?
One of the suggestion was select()
. Since this is for Windows Platform select doesn't seem to work as anonymous pipes do not seem to work for it (see this post).
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
在 Linux(或任何 Unix-y 操作系统)中,您可以将 popen() 使用的底层文件描述符标记为非阻塞。
如果没有可用的输入,fgets 将返回 NULL,并将 errno 设置为 EWOULDBLOCK。
In Linux (or any Unix-y OS), you can mark the underlying file descriptor used by popen() to be non-blocking.
If there is no input available, fgets will return NULL with errno set to EWOULDBLOCK.
fgets()
是阻塞读取,如果没有数据,它应该等到数据可用。您需要使用
select()
、poll()
或epoll()
执行异步 I/O。 然后当有数据可用时从文件描述符执行读取。这些函数使用 FILE* 句柄的文件描述符,通过以下方式检索:int fd = fileno(f);
fgets()
is a blocking read, it is supposed to wait until data is available if there is no data.You'll want to perform asynchronous I/O using
select()
,poll()
, orepoll()
. And then perform a read from the file descriptor when there is data available.These functions use the file descriptor of the
FILE*
handle, retrieved by:int fd = fileno(f);
您可以尝试使用低级 IO 函数(open()、read() 等)读取某些文本文件,就像 tail 本身一样。 当没有更多内容可供读取时,read() 返回零,但与 FILE* 函数不同,下次仍会尝试读取更多内容。
You can instead try reading sometextfile using low-level IO functions (open(), read(), etc.), like tail itself does. When there's nothing more to read, read() returns zero, but will still try to read more the next time, unlike FILE* functions.
我通过使用线程解决了我的问题,特别是 <代码>_beginthread,
_beginthreadex
。i solved my problems by using threads , specifically
_beginthread
,_beginthreadex
.如果您使用 POSIX 函数进行 IO 而不是 C 库的函数,您可以使用 select 或民意调查。
I you would use POSIX functions for IO instead of those of C library, you could use select or poll.