Hi Vineet,

On 11/03/13 14:02, Vineet Gupta wrote:
> IMHO, the reasoning in those discussions is flawed. I agree that any "C"
> implementation of vfork is dubious - because there is no gaurantee that stack
> won't be clobbered when the vfork wrapper returns (unless arch has a 
> Branch-n-link
> reg and this function simply uses that to return w/o touching the stack).
> However if the orig code vfork based "C" version existed it meant that some 
> arch
> could use it. By changing it to use clone syscall with  CLONE_VM | 
> CLONE_VFORK |
> SIGCHLD we are simply changing the mechanism but with same semantics. Making 
> it
> behave like fork is a semantical change.
> 
> Note that even on MMU system - Busybox init uses vfork for certain cases to
> guarantee that parent only runs after child has exited - something which fork
> can't guarantee.
> 
> And further, if an arch doesn't/can't use the common vfork.c it needs to 
> define
> it's own vfork.S - but we can't make the generic definition semantically 
> wrong.

Note that the vfork man page has a few relevant comments, such as this:

CONFORMING TO
       4.3BSD, POSIX.1-2001.  POSIX.1-2008 removes the specification of
vfork().  The requirements put on vfork() by the standards are weaker
than those put on fork(2), so an implementation where the two are
synonymous is compliant.  In particular,
       the programmer cannot rely on the parent remaining blocked until
the child either terminates or calls execve(2), and cannot rely on any
specific behavior with respect to shared memory.

So it sounds like busybox generically relying on vfork to block the
parent would be incorrect.

Cheers
James

_______________________________________________
uClibc mailing list
uClibc@uclibc.org
http://lists.busybox.net/mailman/listinfo/uclibc

Reply via email to