繁体   English   中英

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

[英]Get amount of bytes available in socket/file-descriptor with python

POSIX C

int bytes_available;
ioctl(fd, FIONREAD, &bytes_available);

如何在python中做同样的事情?

我认为您正在fcntl标准库中寻找函数fcntl.ioctl并且它在内部使用ioctl系统调用

从文档中,

fcntl.ioctl(fd, request, arg=0, mutate_flag=True)该函数与 fcntl() 函数相同,只是参数处理更加复杂。

请求参数仅限于可以容纳 32 位的值。 可以在termios模块中找到用作请求参数的其他感兴趣的常量,其名称与相关 C 头文件中使用的名称相同。

参数 arg 可以是整数、支持只读缓冲区接口的对象(如字节)或支持读写缓冲区接口的对象(如字节数组)之一。

除了最后一种情况外,所有行为都与 fcntl() 函数相同。

如果传递了可变缓冲区,则行为由 mutate_flag 参数的值决定。

如果为 false,则缓冲区的可变性将被忽略,行为与只读缓冲区相同,只是避免了上面提到的 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, termios.TIOCGPGRP, buf, 1) 0 >>> buf array('h', [13341])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM