I have the need to launch a tool from my GUI application that needs
to be in its own process group (i.e. the parent process should not
be the GUI app which launched it, since it needs to outlive the
parent process.)
It will use CFMessagePort to communicate with the parent app.
I seem to recall that using fork not followed immediately by exec
was a bad idea for Foundation/CoreFoundation tools or applications,
but at the moment I can't find those references in the archives.
Perhaps these messages will be easier to find.
Is using fork (or daemon, as the case may be) at the top of main
going to cause me grief when I want to later use Foundation or
CoreFoundation services?
Yes. :)
Any other recommended approaches?
Using launchd or LaunchServices is really the way to go here; go ahead
and use CFMessagePort for your IPC, but either use a launchd plist to
start your non-GUI process on-demand, or have your GUI process use
LaunchServices to fire it up.
In order for all the CF/Foundation internals to be initialized
properly, an exec() has to happen otherwise things won't work, or
won't work the way you expect (especially Mach-based things, like
CFMessagePort).
The "Agents and Daemons" technote talks about using launchd: