Python中是否支持系统调用clone(2)
(not )? os.fork
我想在 Python 下使用 Linux 命名空间,但似乎没有太多关于它的信息。
编辑:
我认为带有 libc 的 ctypes 是答案,但我仍然没有任何成功。fork 工作没有问题,因为它没有任何参数,然后这段代码工作:
from ctypes import *
libc = CDLL("libc.so.6")
libc.fork()
使用克隆我正在尝试这个:
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()
克隆实际上有这个签名:
int clone(int (*fn)(void *), void *child_stack, int flags, void arg, ... / pid_t *ptid, struct user_desc *tls, pid_t *ctid */ );
我仍然需要传递 *child_stack 和 flags 但不知道该怎么做。有什么帮助吗?
更多编辑:
我现在得到了这个:
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)
这实际上可行,但我想我用堆栈在我的系统中打了一个大洞,有一种更清洁的方法可以做到这一点吗?
编辑:
几乎完成,为 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)
这不能仅针对 root 运行,并打印一个不错的 1。
在这篇文章之后,堆栈似乎很好:http ://code.google.com/p/chromium/wiki/LinuxPidNamespaceSupport