Обрабатываются ли операции ввода-вывода устройства, даже если устройство не открывается каким-либо процессом?

181
Julio Guerra

Следующие примеры программ оболочки делают вопрос более понятным.

Учитывая простое устройство, символ (FTDI ttyUSB устройство в моем случае), я посылаю это запрос с echoк open();write();close();устройству, а затем прочитать ответ с catк open();read();close();устройству, с двумя различными процессами ( /bin/echoи /bin/cat).

  1. Следующие работы:
$ /bin/echo -ne $request > /dev/ttyUSB0 ; /bin/cat -e < /dev/ttyUSB0  M-^?^B^@^C 
  1. Следующее не работает:
$ /bin/echo -ne $request > /dev/ttyUSB0 ; sleep 2s ; /bin/cat -e < /dev/ttyUSB0  cat does not read anything 
  1. Еще один рабочий пример:
$ /bin/cat -e < /dev/ttyUSB0 & sleep 2s ; /bin/echo -ne $request > /dev/ttyUSB0 M-^?^B^@^C 

Что происходит в 2? Почему поведение отличается? Куда делись данные?

1
Ваш выбор использования терминального устройства (например, / dev / tty *) усложняет ответ, потому что терминальный ввод несколько раз является буферным и сильно обрабатывается (т. Е. Дисциплина строки). Кстати, вы не указали, установили ли вы петлевую перемычку, поэтому «вход», который вы «читаете», предположительно будет локальным эхо-сигналом, генерируемым терминальной подсистемой (т.е. это не вывод, который затем принимается последовательным портом). sawdust 7 лет назад 0
В моем случае tty установлен в неканоническом режиме. Так что без эха, без буферизации и без редактирования строки. Julio Guerra 7 лет назад 0
* «В моем случае tty установлен в неканоническом режиме. Поэтому эхо не требуется». * - Неканоническая обработка ввода и вывода не зависит от настроек эха. * "... без буферизации ..." * - Если бы вы на самом деле изучали код драйвера ядра, вы бы поняли, что это нелепое утверждение. sawdust 7 лет назад 0

1 ответ на вопрос

1
David Schwartz

Данные буквально никуда не делись. Никто его не слушал, поэтому его выбросили. Точная механика зависит от аппаратного обеспечения, но обычно первое открытие устройства очищает любые приемные буферы в аппаратном обеспечении, хотя нет никакой гарантии, что эти буферы даже включены.

Как вы объясните `1.` тогда? Последовательность системных вызовов такая же, но без сна. Julio Guerra 7 лет назад 0
В случае 1 данные были получены аппаратным обеспечением после того, как устройство было открыто во второй раз. David Schwartz 7 лет назад 0
Это имеет смысл, поскольку мое устройство намного медленнее, чем процессор. Указывает ли POSIX, какое состояние передачи устройства должно быть при его открытии? Я пытаюсь избавиться от текущих запросов убитых процессов (т.е. устройство отвечает). Ядро по-прежнему получает данные даже при очистке устройства, а затем в ядре fifos, что означает, что данные уже отправлены устройством и находятся в пути где-то в дереве ввода-вывода (usb device -> usb host -> pci) ...). Я шокирован тем, как трудно найти решение для этого очень простого и распространенного случая: как получить чистое общее состояние RX / TX, как SW, так и HW ... Julio Guerra 7 лет назад 0
Это зависит от устройства и протокола. Если в протоколе есть какой-то пинг, который вы можете отправить, вы можете дождаться ответа и затем синхронизировать оба конца. Если нет, вы можете отправить кучу вещей, которые получают ответ. В документации по протоколу должно быть указано, как установить синхронизацию. David Schwartz 7 лет назад 0

Похожие вопросы