This is the mail archive of the
libc-help@sourceware.org
mailing list for the glibc project.
Re: clone(2)
- From: Ángel González <keisial at gmail dot com>
- To: vijay nag <vijunag at gmail dot com>, libc-help <libc-help at sourceware dot org>
- Date: Wed, 18 Dec 2013 21:20:38 +0100
- Subject: Re: clone(2)
- Authentication-results: sourceware.org; auth=none
- References: <CAKhyrx8p46xMrWROE1aifPcxF1m=_d+zGV5brunxDhyhcFgzzA at mail dot gmail dot com>
TL;DR: You need to provide child_stack.
On 18/12/13 19:14, vijay nag wrote:
Hello,
I want to create a new process using clone(2) system call. The
clone(2) is invoked the following way "clone(NULL, NULL, SIGCHLD |
CLONE_PARENT, NULL);" and seems to be returning EINVAL. I RTFM of
clone(2) which suggested me to use NULL for child_stack when creating
a new task. It also suggests that EINVAL is returned when child_stack
argument is NULL. I'm little bit confused about its usage. Can someone
illustrate a simple invocation of clone(2) for creating a child task ?
The man page mentions two things: the clone() method provided by libc
and the raw syscall interface which differs slightly. You are only
interested in the first one, and it doesn't allow a NULL child_stack.
Excerpts from man for sys_clone
"Another difference for sys_clone is that the child_stack argument may
be zero, in which case copy-on-write semantics ensure that the child
gets separate copies of stack pages when either process modifies the
stack. In this case, for correct operation, the CLONE_VM option should
not be specified."
This is at the «The raw system call interface» section, and is comparing
the clone syscall (let's call it sys_clone) to clone(). So ignore this
section.
EINVAL
Returned by clone() when a zero value is specified for child_stack.
Finally, there's anothe relevant to child_stack (maybe it's missing in
your version of the man page).
The child_stack argument specifies the location of the stack
used by the child process. Since the child and calling process may
share memory, it is not possible for the child
process to execute in the same stack as the calling process.
The calling process must therefore set up memory space for the child
stack and pass a pointer to this space to
clone(). Stacks grow downward on all processors that run
Linux (except the HP PA processors), so child_stack usually points to
the topmost address of the memory space set up
for the child stack.
Merry Christmas