Platforms: Unix
该模块对文件描述符执行文件控制和I / O控制。它是fcntl()和ioctl() Unix例程的接口。
该模块中的所有功能都将文件描述符fd作为其第一个参数。This can be an integer file descriptor, such as returned by sys.stdin.fileno(), or a file object, such as sys.stdin itself, which provides a fileno() which returns a genuine file descriptor.
该模块定义了以下功能:
对文件描述符fd执行op操作(也可以接受提供fileno()方法的文件对象)。用于op的值与操作系统有关,并且可以作为fcntl模块中的常量使用,与相关C头文件中使用的名称相同。参数arg是可选的,默认为整数值0。存在时,它可以是一个整数值或一个字符串。缺少参数或整数值时,该函数的返回值是C fcntl()调用的整数返回值。当参数是字符串时,它表示二进制结构,例如created by struct.pack(). 二进制数据被复制到缓冲区,缓冲区的地址被传递给C fcntl()调用。成功调用后的返回值是缓冲区的内容,转换为字符串对象。返回的字符串的长度将与arg参数的长度相同。这限制在1024字节。如果操作系统在缓冲区中返回的信息大于1024字节,这很可能导致分段违例或更微妙的数据损坏。
如果fcntl()失败,则会引发IOError。
该函数与fcntl()函数相同,除了操作通常在库模块termios中定义,参数处理更加复杂。
op参数限于可以适合32位的值。可以在termios模块中找到用作op参数的附加常数,与相关C头文件中使用的名称相同。
参数arg可以是一个整数,不存在(与整数0相同处理),一个支持只读缓冲区接口的对象(很可能是一个简单的Python字符串)或支持读写缓冲区接口的对象。
除了最后一种情况,除了fcntl()函数之外,行为也是如此。
如果传递了可变缓冲区,则该行为由mutate_flag参数的值确定。
如果它是假的,则缓冲区的可变性被忽略,并且行为与只读缓冲区相同,只是避免了上述1024字节限制 - 只要您通过的缓冲区与操作系统需要的一样长放在那里,事情应该工作。
如果mutate_flag为真,则缓冲区(实际上)传递到底层的ioctl()系统调用,后者的返回码传递回调用Python,缓冲区的新内容反映了ioctl()的动作。这是一个轻微的简化,因为如果提供的缓冲区小于1024字节长,它首先被复制到1024字节长的静态缓冲区中,然后传递给ioctl()并复制回提供的缓冲区。
如果没有提供mutate_flag,那么从Python 2.5开始,它默认为true,这是从2.3和2.4版本的变化。如果版本可移植性是优先级,则明确提供参数。
An example:
>>> 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])
对文件描述符fd执行锁定操作op(也可以接受提供fileno()方法的文件对象)。有关详细信息,请参阅Unix手册flock(2)。(在某些系统上,该功能使用fcntl()进行仿真。)
这实际上是围绕fcntl()锁定调用的包装器。fd是要锁定或解锁的文件的文件描述符,操作是以下值之一:
When operation is LOCK_SH or LOCK_EX, it can also be bitwise ORed with LOCK_NB to avoid blocking on lock acquisition. 如果使用了LOCK_NB并且无法获取锁定,则将引发IOError,并将异常将errno属性设置为EACCES或EAGAIN(取决于操作系统;可移植性,检查这两个值)。在至少一些系统中,只有在文件描述符引用打开文件才能使用的情况下,才能使用LOCK_EX。
长度是要锁定的字节数,开始是锁定开始的字节偏移量,相对于whence和与io.IOBase.seek()一样,具体来说:
start的默认值为0,这意味着从文件的开头开始。长度的默认值为0,这意味着锁定到文件的末尾。whence的默认值也为0。
Examples (all on a SVR4 compliant system):
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将保存一个整数值;在第二个例子中,它将持有一个字符串值。The structure lay-out for the lockdata variable is system dependent — therefore using the flock() call may be better.