首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是os.fdopen()语义?

什么是os.fdopen()语义?
EN

Stack Overflow用户
提问于 2014-04-09 15:04:55
回答 1查看 1.1K关注 0票数 4

我曾经认为,os.fdopen()要么吃文件描述符,然后返回文件io对象,要么引发异常。

例如:

代码语言:javascript
复制
fd = os.open("/etc/passwd", os.O_RDONLY)
try: os.fdopen(fd, "w")
except: os.close(fd)  # prevent memory leak

然而,这些语义似乎并不总是适用。

下面是OSX上的一个示例:

代码语言:javascript
复制
In [1]: import os

In [2]: os.open("/", os.O_RDONLY, 0660)
Out[2]: 5

In [3]: os.fdopen(5, "rb")
---------------------------------------------------------------------------
IOError                                   Traceback (most recent call last)
<ipython-input-3-3ca4d619250e> in <module>()
----> 1 os.fdopen(5, "rb")

IOError: [Errno 21] Is a directory: '<fdopen>'

In [4]: os.close(5)
---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
<ipython-input-4-76713e571514> in <module>()
----> 1 os.close(5)

OSError: [Errno 9] Bad file descriptor

似乎os.fdopen()既吃了我的文件描述符5,又引发了一个异常.

有安全的方法使用os.fdopen()吗?

我错过了什么吗?

我找到窃听器了吗?

Ps.PythonVersionString Python 2.7.6 (v2.7.6:3a1db0d2747e, Nov 10 2013, 00:42:54),以防有人无法用他们的版本复制。

P.P.S.在Py2.7Linux上也存在同样的问题。然而Py3.3并没有出现上述问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-09 16:44:09

Python在创建python文件对象并将其存储在python对象中之后,检查生成的FILE*不引用目录。由于目录检查中的错误,文件对象是deref(因为它不会被返回),这将导致调用析构函数来关闭文件。

我同意,如果文档显示它可以对传入的文件描述符产生什么样的影响,那就太好了。我不知道你想用什么“安全”的方式使用fdopen。如果要在失败时关闭filedescriptor,那么被python关闭有什么关系呢?只管用

代码语言:javascript
复制
try: os.close(fd)
except: pass

去解决次要的例外。

fill_file_fieldsPyFile_FromFile调用以填充文件对象的成员,并在字段填充后调用dircheck函数。这导致fill_file_fields返回NULL,所以Py_DECREF(f);,其中f是文件对象。由于这是最后一次引用,所以调用file_dealloc调用close_the_file (意外,意外)关闭文件。

在3.4个分支中,file检查是从fileio_init完成的,它使用标志变量fd_is_own来确定是否应该在错误条件下关闭文件。

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

https://stackoverflow.com/questions/22966655

复制
相关文章

相似问题

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