Мастер псевдотерминала читает то, что только что написал

Я работаю над проектом, который взаимодействует с "виртуальными устройствами" (процессы python), которые использовать соединения через последовательный порт с реальными устройствами, которые также используют последовательные порты, и я использую псевдотерминалы для соединения нескольких (более двух) этих процессов связи через последовательный порт (моделирование последовательных устройств) вместе, и я получил немного загвоздка.

У меня есть процесс 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)?

Заранее спасибо!

9
задан bradreaves 19 May 2011 в 16:30
поделиться