Subject: Re: fifo & stdio ?
To: Hubert Feyrer <feyrer@rfhs8012.fh-regensburg.de>
From: Simon Burge <simonb@netbsd.org>
List: netbsd-users
Date: 06/14/1999 06:34:45
Hubert Feyrer wrote:

> Hello,
> 
> I'm currently debugging gqmpeg's ipc system, and there's something I don't
> understand; maybe someone here can help me. I have an open file descriptor
> from a fifo (open(2)'ed with O_NONBLOCK), and i get a file pointer via
> fdopen(3) from that descriptor. I then want to check periodically if
> there's some data in the pipe, and do something else if not ("oink", in
> the program below).
> 
> What I don't understand now is why I do not get any data when (trying to)
> read any available data with fgets(). feof() says we're at EOF after(!)
> the first call to fgets(), and doesn't change it's mind even after I send
> some data to the fifo ("echo bla >fifo.pipe"). 
> 
> Is it possible our stdio is mixing something up here WRT pipes,
> buffering, eof, ...?
> 
> 
> Here's my test program. Compile it, and try to "echo some data
> >>fifo.pipe". The intention is to print out that data from the pipe.
> Instead, I just get:
> 
> miyu% ./fifo 
> fp=0x40093410, fd=3
> oink! feof=0
> oink! feof=1             <- "echo foo >>fifo.pipe" was done here
> oink! feof=1
> ^C

If I were programming this I'd probably use select() and read() and not
stdio functions...  That said, adding

		if (feof(fp) != NULL)
			rewind(fp);

after the "oink" printf() seems to give the behaviour you want.

Simon.