Is there syscall clone(2) support (not os.fork ) in Python? I want to play with Linux namespaces under Python, but it seems that there is no information about it.
Changes:
I think ctypes with libc is the answer, but I still have not succeeded. fork works without problems, since it has no arguments how this code works:
from ctypes import * libc = CDLL("libc.so.6") libc.fork()
With the clone, I'm trying to do this:
from ctypes import * def f(): print "In callback." return 0 libc = CDLL("libc.so.6") f_c = CFUNCTYPE(c_int)(f) print libc.getpid() print libc.clone(f_c) print get_errno()
The clone really has this signature:
int clone (int (* fn) (void *), void * child_stack, int flags, void arg, ... / pid _t * ptid, struct user_desc * tls, pid_t * ctid * /);
I still need to pass * child_stack and flags, but I have no idea how to do this. Any help?
Additional changes:
I got it now:
from ctypes import * def f(): print "In callback." return 0 libc = CDLL("libc.so.6") f_c = CFUNCTYPE(c_int)(f) stack = c_char_p(" " * 1024 * 1024) libc.clone(f_c, c_void_p(cast(stack, c_void_p).value + 1024 * 1024), 0)
It really works, but I suppose I'm making a big hole in my system with the stack, is there a cleaner way to do this?
Changes:
Almost done by adding the correct flag for newpid:
from ctypes import * libc = CDLL("libc.so.6") def f(): print libc.getpid() return 0 f_c = CFUNCTYPE(c_int)(f) stack = c_char_p(" " * 1024 * 1024) libc.clone(f_c, c_void_p(cast(stack, c_void_p).value + 1024 * 1024), 0x20000000)
This does not work only for root and prints nice 1.
And after this post, the stack looks fine: http://code.google.com/p/chromium/wiki/LinuxPidNamespaceSupport