fcntl
--- fcntl
和 ioctl
系统调用¶
该模块对文件描述符执行文件控制和I/O控制。它是 fcntl()
和 ioctl()
Unix例程。有关这些调用的完整描述,请参阅 fcntl(2) 和 ioctl(2) Unix手册页。
此模块中的所有函数都采用文件描述符 fd 作为他们的第一个参数。这可以是一个整数文件描述符,例如 sys.stdin.fileno()
,或者 io.IOBase
对象,例如 sys.stdin
它本身提供了 fileno()
返回一个真正的文件描述符。
在 3.8 版更改: fcntl模块现在包含 F_ADD_SEALS
, F_GET_SEALS
和 F_SEAL_*
密封常数 os.memfd_create()
文件描述符。
在 3.9 版更改: 在macOS上,fcntl模块公开 F_GETPATH
常数,它从文件描述符获取文件的路径。在Linux上(>=3.15),fcntl模块公开 F_OFD_GETLK
, F_OFD_SETLK
和 F_OFD_SETLKW
常量,用于打开文件描述锁。
在 3.10 版更改: 在Linux>=2.6.11上,fcntl模块公开 F_GETPIPE_SZ
和 F_SETPIPE_SZ
常量,它们允许分别检查和修改管道的大小。
该模块定义了以下功能:
- fcntl.fcntl(fd, cmd, arg=0)¶
执行操作 cmd 在文件描述符上 fd (文件对象提供
fileno()
方法也被接受)。用于 cmd 是否依赖于操作系统,并且在fcntl
模块,使用相关C头文件中使用的相同名称。参数 arg 可以是整数值,也可以是bytes
对象。对于整数值,此函数的返回值是C的整返回值fcntl()
调用。当参数为字节时,它表示二进制结构,例如struct.pack()
. 二进制数据被复制到一个缓冲区,该缓冲区的地址被传递给Cfcntl()
调用。成功调用后的返回值是缓冲区的内容,转换为bytes
对象。返回对象的长度将与 arg 参数。限制为1024字节。如果操作系统在缓冲区中返回的信息大于1024字节,则很可能导致分段冲突或更微妙的数据损坏。如果
fcntl()
失败,一个OSError
提高了。提出一个 auditing event
fcntl.fcntl
带着论据fd
,cmd
,arg
.
- fcntl.ioctl(fd, request, arg=0, mutate_flag=True)¶
此函数与
fcntl()
函数,但参数处理更加复杂。这个 请求 参数仅限于可以容纳32位的值。其他感兴趣的常量用作 请求 参数可以在
termios
模块,名称与相关C头文件中使用的名称相同。参数 arg 可以是一个整数,一个支持只读缓冲区接口的对象(如
bytes
)或支持读写缓冲区接口的对象(如bytearray
)除了最后一种情况,行为就是
fcntl()
功能。如果传递了可变缓冲区,则行为由 mutate_flag 参数。
如果为false,则会忽略缓冲区的可变性,而行为与只读缓冲区类似,但要避免上述1024字节的限制——只要传递的缓冲区至少与操作系统希望放置的缓冲区一样长,事情就应该正常进行。
如果 mutate_flag 为true(默认值),然后将缓冲区(实际上)传递给基础
ioctl()
系统调用,后者的返回代码被传递回调用的python,缓冲区的新内容反映了ioctl()
. 这是一个小小的简化,因为如果提供的缓冲区小于1024字节长,则首先将其复制到静态缓冲区1024字节长,然后将其传递给ioctl()
并复制回提供的缓冲区。如果
ioctl()
失败,一个OSError
引发异常。一个例子:
>>> import array, fcntl, struct, termios, os >>> os.getpgrp() 13341 >>> struct.unpack('h', fcntl.ioctl(0, termios.TIOCGPGRP, " "))[0] 13341 >>> buf = array.array('h', [0]) >>> fcntl.ioctl(0, termios.TIOCGPGRP, buf, 1) 0 >>> buf array('h', [13341])
提出一个 auditing event
fcntl.ioctl
带着论据fd
,request
,arg
.
- fcntl.flock(fd, operation)¶
执行锁定操作 操作 在文件描述符上 fd (文件对象提供
fileno()
方法也被接受)。参见Unix手册 flock(2) 详情。(在某些系统上,使用fcntl()
)如果
flock()
失败,一个OSError
引发异常。提出一个 auditing event
fcntl.flock
带着论据fd
,operation
.
- fcntl.lockf(fd, cmd, len=0, start=0, whence=0)¶
这本质上是一个包装
fcntl()
锁定调用。 fd 是文件描述符(文件对象提供fileno()
方法也被接受)要锁定或解锁的文件,以及 cmd 是以下值之一:LOCK_UN
--解锁LOCK_SH
--获取共享锁LOCK_EX
--获取独占锁
什么时候? cmd 是
LOCK_SH
或LOCK_EX
,也可以按位或LOCK_NB
以避免锁定采集时阻塞。如果LOCK_NB
已使用,但无法获取锁,OSError
将引发异常,异常将具有 埃尔诺 属性设置为EACCES
或EAGAIN
(取决于操作系统;对于可移植性,请检查这两个值)。至少在某些系统上,LOCK_EX
仅当文件描述符引用打开以进行写入的文件时才能使用。len 是要锁定的字节数, 开始 是锁开始的字节偏移量,相对于 何处 和 何处 和一样
io.IOBase.seek()
,具体地说:0
--相对于文件开头 (os.SEEK_SET
)1
--相对于当前缓冲区位置 (os.SEEK_CUR
)2
--相对于文件结尾 (os.SEEK_END
)
默认值为 开始 是0,这意味着从文件的开头开始。默认值为 len 是0,表示锁定到文件结尾。默认值为 何处 也是0。
提出一个 auditing event
fcntl.lockf
带着论据fd
,cmd
,len
,start
,whence
.
示例(全部在符合SVR4的系统上)::
import struct, fcntl, os
f = open(...)
rv = fcntl.fcntl(f, fcntl.F_SETFL, os.O_NDELAY)
lockdata = struct.pack('hhllhh', fcntl.F_WRLCK, 0, 0, 0, 0, 0)
rv = fcntl.fcntl(f, fcntl.F_SETLKW, lockdata)
注意,在第一个示例中,返回值变量 rv 将保存一个整数值;在第二个示例中,它将保存一个 bytes
对象。结构布局为 锁数据 变量取决于系统,因此使用 flock()
调用可能更好。