为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

胡子哥哥 2023-06-27 10:40:54
POSIX Cint bytes_available; ioctl(fd, FIONREAD, &bytes_available);如何在 python 中做同样的事情?
查看完整描述

1 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

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

从文档来看,

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

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

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

除了最后一种情况外,在所有情况下,行为都与 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])


查看完整回答
反对 回复 2023-06-27
  • 1 回答
  • 0 关注
  • 111 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信