У меня есть устройство, которое отправляет информацию по USB на мой компьютер. Arch Linux настраивает это устройство, создавая файл с именем ttyUSB0
в /dev/
. Я использую, GTKterm
чтобы получить эту входящую информацию и отобразить ее в эмулируемом окне терминала.
У меня вопрос, как именно GTKterm
чтение и запись в этот ttyUSB0
файл, и где я могу начать изучать, как реализовать аналогичные функции? То есть, в самой простой форме, как я могу записать символ ttyUSB0
или, наоборот, получить байт и записать его в файл?
screen
может сделать это, иminiterm
screen
и / илиminiterm
программно.Ответы:
TTY - это файлы, которые вы можете использовать, как и любые другие. Вы можете открывать их с помощью стандартных инструментов открытия файлов на вашем языке и читать или писать из них. У них есть особое поведение, отличное от «обычных» файлов, но основы те же. Я расскажу о некоторых особых случаях в конце, но сначала эксперимент.
Одна интересная вещь, которую вы можете сделать прямо с обычного терминала. Запустите,
tty
и он напечатает строку вроде:Это устройство TTY, на котором работает ваш терминал. Вы можете написать что-нибудь для этого терминала:
Вы даже можете прочитать из него:
(
read X
это команда sh «прочитать строку из стандартного ввода в переменную X»; <означает использование / dev / pts / 2 в качестве стандартного ввода для команды чтения; первое «привет», которое я напечатал, а второе было распечатано) ,Если вы откроете другую оболочку, скажем, с помощью
screen
илиxterm
, вы можете запустить runecho spooky > /dev/pts/2
в этой оболочке, чтобы текст появился на вашем исходном терминале, и то же самое для других команд. Все это только ваша оболочка, открывающая файл, не зная, что это TTY.Вот очень простая программа на C, которая выполняет только то, что вы просили, записывает один символ в / dev / pts / 3 и затем читает из него один байт:
Реальное устройство TTY, подключенное к эмулятору оболочки или терминала, будет иметь интересное поведение, но вы должны получить что-то обратно.
Для доступа к терминалу вам необходимо иметь разрешение на его использование. Это просто стандартные права доступа к файлам, которые вы видите
ls -l
и устанавливаете с помощьюchmod
: вам нужно разрешение на чтение, чтобы открыть файл и прочитать его, и разрешение на запись для записи в него. TTY, которые поддерживают ваш терминал, будут принадлежать вам, а TTY другого пользователя - нет, а TTY для USB-устройств могут быть или не быть, в зависимости от вашей конфигурации. Вы можете изменить разрешения так же, как всегда.Что касается написания программы для работы с ней, вам не нужно делать ничего особенного. В примере вы можете видеть, что вам не нужно закрывать файл каждый раз, когда ваши данные читаются на другом конце: файлы TTY действуют как конвейеры, просто толкая данные в обоих направлениях по мере их поступления. Когда я написал текст в TTY, он появился сразу, а когда я прочитал его позже, меня уже ничего не ждали. Это не то же самое, что запись в обычный файл, где данные сохраняются на диске - они сразу передаются на другую сторону или сохраняются в памяти, пока кто-то их не прочитает.
Возможно, вы захотите использовать функцию выбора, чтобы вы могли делать другие вещи, пока вы ожидаете, что устройство что-то скажет, но если вы просто хотите дождаться поступления данных, вы можете просто использовать блокировку чтения и позволить ОС делать это. подъем.
Следует иметь в виду, что в ядре может быть ограниченный размер буфера, и если вы пишете много данных одновременно, блокировка может оказаться бессмысленной. Если это может быть проблемой, используйте неблокирующий ввод-вывод с
open("/dev/...", O_RDWR | O_NONBLOCK)
. Принцип будет одинаковым в любом случае.источник
sudo echo Hello > /dev/tty4
когда я нахожусь в среде рабочего стола, но я получаю,bash: /dev/tty4: Permission denied
если я не вошел в tty4. Однако, если я вошел в tty4, все работает нормально. Что является причиной этого?ls -l /dev/tty4
> /dev/tty4
часть IST не является частьecho
подпроцесса начатого ,sudo
но частьюsudo
самого процесса, который выполняется для текущего пользователя. Права доступа к файлу для текущего пользователя применяются вместо root.