如何预防与fgets块时,文件流没有新的数据如何预防与fgets块时,文件流没有新的数据(how t

2019-05-12 08:20发布

我有执行“尾-f sometextfile”一个POPEN()函数。 Aslong因为有数据的FILESTREAM显然我可以通过与fgets数据()。 现在,如果没有新的数据来自于尾部,与fgets()挂起。 我试图ferror()函数和FEOF()无济于事。 我怎样才能确保与fgets()不尝试读取数据时,没有什么新的文件流吗?

其中的建议之一是选择()。 由于这是Windows平台选择似乎并不为工作似乎匿名管道不为它工作(见这个职位 )。

Answer 1:

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



Answer 2:

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

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

这些函数使用的文件描述符FILE*手柄,通过检索到: int fd = fileno(f);



Answer 3:

我通过使用线程,特别是解决了我的问题_beginthread_beginthreadex



Answer 4:

你可以尝试,而不是阅读sometextfile使用低级别的IO功能(开放(),阅读()等),像尾巴本身并。 当有什么更多的阅读,阅读()返回零,但仍然尝试更多的下一次,不像FILE *功能。



Answer 5:

我应该使用POSIX功能IO,而不是那些C库,你可以使用选择或调查 。



文章来源: how to prevent fgets blocks when file stream has no new data
标签: c popen fgets