Подтвердить что ты не робот

Используйте случай для низкоуровневых os.open, os.fdopen и друзей?

В Python 3.2 (и других версиях) документа для os.open говорится:

Эта функция предназначена для ввода/вывода низкого уровня. Для нормального использования используйте встроенную функцию open(), которая возвращает объект файла с методами read() и write() (и многие другие). Чтобы обернуть файловый дескриптор в файл-объект, используйте fdopen().

И для fdopen():

Вернуть объект открытого файла, связанный с файловым дескриптором fd. Это псевдоним open() и принимает те же аргументы. Единственное отличие состоит в том, что первый аргумент fdopen() всегда должен быть целым числом.

Этот комментарий в вопросе о разнице между io.open и os.open (эта разница совершенно мне понятна, я всегда использую io.open, никогда os.open) спрашивает: почему кто-то выбирает Python для ввода-вывода низкого уровня?, но на самом деле не получает ответа.

Мой вопрос очень похож на вопрос-комментарий: на Python используется прецедент низкоуровневого ввода-вывода через os.open, os.fdopen, os.close, os.read и т.д.? Раньше я думал, что это необходимо для деамонизации процесса, но Я уже не так уверен. Есть ли какая-либо задача, которая может быть выполнена только с использованием низкоуровневого ввода-вывода, а не с обертками более высокого уровня?

4b9b3361

Ответ 1

Основные отличия:

  • Низкий уровень доступа к файлам небуферирован.
  • Низкий уровень доступа не переносится.
  • Низкий уровень позволяет более мелкозернистый контроль, например. блокировать или не блокировать чтение

Используйте случаи для низкого уровня io:

  • Файл является блочным устройством
  • Файл представляет собой сокет
  • Файл является tty
  • ...

Во всех этих случаях вы можете захотеть иметь более мелкозернистый контроль (над буферизацией и блокировкой).

Вам, вероятно, никогда не понадобятся функции низкого уровня для обычных файлов. Я думаю, что в большинстве случаев прецедентом будет какой-то материал драйвера устройства. Однако это лучше сделать в C. Но я также вижу пример использования для python, например. для быстрого прототипирования драйверов устройств.

Ответ 2

Я использую его, когда мне нужно использовать O_CREAT | O_EXCL для атомарного создания файла, если он не существует. Вы не можете проверить существование файла, а затем создать файл, если ваш тест обнаружил, что он не существует, потому что это создаст условие гонки, в котором файл может быть создан в промежуточный период между вашим проверкой и созданием.

Кратко глядя на ссылку, которую вы предоставили, я считаю, что создание pidfile имеет условие гонки.

В Python 3.3 есть новый 'x' режим, добавленный к open(), который, кажется, делает это. Я даже не пробовал.