Non-blocking call for reading descriptor
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.
Related videos on Youtube
SmallChess
SmallChess: http://www.smallchess.com. Please follow me at https://twitter.com/scchess or https://www.facebook.com/scchess.
Updated on September 20, 2020Comments
-
SmallChess about 3 years
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?-
kqnr over 12 yearsThe behavior of read with respect to blocking varies depending on the descriptor type. To what type of device does
fd
refer? -
SmallChess over 12 yearsstandard inputs, right now, it's blocking
-
Bionix1441 over 7 years@KenRockot so if I have a regular file it is different than for example fd which is a socketDescriptor ?
-
-
mu is too short over 12 yearsAnd then check for -1 returns from
read
and thaterrno
isEAGAIN
. -
malat almost 9 yearsIsn't is
FD_SET(fd, &fds);
instead ? -
R.. GitHub STOP HELPING ICE almost 9 yearsProbably, but
select
is a horrible idea anyway becauseFD_SET
invokes UB iffd>=FD_SETSIZE
. Just usepoll
. -
qrtLs over 7 yearsgood doc about file with non-blocking support setting errno at opengroup
-
Giampaolo Rodolà almost 7 yearsThis is NOT the correct answer. O_NONBLOCK against a regular fs has no effect (read() will keep blocking) and select() will always erroneously report the fd as "ready". Reliable non-blocking IO for regular files on Linux is basically (and unfortunately) not supported.
-
Paul A Jungwirth over 6 years
-
Lassi over 5 years
poll()
is now standardized in POSIX so it can always be used in place ofselect()
. pubs.opengroup.org/onlinepubs/009695399/functions/poll.html -
R.. GitHub STOP HELPING ICE over 5 yearsYes,
poll
should be used instead. -
Nathan F. about 4 yearsCan you add some more details? An example would be nice.
-
nyholku over 3 yearsIIRC poll on macOS AND serial port does not work. I could not locate the reference now but I have distinct recollection that this is or was the case. So as this was old question was not Linux specific I think the recommendation to use poll() might be bad.