Is there any support of the syscall clone(2) (not os.fork
) in Python? I want to play with Linux namespaces under Python but it seems that there is not a l
If you want to have "fork() but with new namespace" semantics, you can directly call the SYS_clone
syscall instead. Note that if you do so, the os.getpid()
method will return the wrong process ID in the child because glibc caches the process ID and doesn't know about the SYS_clone
invocation to invalidate its cache.
Assuming x86_64 (NR_clone == 56
, NR_getpid == 39
), you can call libc.syscall(56, signal.SIGCHLD|0x000200000, 0 0 0)
to "fork", and then libc.syscall(39)
to get the current PID of the "forked" child process.
Well, finally I think I got the answer, is just usign ctypes with libc,
This is a simple proof of concept:
from ctypes import *
libc = CDLL("libc.so.6")
# Create stack.
stack = c_char_p(" " * 8096)
def f():
print libc.getpid()
return 0
# Conver function to c type returning an integer.
f_c = CFUNCTYPE(c_int)(f)
# We need the top of the stack.
stack_top = c_void_p(cast(stack, c_void_p).value + 8096)
# Call clone with the NEWPID Flag
libc.clone(f_c, stack_top, 0x20000000)
This has to be run by root.