问题描述
POSIX C
int bytes_available;
ioctl(fd,FIONREAD,&bytes_available);
如何在python中做同样的事情?
解决方法
我认为您正在fcntl.ioctl
标准库中寻找函数fcntl
,并且它在内部使用ioctl
system call。
从文档中,
fcntl.ioctl(fd,request,arg = 0,mutate_flag = True) 与fcntl()函数相同,除了参数处理 更复杂。
request参数限制为可以容纳32位的值。 用作请求参数的其他感兴趣的常量可以 可以在
termios
module中找到,其名称与 相关的C头文件。参数arg可以是整数之一,该对象支持 只读缓冲区接口(如字节)或支持 读写缓冲区接口(如字节数组)。
除最后一种情况外,其他行为均与fcntl()函数相同。
如果传递了可变缓冲区,则行为取决于 mutate_flag参数的值。
如果为假,则忽略缓冲区的可变性,行为为 对于只读缓冲区,除了提到的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,buf,1) 0 >>> buf array('h',[13341])