Linux-Kernel
ioctl 呼叫是否阻塞?
我正在圍繞 libgpiod 的界面編寫一些程式碼。例如,我想設置一條線輸出高。在後台,libgpiod 打開核心為該行提供的 fd,然後呼叫
ioctl(fd, GPIO_V2_LINE_SET_VALUES_IOCTL, ...)
.我的問題是:
- 這個特定
ioctl()
的呼叫(帶有參數)在理論上(可能)是否以與寫入任意文件描述符GPIO_V2...
相同的方式阻塞?ioctl()
一般來說,電話在理論上是阻塞的嗎?例如,首先請求線路還涉及ioctl()
晶片的fd。I2Cioctl()
呢?- 如果它是阻塞的,
fd
那麼 struct (line->fd_handle->fd
) 行中的底層是我需要在事件循環中等待的那個(例如,epoll()
或者像 libuv 這樣的抽象事件庫)?我試圖通過研究來回答這個問題,但是(a)搜尋“ioctl”和“blocking”的任何組合只會給出將 fd設置為阻塞或不阻塞的結果,並且(b)它不在手冊頁或核心中我可以找到的文件。
GPIO_V2_LINE_SET_VALUES_IOCTL
似乎足夠安全;它符合預期的用途ioctl
,“manipulat$$ ing $$特殊文件的底層設備參數”。它是在 中實現的
linereq_set_values
,它獲取了一個鎖,但我不認為鎖可以無限期地阻塞(它的使用者都是非阻塞的)。 2. 從理論上講,人們可能期望ioctl
s 是非阻塞的,因為它們主要用於配置驅動程序。然而,有些ioctl
s 的作用遠不止於此:例如,FICLONERANGE
涉及FICLONE
實際的 I/O,更糟糕的是,它們受到 NFS v4.2 等一些網路文件系統的支持,因此它們可以無限期地阻塞。 3. 見上文第 1 點。