Python | os.pipe2 函数

怎样创建非阻塞模式管道

最近更新时间 2020-12-11 10:13:11

os.pipe2 函数创建带有 flags 标志位的管道。可通过对以下一个或多个值进行“或”运算来构造这些 flags:O_NONBLOCK、O_CLOEXEC。返回一对分别用于读取和写入的文件描述符 (r, w)。

管道是一种将信息从一个进程传递到另一个进程的方法。它仅提供单向通信,并且传递的信息由系统保留,直到被接收过程读取为止。

这个概念是由道格拉斯·麦克罗伊为 Unix 命令行发明的,因与物理上的管道相似而得名。

功能跟 os.pipe() 函数类似。由于 O_NONBLOCK、O_CLOEXEC 参数只能在 Unix 下可用,该函数也只能在 Unix 系统中使用。

函数定义

os.pipe2(flags)
# 函数定义


if sys.platform != 'win32':
    # Unix only
    ...
    def pipe2(flags: int) -> Tuple[int, int]: ...  # some flavors of Unix
    ...

兼容性:Unix 系统。

参数

  • checkflags - 标志位,os.O_NONBLOCK、os.O_CLOEXEC 值可以单独使用,也可进行 | 异或操作。

返回值

  • checkTuple[int, int] - 读和写文件描述符。

示例1: - 使用 os.pipe2() 函数创建非阻塞模式管道进行读写。

# coding=utf-8

# Python3 代码
# 讲解怎样使用 os.pipe2() 函数创建非阻塞模式管道

# 引入 os 库
import os

# 使用 os.O_NONBLOCK 参数
# 创建一个非阻塞模式管道
flags = os.O_NONBLOCK
r, w = os.pipe2(flags)

# 创建一个子进程
# 父进程用于读,子进程用于写
pid = os.fork()

if pid > 0:
    # 父进程
    # 关闭读文件
    os.close(r)

    # 写入数据
    print("Parent process is writing") 
    text = b"Hello child process"
    os.write(w, text) 
    print("Written text:", text.decode())

else:
    # 子进程
    # 关闭读文件
    os.close(w)

    # 读取父进程数据
    print("\nChild Process is reading") 
    r = os.fdopen(r) 
    print("Read text:", r.read()) 
Parent process is writing
Written text: Hello child process
Child Process is reading
Read text: Hello child process
rss_feed