If the first program calls open(2) before the second one calls
close(2) the former will not block because there's already a writer on
the pipe. A possible workaround would be to unlink and recreate the
fifo in program one, like so:
for (;;)
{
int fifo;
mkfifo(fifo_path, fifo_mode);
fifo = open(fifo_path, O_RDONLY);
read(fifo, ...);
printf(...);
close(fifo);
unlink(fifo_path);
}
As for why this actually happens, I don't know. None of my Stevens
books explain this.
Hope this helps
Dima Dorfman
[EMAIL PROTECTED]
>
> hello!
>
> I've got a program that creates a named pipe, and then spawns a
> thread
> which sits in a loop:
>
> // error checking snipped.
> //
> while (1) {
> int fifo = open(fifoPath, O_RDONLY); // this blocks
> fprintf(stderr, "somebody opened the other end!\n");
> read(fifo, buf, sizeof(buf));
> fprintf(stderr, "got the following data: %s\n", buf);
> close(fifo);
> }
>
> i then have another instance of the same program do the following:
>
> fifo = open(fifoPath, O_WRONLY);
> write(fifo, buf, strlen(buf);
>
>
> now, the problem is that the first process succeeds suddenly for
> the
> open, reads the data, closes the fifo, and IMMEDIATELY SUCCEEDS THE
> open(2)
> again, reading in the same data.
> After that, all is as expected.
>
> Note that this doesn't happen ALL the time -- only about 80% of the
> time.
>
> Any idea why this would happen?
To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-hackers" in the body of the message