【发布时间】:2019-06-20 16:21:17
【问题描述】:
我正在编写一个 shell 并尝试实现 process substitution。 fork 继承所有文件描述符、分配的内存等。我知道 execve 也应该保留这种信息,因此只要没有设置 O_CLOEXEC 标志,就保留每个打开的文件描述符。
我尝试了一个简单的 python 脚本:
fd.py:
#!/usr/bin/env python3
import sys, os
if __name__ == "__main__":
if len(sys.argv) == 1:
new_fd = open("the_content_file", "w+")
print("father table : ", os.listdir("/dev/fd"))
if os.fork() == 0:
os.execve("/PATH/OF/SCRIPT/fd.py", ["fd", "content"], os.environ)
else:
print("child table : ", os.listdir("/dev/fd"))
pass
作为输出,我得到:
father table : ['0', '1', '2', '3', '4']
child table : ['0', '1', '2', '3']
在 fork 之后,我保留了相同的 fd 表,但是每当我在可执行文件上使用 execve 时,我都会丢失所有内容并默认打开 fd。 为什么打开的 fd 消失了? 谢谢
【问题讨论】:
标签: python python-3.x unix file-descriptor execve