Issue
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
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.
Answered By - Judge Maygarden Answer Checked By - Katrina (WPSolving Volunteer)