UNIX FAQ Version 2.1 92/12/04 -- Question 4.2
UNIX FAQ Version 2.1 92/12/04 -- Question 4.2
How do I check to see if there are characters to be read without
actually reading?
Certain versions of UNIX provide ways to check whether characters
are currently available to be read from a file descriptor. In
BSD, you can use select(2). You can also use the FIONREAD ioctl
(see tty(4)), which returns the number of characters waiting to
be read, but only works on terminals, pipes and sockets. In
System V Release 3, you can use poll(2), but that only works on
streams. In Xenix - and therefore Unix SysV r3.2 and later - the
rdchk() system call reports whether a read() call on a given file
descriptor will block.
There is no way to check whether characters are available to be
read from a FILE pointer. (You could poke around inside stdio
data structures to see if the input buffer is nonempty, but that
wouldn't work since you'd have no way of knowing what will happen
the next time you try to fill the buffer.)
Sometimes people ask this question with the intention of writing
if (characters available from fd)
read(fd, buf, sizeof buf);
in order to get the effect of a nonblocking read. This is not
the best way to do this, because it is possible that characters
will be available when you test for availability, but will no
longer be available when you call read. Instead, set the
O_NDELAY flag (which is also called FNDELAY under BSD) using the
F_SETFL option of fcntl(2). Older systems (Version 7, 4.1 BSD)
don't have O_NDELAY; on these systems the closest you can get to
a nonblocking read is to use alarm(2) to time out the read.