ioctl 调用会阻塞吗?

det*_*tly 5 file-descriptors linux-kernel gpio ioctl

我正在围绕 libgpiod 的接口编写一些代码。比如我想设置一条线输出高电平。在底层,libgpiod 打开内核为该行提供的 fd,然后调用ioctl(fd, GPIO_V2_LINE_SET_VALUES_IOCTL, ...).

我的问题是:

  • 这个特定的ioctl()调用(带有GPIO_V2...参数)理论上(可能)是否会像写入任意文件描述符一样阻塞?

  • ioctl()理论上来说,呼叫通常会阻塞吗?例如,首先请求线路还涉及ioctl()芯片的 on a fd。I2C 怎么样ioctl()

  • fd如果它是阻塞的,那么行 struct ( ) 中的底层是否是line->fd_handle->fd我需要在事件循环中等待的底层(例如,epoll()或像 libuv 这样的抽象事件库)?

我试图通过研究来回答这个问题,但是(a)搜索“ioctl”和“blocking”的任何组合只会给出将fd设置为阻塞或不阻塞的结果,并且(b)它不在手册页或内核中我能找到的文档。

Ste*_*itt 3

    \n
  1. GPIO_V2_LINE_SET_VALUES_IOCTL看起来足够安全;ioctl它与 \xe2\x80\x9cmanipulat[ing] 特殊文件\xe2\x80\x9d 的底层设备参数的预期用途相匹配。它是在 中实现的linereq_set_values,它获取锁,但我不认为锁可以无限期地阻塞(它的用户都是非阻塞的)。

    \n
  2. \n
  3. 从理论上讲,人们可能期望ioctls 是非阻塞的,因为它们主要用于配置驱动程序。然而,有些ioctls 的作用远不止于此:例如,FICLONERANGE涉及FICLONE实际的 I/O,更糟糕的是,它们受到某些网络文件系统(例如 NFS v4.2)的支持,因此可以想象它们会无限期地阻塞。

    \n
  4. \n
  5. 参见上面第 1 点。

    \n
  6. \n
\n