Обнаружить попытку чтения с противоположного конца канала / fifo в Linux

Я имею в виду реализацию своего рода демона / службы в C / C ++ для linux, которая могла бы взаимодействовать с конкретным устройством gpib через оболочку (используя библиотеку linux-gpib).
Идея в том, что демон будет сканировать все существующие устройства и создаст файл / канал /dev/gpib#-* (где * будет их адрес на указанной шине gpib) для каждого устройства. Использование будет таким, как /dev/com#, Затем я мог бы ввести в командной строке:

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

который отправит «* IDN?» Строка к устройству 12 на борту 1. Пока это мирный пирог …

Проблема начинается, когда я хочу получить данные с устройства. Я хочу, чтобы он работал аналогично, чтобы

cat /dev/gpib1-12

выписал бы, что говорит устройство … Но я не могу знать, какую команду, которую я отправил устройству, заставил бы устройство возвращать строку (значение), а какую — нет. Итак, мои варианты:

  1. Неоднократно проверять (в то время как контур) если устройству есть что ответить, а затем отправить его в соответствующий канал.
    -или же-
  2. Запросите устройство, только когда клиентская программа пытается прочитать с /dev/gpib#-* труба. Это должно быть подано черезсигналы‘ а также ‘ждет».

По понятным причинам (производительность и / или задержка) я не хочу реализовывать решение 1. Я не знаю, как сделать другое, хотя … Я чувствую, что это возможно реализовать на всемогущем Linux, но как? Я читал этот и я думаю, что некоторое вращение функции select() это верный путь вперед, но я не могу понять, как использовать его для моей проблемы. Я тоже наткнулся на этот, где парень объясняет, как сделать что-то похожее, но ооочень другое (код mosfet.c).

Вопрос в том: Как я могу немедленно обнаружить и отреагировать на попытку чтения с другой стороны канала / FIFO / файла с помощью сигнализации, ожидания или прерывания?

Спасибо за ответы.


PS: здесь половина седьмого утра (да, еще одна бессонная ночь), поэтому, пожалуйста, извините за мой сломанный английский …
PPS: О, да, и если кто-нибудь уже знал бы о таком демоне gpib для linux, или если мысль, которую я спрашиваю (доступ к отдельным устройствам через файловый ввод / вывод), была бы возможна через библиотеку linux-gpib, пожалуйста, дайте мне знать. Я прочитал документацию и документацию для linux-gpib, но ничего полезного не нашел. Все библиотеки linux-gpib предоставляют привязки к C, Python и т. Д.
PPS: Есть ли другие варианты использования труб?

1

Решение

Если вам просто нужен хороший терминал для вашего устройства gpib, вы можете использовать python (или даже лучше ipython).

linux-gpib поставляется с оболочкой Python (для просмотра кода Вот). так что в вашей оболочке откройте python, набрав python
В интерпретаторе Python вы можете легко общаться с устройством, как это

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

Откроется подключение к устройству gpib с основным адресом 2. Для связи с ним просто выполните

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

Чтобы упростить его еще больше, используйте ipython вместо простого python. Это дает вам завершение вкладок и многое другое.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]