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

Python 如何在常规文件上生成POLLPRI事件?,python,sockets,Python,Sockets,在Linux上使用sysfs GPIO时,系统会指示您对POLLPRI和POLLERR事件进行poll 这很容易: poll = select.poll() poll.register(filename, select.POLLPRI | select.POLLERR) result = poll.poll(timeout=timeout) 但是,我想为这段代码编写测试,并为依赖它的应用程序编写模拟测试。因此,我需要能够引发一个POLLPRI事件 我已尝试使用Unix域套接字,但在域套接字连接

在Linux上使用sysfs GPIO时,系统会指示您对
POLLPRI
POLLERR
事件进行
poll

这很容易:

poll = select.poll()
poll.register(filename, select.POLLPRI | select.POLLERR)
result = poll.poll(timeout=timeout)
但是,我想为这段代码编写测试,并为依赖它的应用程序编写模拟测试。因此,我需要能够引发一个
POLLPRI
事件

我已尝试使用Unix域套接字,但在域套接字连接后无法打开文件进行读取(
errno 6
,没有此类设备)。我还尝试使用带有
sockdgram
的套接字,但如果尚未创建文件,则无法找到该文件,或者导致连接被拒绝

我想要一种方法来打开一个常规文件或创建一个可以像常规文件一样打开的文件,并能够向其发送一个被视为“紧急数据”的消息流。ie
MSG\u OOB


我能做什么?

看起来您可以通过轮询procfs中公开的sysctl来实现这一点。如果查看,您将看到任何实现轮询通知的sysctl都将返回一个包含
POLLERR | POLLPRI
的掩码。那么,我们如何弄清楚是什么sysctl实现了这一点呢?我们寻找
proc\u sys\u poll\u notify的用法

其中一个地方是,它在
/proc/sys/kernel
下实现了许多sysctl。其中大多数是只读的,但是可以编写
hostname
domainname
(另请参见它们的)

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

这可能是在合成文件系统实现中完成这类工作的最简单方法。当然,测试代码的唯一真正方法是
轮询(2)
您的一个PIN,按下一个按钮,看看是否有上升/下降信号中断

注::


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

非常酷。我不会接受答案,因为根需求和在/proc/sys/kernel中触摸东西的潜在副作用,但它确实提供了所要求的,所以赏金给你!您可以使用类似的方法在合成文件系统中挖掘POLLPRI的其他实例;您可能会找到一些总是返回此信息的接口--我没有找到任何简单的接口,但我只查找了几分钟,不知道您有哪些可用的设备。很高兴这至少是一些帮助!找到一个非根目录策略,在sysfs中轮询文件。也许这是一个令人满意的答案?
>>> 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)]