当前位置:  开发笔记 > 运维 > 正文

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

如何解决《当文件流没有新数据时如何防止fgets阻塞》经验,为你挑选了2个好方法。

我有一个popen()函数执行"tail -f sometextfile".只要文件流中有数据显然我可以通过fgets()获取数据.现在,如果没有来自尾部的新数据,fgets()会挂起.我试过ferror()和feof()无济于事.如何在文件流中没有新内容的情况下确保fgets()不会尝试读取数据?

其中一个建议是select().由于这是针对Windows平台选择似乎不起作用,因为匿名管道似乎不起作用(请参阅此文章).



1> DGentry..:

在Linux(或任何Unix-y OS)中,您可以将popen()使用的基础文件描述符标记为非阻塞.

#include 

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.



2> Sufian..:

fgets() 是一个阻塞读取,如果没有数据,它应该等到数据可用.

你会想用执行异步I/O select(),poll()epoll().然后在有可用数据时从文件描述符执行读取.

这些函数使用FILE*句柄的文件描述符,检索方式为:int fd = fileno(f);

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有