如何解决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的输出捕获为字符串。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。