Обнаружение попытки чтения с противоположного конца pipe/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. Неоднократно проверяйте (в цикле while), есть ли у устройства что-либо для ответа, и затем отправьте это в соответствующий канал.
    -или-
  2. Запрашивайте устройство только тогда, когда клиентская программа пытается читать из канала /dev/gpib#-*. Это должно быть выполнено с помощью «сигналов» и «ожиданий».

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

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

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


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


person Kupto    schedule 28.11.2013    source источник
comment
Вы смешиваете много вещей вместе. По сути, вам нужны события POLLIN/POLLOUT для мониторинга на fd с помощью poll()/epoll().   -  person oakad    schedule 28.11.2013
comment
Вам нужен драйвер символьного устройства, а не конвейерный демон. Запустите этот код, когда кто-то попытается прочитать этот файл, который прочно находится на территории драйвера устройства. Сканирование аппаратного обеспечения и создание специального файла для каждого экземпляра этого конкретного типа подключенного оборудования — это то, что обычно делает драйвер устройства.   -  person n. 1.8e9-where's-my-share m.    schedule 28.11.2013
comment
Вау, спасибо, ребята... Я посмотрю на это, как только доберусь до работы... Я должен сейчас уйти, но оба ваших комментария кажутся правильными... еще раз спасибо   -  person Kupto    schedule 28.11.2013


Ответы (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. Это дает вам завершение табуляции и многое другое.

person P3trus    schedule 20.01.2014