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

Reply via email to