Non-blocking call for reading descriptor
I have a fd descriptor, which I can use to read from by calling read(fd, buffer,...)
. Now, I want to check if there is anything to read before actually making the call, because the call is blocking. How do I do this?
Solution 1:
int flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);
The code snippet above will configure such a descriptor for non-blocking access. If data is not available when you call read, then the system call will fail with a return value of -1 and errno is set to EAGAIN. See the fnctl man pages for more information.
Alternatively, you can use select with a configurable timeout to check and/or wait a specified time interval for more data. This method is probably what you want and can be much more efficient.
Solution 2:
Use select
or poll
to query whether the file descriptor has data available for read:
fd_set fds;
FD_ZERO(&fds);
FD_SET(&fds, fd);
if (select(fd+1, &fds, 0, 0)==1) /* there is data available */
Solution 3:
Depending on what you're doing you might be able to turn the problem inside out and use select
to tell you when your file descriptor has something to read.
Solution 4:
use poll for timeout:
struct pollfd p;
int n;
while ((n = poll(&p, 1, iTo)) < 0)
{
if (errno == EAGAIN || errno == EINTR)
continue;
}
if (!n) {
errno = ETIMEDOUT;
}
while ((len = read(Fd, anyBuff, sizeof(anyenter code hereBuff))) < 0) {
if (errno == EAGAIN || errno == EINTR)
continue;
}
Solution 5:
I think you should use select
or poll
functions to check if there are something to read from the descriptor.