Я думаю о реализации своего рода демона/сервиса на C/C++ для Linux, который будет связываться с конкретным устройством gpib через оболочку (используя библиотеку linux-gpib). Идея состоит в том, что демон просканирует все существующие устройства и создаст файл/канал /dev/gpib#-*
(где *
будет их адресом на указанной шине gpib) для каждого устройства. Использование будет таким, как /dev/com#
. Затем я мог бы ввести в командной строке:
echo "*IDN?" > /dev/gpib1-12
который отправил бы "*IDN?" строка к устройству 12 на плате 1. Пока это проще простого...
Проблема начинается, когда я хочу получить данные с устройства. Я хочу, чтобы это работало по аналогии, чтобы
cat /dev/gpib1-12
выписал бы то, что устройство может сказать... Но я не могу знать, какая команда, которую я отправил на устройство, заставит устройство вернуть строку (значение), а какая нет. Итак, мои варианты:
- Неоднократно проверяйте (в цикле while), есть ли у устройства что-либо для ответа, и затем отправьте это в соответствующий канал.
-или- - Запрашивайте устройство только тогда, когда клиентская программа пытается читать из канала
/dev/gpib#-*
. Это должно быть выполнено с помощью «сигналов» и «ожиданий».
По понятным причинам (ухудшение производительности и/или задержки) я не хочу реализовывать решение 1. Я не знаю, как сделать другое, хотя... Я чувствую, что это должно быть возможно реализовать на старомодном линуксе, но как? Я прочитал это и думаю, функции select()
- это правильный путь вперед, но я не могу понять, как использовать его для моей проблемы. Я также наткнулся на это, где парень объясняет, как сделать что-то подобное, но ооочень разные (код mosfet.c).
Вопрос: как я могу немедленно обнаружить и отреагировать на попытку чтения с другой стороны канала/FIFO/файла с помощью сигнализации, ожидания или прерываний?
Спасибо за ответы.
PS: Здесь уже половина седьмого утра (ага, еще одна бессонная ночь), так что извините за мой ломаный английский...
PPS: Ах да, и если бы кто-нибудь уже знал о таком демон gpib для linux, или если думаю, что я спрашиваю (доступ к отдельным устройствам через файловый ввод-вывод) возможен через библиотеку linux-gpib, дайте мне знать. Я прочитал документацию и src для linux-gpib, но не нашел ничего полезного. Все, что предоставляет библиотека linux-gpib, — это привязки к C, Python и т. д.
PPS: Существуют ли другие альтернативы использованию каналов?