NAME
clone,
__clone —
spawn new process with options
LIBRARY
Standard C Library (libc, -lc)
SYNOPSIS
#include <sched.h>
pid_t
clone(
int
(*func)(void *arg),
void
*stack,
int flags,
void *arg);
pid_t
__clone(
int
(*func)(void *arg),
void
*stack,
int flags,
void *arg);
DESCRIPTION
The
clone system call (and associated library support code)
creates a new process in a way that allows the caller to specify several
options for the new process creation.
Unlike
fork(2) or
vfork(2), in which the child
process returns to the call site,
clone causes the child
process to begin execution at the function specified by
func. The argument
arg is passed
to the entry point, as a means for the parent to provide context to the child.
The stack pointer for the child process will be set to
stack. Note that the
clone interface
requires that the application know the stack direction for the architecture,
and that the caller initialize the
stack argument as
appropriate for the stack direction.
The
flags argument specifies several options that control
how the child process is created. The lower 8 bits of
flags specify the signal that is to be sent to the
parent when the child exits. The following flags may also be specified by
bitwise-or'ing them with the signal value:
-
-
CLONE_VM
- Share the virtual address space with the parent. The
address space is shared in the same way as
vfork(2).
-
-
CLONE_FS
- Share the “file system information” with the
parent. This include the current working directory and file creation
mask.
-
-
CLONE_FILES
- Share the file descriptor table with the parent.
-
-
CLONE_SIGHAND
- Share the signal handler set with the parent. Note that the
signal mask is never shared between the parent and the child, even if
CLONE_SIGHAND
is set.
-
-
CLONE_VFORK
- Preserve the synchronization semantics of
vfork(2); the parent blocks
until the child exits.
The
clone call returns the pid of the child in the parent's
context. The child is provided no return value, since it begins execution at a
different address.
If the child process's entry point returns, the value it returns is passed to
_exit(2), and the child process
exits. Note that if the child process wants to exit directly, it should use
_exit(2), and not
exit(3), since
exit(3) will flush and close
standard I/O channels, and thereby corrupt the parent process's standard I/O
data structures (even with
fork(2)
it is wrong to call
exit(3) since
buffered data would then be flushed twice).
Note that
clone is not intended to be used for new native
NetBSD applications. It is provided as a means to port
software originally written for the Linux operating system to
NetBSD.
RETURN VALUES
Same as for
fork(2).
ERRORS
Same as for
fork(2).
SEE ALSO
chdir(2),
chroot(2),
fork(2),
sigaction(2),
sigprocmask(2),
umask(2),
vfork(2),
wait(2)
HISTORY
The
clone() function call appeared in
NetBSD
1.6. It is compatible with the Linux function call of the same name
with respect to the described options.
BUGS
The
NetBSD implementation of
clone()
does not implement the following
flags that are present
in the Linux implementation:
CLONE_CHILD_CLEARTID
CLONE_CHILD_SETTID
CLONE_IO
CLONE_NEWIPC
CLONE_NEWNET
CLONE_NEWNS
CLONE_NEWPID
CLONE_NEWUTS
CLONE_PARENT
CLONE_PARENT_SETTID
CLONE_PID
CLONE_PTRACE
CLONE_SETTLS
CLONE_STOPPED
CLONE_SYSVSEM
CLONE_THREAD
CLONE_UNTRACED