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

发布于 2024-07-07 11:09:45 字数 468 浏览 8 评论 0原文

我有一个执行 tail -f sometextfilepopen() 函数。 显然只要文件流中有数据我就可以通过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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

潇烟暮雨 2024-07-14 11:09:45

在 Linux(或任何 Unix-y 操作系统)中,您可以将 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。

In Linux (or any Unix-y OS), you can mark the underlying file descriptor used by popen() to be non-blocking.

#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);

If there is no input available, fgets will return NULL with errno set to EWOULDBLOCK.

南烟 2024-07-14 11:09:45

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(), or epoll(). 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);

度的依靠╰つ 2024-07-14 11:09:45

您可以尝试使用低级 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.

你穿错了嫁妆 2024-07-14 11:09:45

我通过使用线程解决了我的问题,特别是 <代码>_beginthread,_beginthreadex

i solved my problems by using threads , specifically _beginthread , _beginthreadex.

你另情深 2024-07-14 11:09:45

如果您使用 POSIX 函数进行 IO 而不是 C 库的函数,您可以使用 select民意调查

I you would use POSIX functions for IO instead of those of C library, you could use select or poll.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文