我有一个popen()
函数,用于执行tail -f sometextfile
命令。只要文件流中有数据,我就可以通过fgets()
获取数据。但是,如果从 tail 中没有新的数据,fgets()
就会挂起。我尝试过ferror()
和feof()
,但都无济于事。如何确保fgets()
在文件流中没有新数据时不尝试读取数据?
其中一个建议是使用select()
函数。由于这是针对Windows平台的,因此选择操作似乎无法使用匿名管道(请参见此帖子)。
#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。
fgets()
是一个阻塞读取函数,如果没有数据,它会等待直到有数据可用。
您需要使用 select()
、poll()
或 epoll()
进行异步 I/O 操作,并在有数据可用时从文件描述符执行读取操作。
这些函数使用 FILE*
句柄的文件描述符进行操作,可通过以下方法获取: int fd = fileno(f);
你可以尝试使用低级IO函数(如open(),read()等)来读取sometextfile,就像tail本身所做的那样。当没有更多内容可读时,read()会返回零,但仍会在下一次尝试读取更多内容,这与FILE*函数不同。
我通过使用线程来解决我的问题,具体地说是 _beginthread
,_beginthreadex
。