> 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