在Linux上使用sysfs GPIO时,会指示您poll参与POLLPRI和POLLERR事件.
这很容易:
poll = select.poll()
poll.register(filename, select.POLLPRI | select.POLLERR)
result = poll.poll(timeout=timeout)
Run Code Online (Sandbox Code Playgroud)
但是,我想为此代码编写测试,并为依赖它的应用程序进行模拟测试.所以,我需要能够引发一个POLLPRI事件.
我尝试过使用Unix域套接字,但是在域套接字连接后,我无法打开文件进行读取(errno 6没有这样的设备).我也尝试使用套接字SOCK_DGRAM,但如果尚未创建文件,则无法找到该文件,或者拒绝连接.
我想要一种方法来打开常规文件或创建一个可以像常规文件一样打开的文件,并能够发送一个被视为"紧急数据"的消息流.即MSG_OOB.
我能做什么?
看起来您可以通过轮询 procfs 中公开的 sysctl 来实现此目的。如果您查看procfs 中子目录的 poll 实现sys,您将看到任何实现 poll 通知的 sysctl 都将返回一个包含POLLERR|POLLPRI. 那么我们如何找出哪些 sysctls 实现了这一点呢?我们寻找 的用途proc_sys_poll_notify!
其中一个地方就是 in proc_do_uts_string,它在/proc/sys/kernel. 其中大多数是只读的,但hostname可以domainname写入(另请参阅它们的表条目)。
当然,这需要root权限才能写入例如/proc/sys/kernel/hostname.
这可能是在合成文件系统实现中完成此类操作的最简单方法。当然,测试代码的唯一真正poll(2)方法是在其中一个引脚上按下按钮,然后查看是否收到上升/下降信号中断。
>>> import select
>>> f = open('/sys/bus/clockevents/devices/clockevent0/uevent', 'r')
>>> p = select.poll()
>>> p.register(f, select.POLLPRI | select.POLLERR)
>>> result = p.poll(10)
>>> result
[(3, 10)]
Run Code Online (Sandbox Code Playgroud)
10是当然的POLLPRI (0x2) | POLLERR (0x8)。/sys/power/state我使用我的输入得到了相同的结果。基本上,如果您轮询 sysfs 中任何用户可读的非目录文件条目,您就会返回POLLPRI | POLLERR。