python - 如何写入在 python 中使用 fork() 获得的子进程标准输入?

标签 python fork

好吧,我需要写入一个通过 fork() 获得的子进程的标准输入。我还需要将 stdin 的文件描述符(?)保存到父进程,以便重复写入子进程。我使用 os.pipe() 来获取描述符,所以请保持这种方式。

pid = fork()
if pid == 0:
    os.write(sys.stdin.fileno(), "sample") # <-- isn't this the child's stdin?
    os.execv(..)
    .
    .

子进程是一个 bash 脚本,比如:

#!/bin/bash
/usr/bin/mplayer -slave "$1" <&0

显然,我想用 python 控制 mplayer,使用它的 slave 模式,从它的 stdin 接收命令

由于程序的结构,fork() 是必不可少的,因此请不要使用 communicate 等替代方法

最佳答案

您尝试做的事情是不可能的,因为它没有意义。 child 拥有与 parent 相同的标准输入,而不是您可以写入的新标准输入。 POSIX 保证在 fork 之后:

The child process shall have its own copy of the parent's file descriptors. Each of the child's file descriptors shall refer to the same open file description with the corresponding file descriptor of the parent.


与此同时,您正在尝试从 child 内部写入 child 的标准输入。这更没有意义。您希望写入您自己的标准输入来做什么?


当然, child 可以写入自己的标准输出,这将与 parent 的标准输出相同。但我怀疑那不是你想要的。您想要的是让 parent 写入 child 的标准输入。

如果是这样,您必须在 fork 之前创建一个管道,然后用该管道的读取端替换子进程的标准输入(通常使用 dup2),然后写入该管道的写入端. CPython subprocess implementation是很好的示例代码,说明如何在不依赖更高级别的函数的情况下执行此操作(即使它是在 C 中,而不是在 Python 中)。

像这样:

pr, pw = pipe()
pid = fork()
if pid == 0:
    os.close(pw)
    sys.stdin.close()
    os.dup2(pr, 0)
    os.execv(...)
else:
    os.close(pr)
    os.write(pw, "sample")

关于python - 如何写入在 python 中使用 fork() 获得的子进程标准输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29845803/

相关文章:

python - 列表中带有 "distance limit"的独特组合

python - 如何使用 EmailMessage (Django) 在消息中插入新行

python - Tweepy:自动推文文件夹中的图像?

c++ - Boost.Log 和创建守护进程; `fork` 不允许?

c - 我怎样才能捕获输出?

python - exe文件是什么语言的?我可以从 python 制作 .exe 吗?

python - 全名的正则表达式

不能 dup2 将管道的末端写入标准输出

scala - ProcessBuilder - 在 Scala 中启动另一个进程/JAVA - 如何?

c - vfork 返回值给 parent 和 child