Python 3.3+Linuxosфункция
os.pipe2
os — спец. дескрипторы
Как pipe, но сразу задаёт флаги (напр. O_NONBLOCK/O_CLOEXEC) для обоих концов. Доступно на Linux.
Синтаксис
os.pipe2(...)
Задаёт флаги атомарно при создании, без отдельных вызовов для каждого конца: os.pipe2(os.O_NONBLOCK | os.O_CLOEXEC). Атомарность важна в многопоточной программе, где между созданием канала и установкой флагов другой поток мог бы успеть запустить дочерний процесс.
Примеры
import os
r, w = os.pipe2(os.O_NONBLOCK | os.O_CLOEXEC) # → ? только Linux: пара дескрипторов, сразу неблокирующих и закрываемых при exec
print(os.write(w, b'ping')) # → 4
print(os.read(r, 4)) # → b'ping'
os.read(r, 4) # → BlockingIOError — данных больше нет, но из-за O_NONBLOCK вызов не зависает
r2, w2 = os.pipe() # переносимый вариант без флагов: O_NONBLOCK/O_CLOEXEC пришлось бы доставлять отдельными вызовами fcntl, оставляя окно гонки при fork
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности