1 回答

TA貢獻1876條經驗 獲得超6個贊
我認為您正在標準庫fcntl.ioctl
中尋找該函數,并且它內部使用系統調用。fcntl
ioctl
從文檔來看,
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])
添加回答
舉報