os模块提供了各种操作系统接口。包括环境变量、进程管理、进程调度、文件操作等方面。
这里整理了操作文件描述符的部分方法。
参考:os模块官方文档
os模块的方法和系统相关,且一些方法依赖python版本,测试时使用下面的在线工具:
在线python-3.12版本-Unix平台
9 文件描述符操作
9.8 文件描述符的状态
-
os.fstat(fd)
获取文件描述符fd的状态。返回一个os.stat_result
对象。>>> os.fstat(fd) os.stat_result(st_mode=33206, st_ino=10414574138430199, st_dev=4192998459605100043, st_nlink=1, st_uid=0, st_gid=0, st_size=2, st_atime=1740682067, st_mtime=1740681988, st_ctime=1740681988)
-
os.fstatvfs(fd)
返回fd指定文件所在的文件系统的信息。>>> fd = os.open("test.txt", os.O_RDONLY) >>> os.fstatvfs(fd) os.statvfs_result(f_bsize=4096, f_frsize=4096, f_blocks=244186111, f_bfree=83501689, f_bavail=83501689, f_files=999, f_ffree=1000000, f_favail=1000000, f_flag=1024, f_namemax=255)
-
os.fchmod(fd, mode)
把fd指定的文件的权限修改为mode。 -
os.fchown(fd, uid, gid)
把fd指定的文件的所有者和组改为uid和gid的值。
uid和gid的值设为-1,表示不更改原有值。 -
os.lockf(fd, cmd, len)
在打开的文件描述符上,使用、测试或删除POSIX锁。仅Unix可用。
cmd
指定要进行的操作,有四个可选值:os.F_LOCK
(加互斥锁,已锁则阻塞)、os.F_TLOCK
(加互斥锁,已锁则返回错误)、os.F_ULOCK
(解锁)、os.F_TEST
(测试是否已上锁,已锁返回0,否则返回-1)。
len
表示从当前位置起要锁住的长度。 -
os.get_blocking(fd)
获取文件描述符的阻塞模式。
设置了os.O_NONBLOCK
标志位时返回False。该标志位已清除则返回True。 -
os.set_blocking(fd, blocking)
设置文件描述符的阻塞模式。
blocking为False时,为文件描述符设置os.O_NONBLOCK
标志位,否则会清除该标志位。>>> os.get_blocking(fd) True >>> os.set_blocking(fd, False) >>> os.get_blocking(fd) False
-
os.lseek(fd, pos, whence)
将文件描述符的当前指针位置设置为pos。
返回新位置相对于文件开头的字节数。
whence
可选的值如下os.SEEK_SET
或0:相对于文件开头设置posos.SEEK_CUR
或1:相对于当前位置设置posos.SEEK_END
或2:相对于文件末尾设置posos.SEEK_HOLE
:设置为相对于pos的下一个包含数据位置os.SEEK_DATA
:设置为相对于pos的下一个包含空洞的位置,空洞指的是零值序列
-
os.fpathconf(fd, name)
返回打开的文件有关的系统配置信息。
name是要查找的配置名称,可用名称在os.pathconf_names
字典中。
9.9 文件描述符的终端
-
os.openpty()
打开一对新的伪终端pty和tty,返回一对文件描述符(主,从)
。
新的文件描述符不可继承。仅Unix可用。 -
os.login_tty(fd)
准备tty,设置fd做为新登陆会话的文件描述符。
仅Unix可用。 -
os.isatty(fd)
文件描述符已打开且连接到tty设备,就返回True。 -
os.tcgetpgrp(fd)
返回与fd指定的终端关联的进程组。 -
os.tcsetpgrp(fd, pg)
设置与fd指定的终端关联的进程组为pg。 -
os.ttyname(fd)
返回表示与fd关联的终端的字符串。
fd如果没有与终端关联,会抛出异常。 -
os.device_encoding(fd)
返回与fd关联的设备的描述信息。
适用于fd连接到某个终端的情况,其它情况返回None。 -
os.get_terminal_size(fd=STDOUT_FILENO)
返回终端窗口尺寸。
返回格式为(列数, 行数)
,是类os.terminal_size
的实例。>>> os.openpty() # 打开伪终端 (4, 5) >>> os.isatty(4) # 测试是否连接到终端 True >>> os.ttyname(4) # 终端的名称 /dev/pts/ptmx >>> os.ttyname(5) /dev/pts/1 >>> os.tcgetpgrp(4) # 终端关联的进程组 0 >>> os.device_encoding(4) # 终端设备的信息 'UTF-8' >>> os.get_terminal_size(4) # 终端的窗口尺寸 os.terminal_size(columns=0, lines=0)
-
os.ctermid()
返回进程控制终端对应的文件名。仅Unix可用。>>> os.ctermid() '/dev/tty'
-
os.grantpt(fd)
允许访问与文件描述符fd指向的主伪终端设备相关联的从伪终端设备。
仅Unix可用。失败时不会关闭fd。 -
os.unlockpt(fd)
解锁与文件描述符fd指向的伪终端设备关联的从伪终端设备。
9.10 复制文件描述符
-
os.dup(fd)
返回文件描述符的副本,该副本是不可继承的。 -
os.dup2(fd, fd2, inheritable=True)
把文件描述符fd复制为fd2,必要时会先关掉fd2。
返回fd2。默认是可继承的。 -
os.sendfile(out_fd, in_fd, offset, count)
把文件描述符in_fd的count字节复制到out_fd的偏移位置offset处。返回复制的字节数。
socket模块有这个方法的高级封装socket.socket.sendfile()
。 -
os.splice(src, dst, count, offset_src=None, offset_dst=None)
从文件描述符src的指定偏移量开始,把count个字节传输到文件描述符dst。
至少有一个描述符必须指向管道,指向管道的描述符对应的offset必须为None。
src和dst指向的文件必须在相同的文件系统中。
该方法没有额外的从内核到用户空间再到内核的数据转移开销。
返回拼接的字节数。返回0表示输入结束。 -
os.copy_file_range(src, dst, count, offset_src=None, offset+dst=None)
把文件描述符src从offset_src位置起开始的count个字节拷贝到文件描述符dst从offset_dst起的位置。
该方法执行的拷贝没有把数据从内核传到用户空间然后再返回内核的消耗。操作的速度和有效性与文件系统相关。
9.11 文件描述符继承
每个文件描述符都有一个inheritable
标志位,用于控制文件描述符是否可以由子进程继承。
执行新程序时,不可继承的文件描述符在子进程中是关闭的。
-
os.get_inheritable(fd)
获取指定文件描述符的可继承标志位的值。 -
os.set_inheritable(fd, inheritable)
设定文件描述符的可继承标志位。>>> fd = os.open("test.txt", os.O_RDONLY) >>> os.get_inheritable(fd) False >>> os.set_inheritable(fd, True) >>> os.get_inheritable(fd) True
-
os.get_handle_inheritable(handle)
(Windows)获取指定句柄的可继承标志位的值。 -
os.set_handle_inheritable(handle, inheritable)
(Windows)设置句柄的可继承标志位。
9.12 事件文件描述符
os.eventfd(initval[, flags=os.EFD_CLOEXEC])
创建并返回一个事件文件描述符。
flags由三个值组合而成:os.EFD_CLOEXEC
,为事件文件描述符设置close-on-exec
标志。os.EFD_NONBLOCK
,为事件文件描述符设置os.O_NONBLOCK
标志。os.EFD_SEMAPHORE
,为事件文件描述符的读取设置类似信号量的语法,读取时内部计数器减一。
os.eventfd_read(fd)
从事件文件描述符读取数据。
返回一个64为无符号整数。
如果设置了os.EFD_SEMAPHORE
,且事件计数器非零,返回1并将计数器减1;如果未设置os.EFD_SEMAPHORE
且事件计数器非零,返回当前计数器值,并把计数器置零。
事件计数器为0,且未设置os.EFD_NONBLOCK
,该方法会阻塞。os.eventfd_write(fd, value)
向事件文件描述符加入数据。
value必须是一个64位无符号整数。
以上是os模块关于文件描述符操作的部分方法整理。
关于该模块的更多信息参考:
os模块:环境变量、进程所属的用户和组
os模块:进程管理
os模块:调度策略、系统信息
os模块:文件和目录1
os模块:文件和目录2
os模块:文件描述符操作1