Python子进程的execveat(2)/fexecve(3)类行为

2024-10-02 00:36:18 发布

您现在位置:Python中文网/ 问答频道 /正文

如何让Python的子进程模块接受fd 而不是路径(=execveat()with AT_EMPTY_PATH)? 示例:

subprocess.Popen (["argv0", "argv1"], shell=False,
                  executable=os.open ("/proc/self/exe",
                                      os.O_RDONLY
                                      | os.O_CLOEXEC))

在python3.6.5中,由于TypeError,这会失败。你知道吗

当然,我们的目标是避免在验证之间出现冲突 二进制和对execve(2)的调用。你知道吗

我知道操作系统执行()也可以和fds一起使用,但是 最好不要在上面重新实现子流程模块。你知道吗


Tags: 模块path路径示例进程oswithat
1条回答
网友
1楼 · 发布于 2024-10-02 00:36:18

CPython的^{},POSIX的^{}的内部实现,既不支持fexecve(3),也不支持execveat(2)。如果可以假设/proc已装入,那么只需指定/proc/self/fd/N(其中N是所需的fd)作为可执行文件。这也是fexecve(3)在旧内核上的作用。有关/proc/self/fd的详细信息,请参见Linux手册页proc(5)。你知道吗

编辑示例:

def spawn_exefd(args, fd, bufsize=-1, *args, **kwargs):
    return subprocess.Popen(args, bufsize, "/proc/self/fd/%d" % (fd,), *args, **kwargs)

#import fcntl # py2
import os
fd = os.open("/bin/sh", os.O_RDONLY | os.O_CLOEXEC)
#fcntl.fcntl(fd, fcntl.F_SETFD, fcntl.fcntl(fd, fcntl.F_GETFD) | fcntl.FD_CLOEXEC) # py2
spawn_exefd(["sh", "-i"], fd)

相关问题 更多 >

    热门问题