This is the mail archive of the libc-help@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: clone(2)


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]