Unix特定服务fcntl(Python教程)(参考资料)
fcntl
– fcntl
和ioctl
系统调用
该模块对文件描述符执行文件控制和I / O控制。它是fcntl()
和ioctl()
Unix例程的接口。有关这些调用的完整描述,请参见fcntl(2)和ioctl(2) Unix手册页.
本模块中的所有函数都将文件描述符fd作为其第一个参数。这可以是整数文件描述符,例如sys.stdin.fileno()
返回的,或io.IOBase
对象,例如sys.stdin
本身,它提供fileno()
返回一个真正的filedescriptor.
该模块定义了以下内容functions:
fcntl.
fcntl
(fd, cmd, arg=0)- 对文件描述符cmd执行操作fd(文件对象提供
fileno()
方法也被接受)。用于cmd的值是依赖于操作系统的,并且可以在fcntl
模块中作为常量使用,使用与相关Cheader文件中使用的相同的名称。争论arg可以是整数值,也可以是bytes
对象。对于整数值,thisfunction的返回值是C //的整数返回值fcntl()
呼叫。当参数是字节时,它表示二进制结构,例如由…制作struct.pack()
。二进制数据被复制到缓冲区,其地址被转移到Cfcntl()
呼叫。成功调用后的返回值是缓冲区的内容,转换为bytes
对象。返回的对象的长度将与arg论点。这限制为1024字节。如果操作系统在缓冲区中返回的信息大于1024字节,则很可能导致分段违规或更微妙的数据中断.如果
fcntl()
失败,OSError
被养了
fcntl.
ioctl
(fd, 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.
flock
(fd, operation)- 执行锁定操作operation在文件描述符上fd(也接受提供
fileno()
方法的文件对象)。有关详细信息,请参阅Unix手册flock(2)。(在某些系统上,这个功能是使用fcntl()
.)
fcntl.
lockf
(fd, cmd, len=0, start=0, whence=0)- 这基本上就是
fcntl()
锁定电话fd是要锁定或解锁的文件的文件描述符,cmd是以下值之一:LOCK_UN
– 开锁LOCK_SH
– 获得共享锁LOCK_EX
– 获得独家锁
当cmd是
LOCK_SH
或LOCK_EX
时,它也可以与LOCK_NB
进行ORIV,以避免阻塞锁定。如果使用LOCK_NB
并且无法获取锁定,将引发OSError
并且异常将errno属性设置为EACCES
或EAGAIN
(取决于操作系统;为了便携性,检查两个值)。至少在某些系统上,LOCK_EX
只能在文件描述符引用打开写入时才能使用.len是要锁定的字节数,start是字节偏移量锁定开始时,相对于whence和whence与
io.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()
调用可能更好.
评论被关闭。