Pseudo tty set to canonical не является каноническим - PullRequest
0 голосов
/ 29 октября 2018

Я пишу простой эмулятор для последовательного устройства с использованием псевдотерминала (под Linux). Программа, которая пишет на последовательное устройство, пишет на ведомую сторону, в то время как эмулятор (эта программа) находится на главной стороне.

Я создаю обычную пару ведущий / ведомый с:

posix_openpt
grantpt
unlockpt

Затем я создаю мягкую ссылку в / tmp / emulator на любое имя ptsname. Небольшая проблема заключается в том, что когда ведомое устройство закрывается, select возвращает, а read () возвращает EIO. Что несколько раздражает, поэтому я сам открываю ptsname, чтобы предотвратить это (обычно я делаю то же самое с конвейерами).

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

Пока все хорошо. За исключением того, что это не работает, как ожидалось. Если отправить один байт на ведомую сторону PTY, select () возвращается и read () читает этот один байт. Это совсем не канонично! Он должен ждать до получения \ n!

Я протестирую реальный последовательный порт и Arduino, чтобы проверить, происходит ли это и там.

1 Ответ

0 голосов
/ 01 ноября 2018

Это, кажется, ожидаемое поведение. Мои эксперименты показывают, что при установке icanon:

Open /dev/pty/x:
    write() bytes, 1 at a time ---> each appears on master immediately

Master end
    write() bytes, 1 at a time ---> does NOT appear on /dev/pty/x slave until \n

Другими словами, ведомый конец, тот, что в / dev / pty / x, действует как терминал. Доступны все операции, такие как отключение эха, установка режима строки, перевод cr и lf и т. Д. Или канонический режим.

Основная сторона является , а не терминалом. Он просто позволяет отправлять и получать данные на подчиненную сторону.

Это то, что говорит pty (7) , но вы должны читать между строк, чтобы понять, что мастер также не действует как терминал.

...