首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >execve不继承任何filedescriptor

execve不继承任何filedescriptor
EN

Stack Overflow用户
提问于 2019-06-21 00:21:18
回答 1查看 63关注 0票数 0

我正在编写一个外壳程序,并尝试实现process substitution。fork继承所有filedescriptor,分配的内存等。我知道execve也应该保留这种信息,所以只要O_CLOEXEC标志没有设置,就应该保留每个打开的filedescriptor。

我尝试了一个简单的python脚本:

fd.py:

代码语言:javascript
复制
#!/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

作为输出,我得到:

代码语言:javascript
复制
father table :  ['0', '1', '2', '3', '4']
child table :  ['0', '1', '2', '3']

在fork之后,我保留了相同的fd表,但是每当我在可执行文件上使用execve时,我丢失了所有文件,并默认打开了fd。为什么打开的fd消失了?谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-21 01:22:25

与python2不同,python3 (从3.4版开始)默认打开带有O_CLOEXEC标志的文件。

我不是python程序员,但是可以通过在new_fd = ..行后面添加以下命令来关闭文件上的O_CLOEXEC

代码语言:javascript
复制
        os.set_inheritable(new_fd.fileno(), True)

(在python 3.6.6上测试,请参阅文档here)

或者,在像3.5.3这样的旧版本上:

代码语言:javascript
复制
        tmp_fd = os.dup(new_fd.fileno())
        os.dup2(tmp_fd, new_fd.fileno())
        os.close(tmp_fd)

(默认用于将目的fd设置为inheritable的os.dup2)

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56690216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档