如何写入python中使用fork()获得的子进程stdin?

时间:2015-04-24 11:02:42

标签: python fork

好吧,我需要写一个用fork()获得的子进程的stdin。我还需要将stdin的文件描述符(?)保留到父进程以重复写入child。我使用 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

显然,我想使用从{stin

接收命令的slave模式使用python控制mplayer

由于程序的结构,

fork()是必不可少的,所以请不要使用communicate等替代

2 个答案:

答案 0 :(得分:5)

你想做的事情是不可能的,因为它没有意义。子节点与父节点具有相同的标准输入,而不是您可以写入的新节点。 POSIX保证在fork之后:

  

子进程应拥有自己父文件描述符的副本。每个子文件描述符都应引用相同的打开文件描述以及父文件的相应文件描述符。

与此同时,你正试图从孩子内部写下孩子的标准差。这更没意义。你期望写什么写自己的stdin?

当然,孩子可以写入自己的标准输出,这与父母的标准输出相同。但我怀疑这不是你想要的。你想要的是父母写给孩子的标准书。

如果是这样,你必须在分叉之前创建一个管道,然后用该管道的读取端替换子项的stdin(通常使用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")

答案 1 :(得分:0)

为了完整性,这里是 Thomas Orozco的一个工作示例的另一个答案https://stackoverflow.com/a/12309286/491827