如何在常规文件上生成POLLPRI事件?

时间:2014-12-28 04:28:18

标签: python sockets

在Linux上使用sysfs GPIO时,系统会指示poll POLLPRIPOLLERR事件。

这很简单:

poll = select.poll()
poll.register(filename, select.POLLPRI | select.POLLERR)
result = poll.poll(timeout=timeout)

但是,我想为此代码编写测试,并为依赖它的应用程序进行模拟测试。所以,我需要能够引发POLLPRI事件。

我尝试过使用Unix域套接字,但是在域套接字连接后,我无法打开文件进行读取(errno 6,没有这样的设备)。我也尝试使用SOCK_DGRAM的套接字,但是如果文件尚未创建则无法找到该文件,或者拒绝连接。

我想要一种方法来打开常规文件或创建一个可以像常规文件一样打开的文件,并且能够向它发送被视为"紧急数据"的消息流。即MSG_OOB

我该怎么办?

1 个答案:

答案 0 :(得分:3)

看起来您可以通过轮询procfs中公开的sysctl来实现此目的。如果查看poll implementation in procfs for the sys subdirectory,您将看到任何实现poll通知的sysctl都将返回包含POLLERR|POLLPRI的掩码。那么我们如何弄清楚sysctls实现了什么呢?我们寻找proc_sys_poll_notify的用途!

其中一个位于proc_do_uts_string,它在/proc/sys/kernel下实现了许多sysctl。其中大多数都是只读的,但可以编写hostnamedomainname(另请参阅他们的table entries)。

当然,这需要root权限才能写入例如/proc/sys/kernel/hostname

这可能是在合成文件系统实现中保持这种事情的最简单方法。当然,测试代码的唯一真正的方法是poll(2)其中一个引脚,按一个按钮,看看是否有上升/下降信号中断。

注意:sysfs also does this for edge nodes in the tree

>>> 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)]

10当然是POLLPRI (0x2) | POLLERR (0x8)。我使用/sys/power/state作为输入得到了相同的结果。基本上,如果您在sysfs中轮询任何用户可读的非目录文件条目,您将获得POLLPRI | POLLERR