Я работаю над проектом, который взаимодействует с «виртуальными устройствами» (процессы python), которые используют соединения последовательного порта с реальными устройствами, которые также используют последовательные порты, и я использую псевдотерминалы для подключения нескольких (более 2) из этих последовательных портов коммуникационные процессы (моделирование последовательных устройств) вместе, и я столкнулся с небольшой загвоздкой.
У меня есть процесс python, который генерирует псевдотерминалы, символически связывает ведомый конец pty с файлом (чтобы процессы могли создавать pyserial объект для имени файла), в то время как главные концы сохраняются моим процессом генерации pty и читаются; когда данные поступают на один мастер, они регистрируются, а затем записываются на другие мастера. Этот подход работает, если процесс слушания присутствует всегда.
Проблема заключается в том, что виртуальное устройство умирает или никогда не запускается (что является допустимым вариантом использования для этого проекта). В моей системе кажется, что если данные записываются на главный конец pty, если нет ничего, слушающего подчиненный конец, вызов чтения на этом главном узле вернет данные, которые были только что записаны! Это означает, что устройства получают одни и те же данные более одного раза — это нехорошо!
Пример:
>>master, slave = pty.openpty()
>>os.write(master,"Hello!")
6
>>os.read(master,6)
'Hello!'
Я бы предпочел, чтобы вызов read() блокировался до тех пор, пока ведомое устройство не отправит данные. На самом деле это поведение ведомого устройства — оно может писать, а затем os.read(slave,1) будет блокироваться до тех пор, пока ведущее устройство не запишет данные.
Мои «виртуальные устройства» должны иметь возможность передавать имя файла, чтобы открыть объект последовательного порта; Я попытался создать символическую ссылку на главный конец, но это заставляет мои виртуальные устройства открывать /dev/ptmx, что создает новую пару псевдотерминалов вместо обратной ссылки на уже существующие подчиненные устройства!
Есть ли способ изменить поведение мастера? Или даже просто передать мастеру имя файла, соответствующее ведомому устройству (а не только /dev/ptmx)?
Заранее спасибо!