在Linux中检测到从pipe/fifo的另一端读取的尝试



我正在考虑在linux的C/C++中实现一种守护程序/服务,它将通过shell(使用linux gpib库)与特定的gpib设备通信。这个想法是,守护进程将扫描所有现有设备,并为每个设备创建一个文件/管道/dev/gpib#-*(其中*将是它们在指定gpib总线上的地址)。使用CCD_ 3。然后我可以在命令行中键入:

echo "*IDN?" > /dev/gpib1-12

其将向板1上的设备12发送"*IDN?"字符串。到目前为止,这是一个和平的蛋糕。。。

当我想从设备中检索数据时,问题就开始了。我希望它能类似地工作,这样

cat /dev/gpib1-12

会写下设备要说的内容。。。但我不知道我发送给设备的哪个命令会让设备返回字符串(值),哪个不会。所以我的选择是:

  1. 反复检查(while loop)设备是否有任何要回复的内容,然后将其发送到相应的管道
    -或-
  2. 仅当客户端程序尝试从/dev/gpib#-*管道读取时,才查询设备。这必须通过"信号"one_answers"waits’来实现

由于明显的原因(性能和/或延迟障碍),我不想实现解决方案1。我不知道该怎么做另一件事。。。我觉得,一定有可能在普通的linux上实现,但怎么实现呢?我确实读过这篇文章,我认为函数select()的一些旋转是正确的前进方向,但我不知道如何使用它来解决我的问题。我也偶然发现了这一点,在这里,这个家伙解释了如何做一些相似但又非常不同的事情(代码mosfet。c)。

问题是:如果尝试通过信号、等待或中断从管道/FIFO/文件的另一端读取,我如何立即检测并做出反应?

谢谢你的回答。


附言:这里是早上七点半(是的,又是一个不眠之夜),所以请原谅我英语不好
PPS:哦,是的,如果有人已经知道linux的gpib守护进程,或者我想问的(通过文件I/O访问单个设备)是否可以通过linux gpib库,请告诉我。我确实阅读了linux gpib的doc和src,但没有发现任何帮助。所有linux gpib库提供的都是到C、Python等的绑定。
PPS:除了使用管道,还有其他选择吗?

如果你的gpib设备只需要一个漂亮的终端,你可以使用python(甚至更好的ipython)。

linuxgpib附带了python包装器(有关代码,请参阅此处)。因此,在您的shell中,通过键入python打开python在python解释器中,您可以轻松地与类似的设备进行通信

>>>import Gpib
>>>device = Gpib.Gpib(pad=2)

这将打开到主地址为2的gpib设备的连接。要与它通信,只需执行

>>>device.write('*IDN?')
>>>device.read()
'HEWLETT-PACKARD,33120A,0,8.0-5.0-1.0'

为了进一步简化它,请使用ipython而不是普通的python。这将为您提供选项卡完成和更多功能。

最新更新