This is the mail archive of the
libc-help@sourceware.org
mailing list for the glibc project.
clone(CLONE_VFORK) behavior
- From: David Wuertele <dave+libc-help at wuertele dot com>
- To: libc-help at sourceware dot org
- Date: Tue, 30 Jun 2009 12:02:41 -0700
- Subject: clone(CLONE_VFORK) behavior
The man page for clone() says:
If CLONE_VFORK is set, the execution of the calling process is
suspended until the child releases its virtual memory resources via a
call to execve(2) or _exit(2) (as with vfork(2)).
Here's a test program that behaves differently from what this man page
leads me to expect:
#include <sys/wait.h>
#include <sched.h>
#include <unistd.h>
#include <stdio.h>
int
clonefunc (void *data)
{
sleep(1);
fprintf (stderr, "got b\n");
_exit(0);
}
int
main (int ac, char *av[])
{
char *child_stack[16384];
clone (clonefunc, child_stack, CLONE_VFORK|SIGCHLD, NULL);
fprintf (stderr, "got a\n");
return 0;
}
I expect this to pause for one second, then print "got b" followed by
"got a". But on my RHEL4 system (i686/linux-2.6.9/glibc-2.3.4), it
immediately prints "got a", the program exits (I see the command
prompt), then it prints "got b".
I have tried executing with "LD_ASSUME_KERNEL=2.2.5" which uses
/lib/libc.so.6 (I believe that's the linuxthreads version of
glibc-2.3.4) and with "LD_ASSUME_KERNEL=2.6.9" which uses
/lib/tls/i686/libc.so.6 (I believe that is the NPTL version of
glibc-2.3.4). Both libraries behave identically.
I also have an embedded mips system running
linux-2.6.18/glibc-2.3.6/linuxthreads, but it behaves exactly as I
expect (waits 1 sec, prints "got b", then prints "got a", then exits).
Are my expectations wrong, or am I triggering a bug in linux-2.6.9 or
in glibc-2.3.4?
Thanks,
Dave