35.10。 fcntl - fcntlioctl系统调用

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.

该模块定义了以下功能:

fcntl.fcntl(fd, op[, arg])

对文件描述符fd执行op操作(也可以接受提供fileno()方法的文件对象)。用于op的值与操作系统有关,并且可以作为fcntl模块中的常量使用,与相关C头文件中使用的名称相同。参数arg是可选的,默认为整数值0存在时,它可以是一个整数值或一个字符串。缺少参数或整数值时,该函数的返回值是C fcntl()调用的整数返回值。当参数是字符串时,它表示二进制结构,例如created by struct.pack(). 二进制数据被复制到缓冲区,缓冲区的地址被传递给C fcntl()调用。成功调用后的返回值是缓冲区的内容,转换为字符串对象。返回的字符串的长度将与arg参数的长度相同。这限制在1024字节。如果操作系统在缓冲区中返回的信息大于1024字节,这很可能导致分段违例或更微妙的数据损坏。

如果fcntl()失败,则会引发IOError

fcntl.ioctl(fd, op[, arg[, mutate_flag]])

该函数与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])
fcntl.flock(fd, op)

对文件描述符fd执行锁定操作op(也可以接受提供fileno()方法的文件对象)。有关详细信息,请参阅Unix手册flock(2)(在某些系统上,该功能使用fcntl()进行仿真。)

fcntl.lockf(fd, operation[, length[, start[, whence]]])

这实际上是围绕fcntl()锁定调用的包装器。fd是要锁定或解锁的文件的文件描述符,操作是以下值之一:

  • LOCK_UN - 解锁
  • LOCK_SH - 获取共享锁
  • LOCK_EX - 获取排他锁

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属性设置为EACCESEAGAIN(取决于操作系统;可移植性,检查这两个值)。在至少一些系统中,只有在文件描述符引用打开文件才能使用的情况下,才能使用LOCK_EX

长度是要锁定的字节数,开始是锁定开始的字节偏移量,相对于whenceio.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.

See also

Module os
If the locking flags O_SHLOCK and O_EXLOCK are present in the os module (on BSD only), the os.open() function provides an alternative to the lockf() and flock() functions.

Previous topic

35.9. pty — Pseudo-terminal utilities

Next topic

35.11. pipes — Interface to shell pipelines

This Page