Чтобы быть конкретным, давайте говорить в терминах псевдотерминала. Предположим, у нас есть файловые дескрипторы master и slave для пары псевдотерминалов (предположим, что это управляющий tty). Отключение IXON на master (или slave, что работает так же) означает, что когда мы делаем write(master, &control_s_code, 1), read(slave, &byte, 1) получит этот код. То же самое касается control_q_code. Вопрос: что делает отключение IXOFF?

4
Igor Liferenko 4 Окт 2019 в 09:13

1 ответ

Лучший ответ

IXOFF не реализован на псевдо-tty, и установка IXOFF на псевдо-tty не имеет никакого эффекта.

IXOFF должен заставить драйвер tty отправить символ VSTOP другой стороне, когда его входная очередь заполнена (что должно предотвратить отправку дополнительных данных), и символ VSTART, когда он обработал его, и есть место для дополнительных данных.

Это отличается от IXON, который заставит драйвер tty учитывать символы VSTART/VSTOP, отправленные с другой стороны, и при получении VSTOP (^S) остановить любую передачу, пока не будет получен символ VSTART (^Q).

В случае псевдотерминала «другая сторона» является главным терминалом, например. эмулятор вашего терминала; когда вы нажимаете ^S, это настройка IXON, а не IXOFF, которая заставит подчиненный tty перестать возвращать введенные символы и отображать записанные на него данные (которые будут поставлены в очередь пока очередь вывода не заполнится, когда любой write(2) подчиненному tty либо заблокирует, либо вернет EAGAIN).

Реализация управления потоком на псевдотерминале не требуется, потому что ядро ​​всегда знает (проверив поле структуры или подобное), заполнена ли входная очередь ведомого устройства, и может просто заблокировать процесс записи на мастер-терминал.

Программное управление потоком полезно только при использовании реального последовательного соединения без внеполосных сигналов, таких как RTS/CTS: в отличие от любой Unix, TCP или другой абстракции "конвейера", провод не буферизируется и не будет заполняться и блокироваться до тех пор, пока получатель не прочитает с него все изменения состояния.

6
mosvy 7 Окт 2019 в 08:04
1
Хорошо спасибо! Я никогда не понимал логики в именах ixon/ixoff, мне всегда было интересно, почему они не называются «sendxoff» и «recvxoff» или что-то в этом роде. (Во всяком случае, теперь я могу снова запутаться в других вещах!)
 – 
ilkkachu
4 Окт 2019 в 12:16
Что делает IXOFF для обычного (т. е. не псевдо) tty?
 – 
Igor Liferenko
7 Окт 2019 в 06:21
Кроме того, ваше замечание об отсутствии необходимости управления потоком на псевдотерминалах не известно gnome-terminalxterm) разработчикам: для проверки этого можно использовать нажатие ^S в bash.
 – 
Igor Liferenko
7 Окт 2019 в 06:23
Реакция pty на ^S/^Q контролируется настройками IXON, а не IXOFF; Я расширил это в ответе. Эмулятор терминала вообще не должен заботиться об этом — он просто записывает символы ^S и ^Q в master fd — обработать или не обработать их должен драйвер tty.
 – 
mosvy
7 Окт 2019 в 07:52
Итак, IXOFF — это то же самое, что и IXON, но для противоположной стороны tty. Правильно?
 – 
Igor Liferenko
7 Окт 2019 в 08:09