为什么Popen使父进程挂在preexec_fn上?

时间:2020-05-03 06:08:55

标签: python multiprocessing popen

根据Python 3.6 docs for Popen

如果将preexec_fn设置为可调用对象,则将在执行子级之前在子进程中调用此对象。 (仅适用于POSIX)

然后为什么在执行preexec_fn函数时父进程挂起?如果在子进程中执行,则父进程应该能够继续。

这是一个程序的小示例,该程序创建一个新的“ ls”进程,然后该进程休眠4秒钟。理想情况下,应立即打印“已到达”,但并非如此。 4秒后打印出来“达到”。

import os
import subprocess
import sys
import tempfile
import time


def sleep_a_little():
    time.sleep(4)


p = subprocess.Popen(["ls"], preexec_fn=sleep_a_little)
print("reached")

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题,尽管似乎发生了preexec_fn函数仅由父级运行的情况。

我的preexec_fn使用os.setuidos.setgid从特权父级启动用户进程。

在生成线程之前调用whoami实用程序,然后在生成线程之后再次调用,显示我的父级模拟了用户帐户,而不仅仅是模拟了它创建的子级帐户。

相关问题