使用python获取套接字/文件描述符中可用的字节数

问题描述

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])

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...