什么是os.close(3)?

时间:2015-11-05 15:29:50

标签: python linux

os.close(3)是什么?

我正在阅读 python cookbook 2nd 第2.9章,它解释了python zip文件的工作原理。其中有一段代码我还没有真正得到它。

import zipfile, tempfile, os, sys
handle, filename = tempfile.mkstemp('.zip')
os.close(handle)  # <- handle is int 3 here
z = zipfile.ZipFile(filename, 'w')
z.writestr('hello.py', 'def f(): return "hello world from "+__file__\n')
z.close()
sys.path.insert(0, filename)
import hello
print hello.f()
os.unlink(filename)

osthon中的os.close()解释:

此函数用于低级I / O,必须应用于os.open()或pipe()返回的文件描述符。要关闭内置函数open()或popen()或fdopen()返回的“文件对象”,请使用其close()方法。

Linux中的文件描述符来自0,1&amp; 2是stdin,stdout&amp; stderror,我不知道fd 3的用途是什么?即使我已经读过这个&#34; What is the file descriptor 3 assigned by default?&#34;。

我评论os.close(handle),但输出没有区别。

2 个答案:

答案 0 :(得分:4)

尽管Python主要处理“文件对象”,但它们是围绕操作系统级文件句柄的抽象;当在操作系统级别实际读取或写入文件(或网络流或其他类文件对象)的内容时,可以向操作系统传递与要与之交互的文件相关联的句柄号。因此,Python中实际由OS级文件句柄支持的每个文件对象都具有关联的文件描述符号。

文件句柄存储在表中,每个表都与一个整数相关联。在Linux上,您可以查看目录/proc/self/fds(用self的PID编号替换以查看不同的进程)以查看哪些句柄具有给定进程的数字。

因此,

handle, filename = tempfile.mkstemp('.zip'); os.close(handle)关闭mkstemp返回给您的操作系统级文件句柄。

顺便说一下:重要的是要注意数字3没有什么特别之处,并且在操作系统级别没有默认或传统行为;它恰好是调用mkstemp时文件句柄表中的下一个可用位置(或者,更确切地说,当mkstemp的C标准库实现称为OS级别的系统调用时{{ 1}})。

答案 1 :(得分:0)

您正在获取文件描述符3,因为在这种情况下,它是下一个可用的文件描述符。如您所述,stdin(0),stdout(1)和stderr(2)会自动为您打开。您引用的链接(https://unix.stackexchange.com/questions/41421/what-is-the-file-descriptor-3-assigned-by-default)也指出了这一点。