From: Stefan Seefeld (seefeld_at_[hidden])
Date: 2004-06-22 18:33:07
Gregory Colvin wrote:
>> oh ? Any call to fork()
> On systems that have fork().
>> should be accompagnied by a call to wait()
>> (or one of its cousins such as 'waitpid()').
> On systems that have wait().
yes, I'm only talking about posix systems.
>> The only question is whether
>> that has to happen synchronously or asynchronously.
> And that question could be answered by the process library, or left
> to the user.
I believe this should be left to the user. However, it would be
nice if the library had some way of encapsulating various strategies
to execute non-reentrant callbacks in a safe (and of course portable) way.
>> Calling 'wait()' synchronously basically means to block right after
>> has been called untill the child process terminates. One technique that
>> uses this approach is to detach the subprocess, i.e. to fork twice,
>> and while
>> the grand-child carries out the actual task, the child finishes
> Which won't work if the parent cares about the child's exit() value?
of course not. The above is used to implement demons.
>> The much more frequent situation is to call it asynchronously, i.e.
>> the call
>> would be either executed from inside the SIGCHLD handler or somehow
>> by it (such as a semaphore, which is reentrant).
> Which was the implementation Angus first suggested, which a few of
> us pointed out was unsafe as written. I meant to suggest the choice
> could be left to the user.
> You can also avoid blocking with a separate thread to do the wait(),
that doesn't sound good: each sub-process would have to be accompagnied
by a thread...that's quite a lot of unnecessary overhead, especially since
any reentrant solution would be able to dispatch all sigchilds from a
single handler, i.e. the cost would be constant and not dependent on the
number of child processes.
> or by calling waitpid() with WNOHANG in a polling loop.
that's even more expensive.
I think, any efficient solution to this problem will be quite intrusive, i.e.
it won't be possible to provide some sort of black box which you hand over
a callback. It needs tight integration with the rest of the application such
as an event loop or a general purpose signal handler (I used to run one
thread per application to be responsible for all signals the process could
possibly catch (well, beside those that are thread-bound)).
Probably the closest what you can get in terms of flexibility / portability
is ACE, as was already pointed out earlier. But that's a huge framework, both,
in terms of scope as well as code. That's the kind of scope though at which such a
facility is best implemented.
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk