dup2恢复原始文件描述符

问题描述

我正在尝试使用dup2将进程的标准输出克隆到我的程序中,并且可以正常工作,除非我复制标准输入时无法再次将其恢复为原始状态。

我的代码如下。

from os import fork,wait,pipe,execvp,dup2,close
from sys import stdin

def get_input(data):
    r,w = pipe()
    pid = fork()
    old = 0
    if pid > 0:
        wait()
        close(w)
        old = dup2(r,0)
        for line in stdin:
            print('data - ',line.strip())

    else:
        close(r)
        dup2(w,1)
        execvp(data.split()[0],data.split())

while True:
    get_input(input())

在while循环的第二次迭代中,我得到了EOFError,因为标准输入仍然是管道。

我尝试关闭管道通道,并尝试通过获取old_fd来“重建” filedescriptor,但是我得到的错误并没有改变。

解决方法

所以过了一会儿,我意识到没有理由将文件描述符复制到stdin,因为我不需要将任何数据传递出进程。

因此,我可以只使用系统调用read来读取为其分配的文件描述符。

我从read导入了os的拳头:

from os import read

然后删除父进程中的所有内容并添加以下内容:

chunk = ''
while (tmp := read(r,1024).decode()) != "":
    chunk += tmp
close(r)

现在我在python程序中将所有stdout的输出捕获为字符串。