>     1. initializes some UI goo (but doesn't start any of it UP) using a
> GUI framework (Qt)
>     2. creates a FIFO, and then spawns a thread
>     3. this new thread then does:
> 
>             fifo = open(fifoPath, O_RDONLY);

...

> 
>     Now, the problem is that when step 3 above blocks on the open(2)
> call (as it should, since the other end of the pipe isn't opened yet),
> the whole application is frozen, and the main thread can't continue
> with GUI processing, and the app appears to die.
> 
>     What is goofy is that this works just fine under Linux.  So,
> FreeBSD has slightly different blocking rules or something -- but I
> don't understand them.  It also hangs under Solaris 8/Intel.
> 
>     So, the question is:  how can I find out what these differences are
> and try to get around them.   I'm using this to limit instances of my
> program to one, and need a named pipe instead of just a lock file so
> that new instances can communicate any arguments they might have been
> given, etc ...  

I think the FreeBSD behavior is wrong, the spec says that when
opening a FIFO with O_NONBLOCK clear that:

> An open() for reading-only shall block the calling thread until a
> thread opens the file for writing.  An open() for writing-only
> shall block the calling thread until a thread opens the file for
> reading.

The FBSD man pages will let you know if something will block or
not, for example, look at the "implementation notes" section for
open.

You can open the fifo non-blocking and then clear O_NONBLOCK using
fcntl, hopefully that will work in all environments.

Peter

--
Peter Dufault ([EMAIL PROTECTED])   Realtime development, Machine control,
HD Associates, Inc.               Fail-Safe systems, Agency approval

To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-hackers" in the body of the message

Reply via email to