Персонажи, не превратившиеся из псевдотерминала в хозяина - PullRequest
4 голосов
/ 10 октября 2010

Я сейчас пытаюсь отправить двоичные данные через pexpect. По какой-то причине данные проходят только через find, за исключением 0x04, который просто пропускается. Я отследил вызов pexpect, чтобы определить, что все, что происходит, это вызов os.write () файлового дескриптора, открытого из команды pty.fork ().

Есть идеи?

(пример кода, который иллюстрирует проблему)

import os, pty, sys


pid, child_fd = pty.fork()

if pid: # Parent
    os.write(child_fd, b"'\x04hmm\x04'\n")
    buf = os.read(child_fd, 100)
    print buf
else:   # Child
    text = sys.stdin.readline()
    print ''.join(["%02X " % ord(x) for x in text])

Результат:

$ python test.py
'hmm'
27 68 6D 6D 27 0A

1 Ответ

2 голосов
/ 10 октября 2010

0x04 - это ^ D, которое является нажатием клавиши в конце файла.Pty был установлен в необработанном режиме?Может быть, его съел водитель.

Если вы сделаете это:

os.write(child_fd, b"'\x04hmm\x16\x04'\n")

, вы увидите, что драйвер действительно выполняет перевод.\x16 - это то же самое, что ^ V, как вы цитируете вещи.Имеет смысл, что перевод будет происходить только от ведущего (притворного физического терминала) и ведомого.Предполагаемый физический терминал - то, где (на обычном терминальном устройстве) человек будет печатать

Я не уверен, как заставить драйвер прекратить делать это.Если дочерний элемент устанавливает свой терминал в необработанный режим, он, вероятно, сделает это.

...