亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 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 關注
  • 167 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號