execve不会继承任何文件描述符

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (238)

我正在编写一个shell并尝试实现进程替换。fork继承了所有filedescriptor,分配了内存等。我明白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正在消失?谢谢

提问于
用户回答回答于

execve不会继承任何文件描述符

会继承 然后给清空替换了

用户回答回答于

python3 [1](与python2不同)O_CLOEXEC默认打开文件。

我不是python程序员,但是O_CLOEXEC关闭文件的简单方法可能是:

        tmp_fd = os.dup(new_fd.fileno())
        os.dup2(tmp_fd, new_fd.fileno())
        os.close(tmp_fd)

就在之后newfd = ...

os.dup2()默认情况下会使目标fd 继承

请注意,尽管您提供了它的名称new_fd,但您不是文件描述符,而是python流。您在父级和子级中看到的额外文件是该/dev/fd目录的打开句柄。

[1] Python 3.5.3。我不知道究竟是哪个版本。

扫码关注云+社区

领取腾讯云代金券