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).
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.