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

时间:2013-11-28 07:13:55

标签: c++ c linux shell gpib

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

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

会发送“* IDN?”到目前为止,这是一个和平的蛋糕......

当我想从设备中检索数据时,问题就开始了。我想让它以类似的方式工作,以便

cat /dev/gpib1-12

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

  1. 如果设备有任何要回复的内容,请反复检查( while-loop ),然后将其发送到相应的管道。
    - 或 -
  2. 仅在客户端程序尝试从/dev/gpib#-*管道读取时才查询设备。这必须通过'信号'和'等待'来提供。
  3. 由于显而易见的原因(性能和/或延迟障碍)我不想实现解决方案 1 。我不知道如何做另一件事......我觉得,必须有可能在ol'mighty linux上实现,但是怎么样?我确实阅读了this,我认为函数select()的一些旋转是正确的前进方向,但我无法弄清楚如何将它用于我的问题。我也偶然发现了this,那个人解释了如何做类似的事情,但是不同(代码 mosfet.c )。

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

    Thanx寻求答案。


    PS:早上七点半(这是另一个不眠之夜),请原谅我破碎的英语......
    PPS:哦,是的,如果有人已经知道这样的gpib守护进程用于linux,或者我认为(通过文件I / O访问单个设备)可以通过linux-gpib图书馆,请告诉我。我确实读过了linux-gpib的doc和src,但没有找到任何帮助。所有linux-gpib库都提供了对C,Python等的绑定 PPS:是否有其他替代方法可以使用管道?

1 个答案:

答案 0 :(得分:1)

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

linux-gpib附带python包装器(用于代码外观here)。所以在你的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。这为您提供了标签完成等等。