Python | os.dup2 函数

Lasted 2020-12-08 11:49:34

os.dup2 函数把文件描述符 fd 复制为 fd2,必要时先关闭后者。返回 fd2。新的文件描述符默认是 可继承的,除非在 inheritable 为 False 时,是不可继承的。

在 3.7 版更改: 成功时返回 fd2,以过去的版本中,总是返回 None。

文件描述符是一个数字,用于唯一标识计算机操作系统中打开的文件。它描述了数据资源,以及如何访问该资源。

在类Unix操作系统上,默认情况下,前三个文件描述符为STDIN(标准输入 0),STDOUT(标准输出 1)和STDERR(标准错误 2)。

可以用 io.fileno() 可以获得 file object 所对应的文件描述符。需要注意的是,直接使用文件描述符会绕过文件对象的方法,会忽略如数据内部缓冲等情况。

函数定义

os.dup2(fd, fd2, inheritable=True)
# 函数定义

if sys.version_info >= (3, 7):
    def dup2(fd: int, fd2: int, inheritable: bool = ...) -> int: ...
else:
    def dup2(fd: int, fd2: int, inheritable: bool = ...) -> None: ...

参数

  • checkfd - 源文件描述符。
  • checkfd2 - 目标文件描述符。
  • checkinheritable - [可选] 默认值为True,表示可以继承文件描述符。若要使其不可继承,请将其设置为 False。

返回值

  • checkint - fd2 文件描述符。

示例1: - 使用 os.dup2() 函数复制文件描述符。

# coding=utf-8

# Python3 代码
# 讲解怎样使用 os.dup2() 函数复制文件描述符

# 引入 os 库
import os

# 文件路径
path = "foo.txt"

# 根据路径打开文件
fd = os.open(path, os.O_WRONLY)
print("Original file descriptor:", fd) 

# 复制文件描述符为 10
dup_fd = 10
ret_val = os.dup2(fd, dup_fd)
print("Return Value:", ret_val) 

# 查看当前进程打开的文件
# UNIX 系统
pid = os.getpid() 
os.system("ls -l /proc/%s/fd" %pid) 

# 关闭文件描述符
os.close(fd) 
os.close(dup_fd) 
Original file descriptor: 3
Return Value: 10
总用量 0
lrwx------ 1 root root 64 12月  8 11:41 0 -> /dev/pts/0
lrwx------ 1 root root 64 12月  8 11:41 1 -> /dev/pts/0
l-wx------ 1 root root 64 12月  8 11:41 10 -> /data/python/foo.txt
lrwx------ 1 root root 64 12月  8 11:41 2 -> /dev/pts/0
l-wx------ 1 root root 64 12月  8 11:41 3 -> /data/python/foo.txt