Данные буквально никуда не делись. Никто его не слушал, поэтому его выбросили. Точная механика зависит от аппаратного обеспечения, но обычно первое открытие устройства очищает любые приемные буферы в аппаратном обеспечении, хотя нет никакой гарантии, что эти буферы даже включены.
Обрабатываются ли операции ввода-вывода устройства, даже если устройство не открывается каким-либо процессом?
208
Julio Guerra
Следующие примеры программ оболочки делают вопрос более понятным.
Учитывая простое устройство, символ (FTDI ttyUSB устройство в моем случае), я посылаю это запрос с echo
к open();write();close();
устройству, а затем прочитать ответ с cat
к open();read();close();
устройству, с двумя различными процессами ( /bin/echo
и /bin/cat
).
- Следующие работы:
$ /bin/echo -ne $request > /dev/ttyUSB0 ; /bin/cat -e < /dev/ttyUSB0 M-^?^B^@^C
- Следующее не работает:
$ /bin/echo -ne $request > /dev/ttyUSB0 ; sleep 2s ; /bin/cat -e < /dev/ttyUSB0 cat does not read anything
- Еще один рабочий пример:
$ /bin/cat -e < /dev/ttyUSB0 & sleep 2s ; /bin/echo -ne $request > /dev/ttyUSB0 M-^?^B^@^C
Что происходит в 2
? Почему поведение отличается? Куда делись данные?
Ваш выбор использования терминального устройства (например, / dev / tty *) усложняет ответ, потому что терминальный ввод несколько раз является буферным и сильно обрабатывается (т. Е. Дисциплина строки). Кстати, вы не указали, установили ли вы петлевую перемычку, поэтому «вход», который вы «читаете», предположительно будет локальным эхо-сигналом, генерируемым терминальной подсистемой (т.е. это не вывод, который затем принимается последовательным портом).
sawdust 8 лет назад
0
В моем случае tty установлен в неканоническом режиме. Так что без эха, без буферизации и без редактирования строки.
Julio Guerra 8 лет назад
0
* «В моем случае tty установлен в неканоническом режиме. Поэтому эхо не требуется». * - Неканоническая обработка ввода и вывода не зависит от настроек эха. * "... без буферизации ..." * - Если бы вы на самом деле изучали код драйвера ядра, вы бы поняли, что это нелепое утверждение.
sawdust 8 лет назад
0
1 ответ на вопрос
1
David Schwartz
Как вы объясните `1.` тогда? Последовательность системных вызовов такая же, но без сна.
Julio Guerra 8 лет назад
0
В случае 1 данные были получены аппаратным обеспечением после того, как устройство было открыто во второй раз.
David Schwartz 8 лет назад
0
Это имеет смысл, поскольку мое устройство намного медленнее, чем процессор. Указывает ли POSIX, какое состояние передачи устройства должно быть при его открытии? Я пытаюсь избавиться от текущих запросов убитых процессов (т.е. устройство отвечает). Ядро по-прежнему получает данные даже при очистке устройства, а затем в ядре fifos, что означает, что данные уже отправлены устройством и находятся в пути где-то в дереве ввода-вывода (usb device -> usb host -> pci) ...). Я шокирован тем, как трудно найти решение для этого очень простого и распространенного случая: как получить чистое общее состояние RX / TX, как SW, так и HW ...
Julio Guerra 8 лет назад
0
Это зависит от устройства и протокола. Если в протоколе есть какой-то пинг, который вы можете отправить, вы можете дождаться ответа и затем синхронизировать оба конца. Если нет, вы можете отправить кучу вещей, которые получают ответ. В документации по протоколу должно быть указано, как установить синхронизацию.
David Schwartz 8 лет назад
0
Похожие вопросы
-
9
В чем разница между командами "su -s" и "sudo -s"?
-
4
Требуется хороший бесплатный образ Ubuntu Server VMWare
-
4
Каковы различия между основными дистрибутивами Linux? Я замечу?
-
-
2
Ограничить использование процессора для Flash в Firefox?
-
2
Как мне заставить мой микрофон работать под Debian GNOME?
-
2
Конки установки - образцы / идеи?
-
3
Каковы различия между оконными менеджерами Linux?
-
2
ThunderBird / Синхронизация освещения с SE k770i
-
4
Файловая система Linux
-
6
Полноэкранная медленная вспышка в KDE 4