首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ioctl电话阻塞了吗?

ioctl电话阻塞了吗?
EN

Unix & Linux用户
提问于 2021-07-01 04:39:26
回答 2查看 2K关注 0票数 5

我正在编写一些关于libgpiod接口的代码。例如,我想要设置一条高输出线。在引擎盖下面,libgpiod打开内核为行提供的fd,然后调用ioctl(fd, GPIO_V2_LINE_SET_VALUES_IOCTL, ...)

我的问题是:

  • 这个特定的ioctl()调用(带有GPIO_V2...参数)理论上(潜在地)阻塞的方式与写入任意文件描述符的方式相同吗?
  • ioctl()调用在理论上是否一般是阻塞的?例如,首先请求行也涉及到芯片fd上的ioctl()。I2C ioctl()s呢?
  • 如果它是阻塞的,是行结构(line->fd_handle->fd)中的底层D14--我需要在事件循环中等待它(例如。epoll()或者像libuv这样的抽象事件库)?

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

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2021-08-02 09:16:48

  1. GPIO_V2_LINE_SET_VALUES_IOCTL看起来很安全;它与ioctl的预期使用相匹配,即“操纵特殊文件的底层设备参数”。它是在linereq_set_values中实现的,它获得了一个锁,但我不认为该锁可以无限期地阻塞(它的用户都是非阻塞的)。
  2. 理论上,人们可能会认为ioctls是非阻塞的,因为它们主要是为了配置驱动程序。
  3. 见上文第1点。
票数 3
EN

Unix & Linux用户

发布于 2023-05-02 08:47:03

首先,GPIO uAPI ioctl()s是同步的,即在操作完成之前不会返回。它们不是异步的,因此您可以启动操作并等待完成通知。

因此,在回答第三个问题时,没有fd可以等待GPIO uAPI ioctl()完成--在操作完成之前,调用线程不会从ioctl()返回。

( uAPI中fds的可读性与ioctl()s无关,而是表示发生了异步事件,可以从文件中读取事件详细信息。对于行请求fds,这是一个边缘事件。对于芯片fds来说,这是对线路请求状态的更改--它是否已被请求、释放或重新配置。)

我最初对你的第一个问题的反应是,GPIO uAPI ioctl()s,比如GPIO_V2_LINE_SET_VALUES_IOCTL,实际上是非阻塞的。虽然它们可能涉及覆盖共享状态的互斥,但在一天结束时,它们会保护对控制硬件的寄存器的写操作,并且几乎会立即返回,因此任何争用都将是短暂的,任何开销都将小于用户空间中线程之间的上下文切换。考虑到这一点,您可以直接调用它--即使在epoll()循环中也是如此。

对于直接托管在SOC和微控制器上的GPIO,这可能是正确的,但是对于通过I2C或SPI连接的GPIO扩展程序芯片,或者您拥有的东西,在相应的事务完成之前,ioctl()不会返回。这需要多长时间取决于总线等,而这种延迟对您是否重要取决于您的应用程序。它不会无限期地阻止您的事件循环,但它可能会拖得比您想要的时间长。

所以在回答你的第一个问题时,如果你指的是无限期的阻塞,那么不,它们不应该无限期地阻塞。但在某些情况下,它们可能需要一段相当长的时间才能完成,这对你来说可能很重要。

我认为这也适用于第二个问题。通常可以假定它们是非阻塞的,但这取决于特定的ioctl()和您的应用程序。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/656510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档