fcntlfcntlioctl系统调用


模块对文件描述符执行文件控制和I / O控制。它是fcntl()ioctl() Unix例程的接口。有关这些调用的完整描述,请参见fcntl(2)ioctl(2) Unix手册页.

模块中的所有函数都将文件描述符fd作为其第一个参数。这可以是整数文件描述符,例如sys.stdin.fileno()返回的,或io.IOBase对象,例如sys.stdin本身,它提供fileno()返回一个真正的filedescriptor.

在版本3.3中更改:这个模块中的操作用于提升IOError他们现在提取OSError.

该模块定义了以下内容functions:

fcntl.fcntlfd, cmd, arg=0
对文件描述符cmd执行操作fd(文件对象提供fileno()方法也被接受)。用于cmd的值是依赖于操作系统的,并且可以在fcntl模块中作为常量使用,使用与相关Cheader文件中使用的相同的名称。争论arg可以是整数值,也可以是bytes对象。对于整数值,thisfunction的返回值是C //的整数返回值fcntl()呼叫。当参数是字节时,它表示二进制结构,例如由…制作struct.pack()。二进制数据被复制到缓冲区,其地址被转移到C fcntl()呼叫。成功调用后的返回值是缓冲区的内容,转换为bytes对象。返回的对象的长度将与arg论点。这限制为1024字节。如果操作系统在缓冲区中返回的信息大于1024字节,则很可能导致分段违规或更微妙的数据中断.

如果fcntl()失败,OSError被养了

fcntl.ioctlfd, request, arg=0, mutate_flag=True
此功能与fcntl()功能,除了参数处理更复杂.

request参数限制为可以容纳32位的值。用作request参数的附加常量可以在termios模块中找到,其名称与相关C头中使用的名称相同files.

参数arg可以是整数之一,支持只有缓冲区接口的对象(如bytes)或支持读写缓冲区接口的对象(喜欢bytearray).

除了最后一种情况外,行为与fcntl()功能

如果通过一个可变缓冲区,那么行为由mutate_flag参数的值决定

如果它是假的,则缓冲区的可变性被忽略,行为与仅使用aread的缓冲区一样,除了上面提到的1024字节限制是避免 – 只要您传递的缓冲区至少与操作系统要放置的缓冲区一样长,就应该工作了

如果mutate_flag是真的(默认),那么缓冲区是(实际上)传递到底层的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])
fcntl.flockfd, operation
执行锁定操作operation在文件描述符fd(也接受提供fileno()方法的文件对象)。有关详细信息,请参阅Unix手册flock(2)。(在某些系统上,这个功能是使用fcntl().)

如果flock()失败了,OSError异常被提出.

fcntl.lockffd, cmd, len=0, start=0, whence=0
这基本上就是fcntl()锁定电话fd是要锁定或解锁的文件的文件描述符cmd是以下值之一:

  • LOCK_UN– 开锁
  • LOCK_SH– 获得共享锁
  • LOCK_EX– 获得独家锁

cmdLOCK_SHLOCK_EX时,它也可以与LOCK_NB进行ORIV,以避免阻塞锁定。如果使用LOCK_NB并且无法获取锁定,将引发OSError并且异常将errno属性设置为EACCESEAGAIN(取决于操作系统;为了便携性,检查两个值)。至少在某些系统上,LOCK_EX只能在文件描述符引用打开写入时才能使用.

len是要锁定的字节数,start字节偏移量锁定开始时,相对于whencewhenceio.IOBase.seek()一样,具体来说:

  • 0 – 相对于文件的开头(os.SEEK_SET
  • 1 – 相对于当前缓冲区位置(os.SEEK_CUR
  • 2 – 相对于文件末尾(os.SEEK_END

start的默认值为0,表示从文件开头开始.len的默认值为0表示锁定到文件末尾。whence的默认值也是0.

示例(所有符合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对象。lockdata变量的结构布局取决于系统 – 因此使用flock()调用可能更好.

另见

模块os
如果O_SHLOCK模块中存在锁定标志O_EXLOCKos(仅限BSD),则os.open()功能提供了lockf()flock()功能的替代方法

评论被关闭。