2015-11-05 3 views
1

Что такое os.close (3) для?что такое os.close (3) для?

Я читаю python cookbook 2nd глава 2.9, в котором объясняется, как работает файл zip python. В нем есть один фрагмент кода, который я действительно не получил.

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) 

os.close() В Python объяснения Документов:

Эта функция предназначена для низкого уровня ввода/вывод и должна быть применена к дескриптору файла, как возвращаемый os.open() или труба(). Чтобы закрыть «файл-объект», возвращаемый встроенной функцией open() или popen() или fdopen(), используйте метод close().

Дескриптор файла в Linux от 0,1 & 2, стандартный ввод, стандартный вывод & stderror, я не понимаю, что файловый дескриптор 3 для? Хотя я прочитал это «What is the file descriptor 3 assigned by default?».

Я комментирую os.close(handle), но выход не отличается.

+4

Вы получили 'handle' из' tempfile.mkstemp', так почему бы вам не прочитать документы для этого? Очевидно, что вы закрываете временный файл, почему вы ожидаете, что он будет одним из трех стандартных дескрипторов файлов in/out/err? Кроме того, вы должны прочитать руководство по стилю: http://www.python.org/dev/peps/pep-0008/. – jonrsharpe

+2

В '3' нет ничего волшебного - если ваша программа была запущена с уже используемым FD 3 или ранее была назначена эта номер дескриптора при открытии другого файла (и этот файл не был закрыт), вы бы получили здесь назначается другой номер дескриптора. –

+0

Ответы на вопросы не касаются того, что, хотя вы можете отсоединить файл (например, удалить его имя из списка каталогов), его содержимое не исчезнет, ​​а у кого-то еще есть дескриптор.В частности, пространство не освобождается. (Обычный реальный случай: «Я удалил файл журнала 3 gig, почему я не получил 3-х гигабайт свободного места?» - «Поскольку у вашего prorgam все еще есть удаленный файл open».) –

ответ

4

Хотя Python в основном занимается «файловыми объектами», это абстракция вокруг дескрипторов файлов уровня ОС; при фактическом чтении или записи содержимого в файл (или сетевой поток или другой файл-подобный объект) на уровне операционной системы, передается OS номер дескриптора, связанный с файлом, с которым требуется взаимодействовать. Таким образом, каждый файловый объект в Python, на самом деле поддерживаемый дескриптором файла уровня ОС, имеет такой номер дескриптора файла, который связан.

Файловые дескрипторы хранятся в таблице, каждая из которых связана с целым числом. В Linux вы можете посмотреть каталог /proc/self/fds (подставляя номер PID для self, чтобы посмотреть на другой процесс), чтобы увидеть, какие дескрипторы имеют номера для данного процесса.

handle, filename = tempfile.mkstemp('.zip'); os.close(handle), таким образом, закрывает дескриптор файла уровня ОС, который был возвращен вам mkstemp.


Кстати: Важно отметить, что нет абсолютно ничего особенного числа 3, и что не существует по умолчанию или обычное поведение для таких же реализована на уровне операционной системы; это просто очередная доступная позиция в таблице дескриптора файла, когда был вызван mkstemp (или, если быть более точным, когда реализация стандартной библиотеки C mkstemp называлась syscall уровня ОС open).

0

Вы получаете файловый дескриптор 3, потому что в этом случае это следующий доступный дескриптор файла. Как вы упомянули, stdin (0), stdout (1) и stderr (2) автоматически открываются для вас. Ссылка, которую вы указали (https://unix.stackexchange.com/questions/41421/what-is-the-file-descriptor-3-assigned-by-default), также указывает на это.

+1

Не гарантируется, что FD 3 будет назначен на первый дескриптор файла, который открывается программой; он может наследовать больше или меньше дескрипторов, чем стандартный набор из его родительского процесса (первый, безусловно, более распространенный, чем последний). –

+1

... например, программа, в которой гарантируется запуск только одного экземпляра извне с помощью файла блокировки 'flock()' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ', будет вызываться наследование дескриптора этой блокировки. –

+0

@CharlesDuffy хорошие моменты, и, по-видимому, OP понимает ваш более полный ответ. – davejagoda

Смежные вопросы