On 3/2/06, Per Jessen
Steve Graegert wrote:
did not have time to take a closer look at your code, but I think that fputs(3) itself is not the culprit since it does not necessarily set errno when EOF is encountered
Hmmm, interesting - good point. Does anyone know how to go about examining the error-condition in such a case then? where fputs() returns EOF. I also notice on re-reading the man-page for fprintf that it doesn't return EOF in error-situations, but a negative value.
Everytime EOF is returned you should (a) check if the EOF indicator has been set (see feof(3)) and (b) check for errors with ferror(3).
Instead you're duplicating the FDs before associating it with a stream and the call to fcntl(2) call causes the other (new) FD to be put into non-blocking (O_NONBLOCK) as well since the data structures in the kernel are shared among them.
That's what Anders said too, yet I'm pretty certain (I'll obviously have to check again) I checked the the flags of the second fd to make sure it was blocking.
But that leads me to this question - how to I have one socket where I want reads to be nonblocking and writes to block? Or am I asking for something impossible?
Maybe send(2) and recv(2) would help. Both allow for individual I/O operations to be done in either blocking or non-blocking mode. \Steve