TTY - это файлы, которые вы можете использовать, как и любые другие. Вы можете открывать их с помощью стандартных инструментов открытия файлов на вашем языке и читать или писать из них. У них есть особое поведение, отличное от «обычных» файлов, но основы те же. Я расскажу о некоторых особых случаях в конце, но сначала эксперимент.
Одна интересная вещь, которую вы можете сделать прямо с обычного терминала. Запустите, tty
и он напечатает строку вроде:
/dev/pts/2
Это устройство TTY, на котором работает ваш терминал. Вы можете написать что-нибудь для этого терминала:
$ echo Hello > /dev/pts/2
Hello
$
Вы даже можете прочитать из него:
$ read X < /dev/pts/2
hello
$ echo $X
hello
$
( read X
это команда sh «прочитать строку из стандартного ввода в переменную X»; <означает использование / dev / pts / 2 в качестве стандартного ввода для команды чтения; первое «привет», которое я напечатал, а второе было распечатано) ,
Если вы откроете другую оболочку, скажем, с помощью screen
или xterm
, вы можете запустить run echo spooky > /dev/pts/2
в этой оболочке, чтобы текст появился на вашем исходном терминале, и то же самое для других команд. Все это только ваша оболочка, открывающая файл, не зная, что это TTY.
Вот очень простая программа на C, которая выполняет только то, что вы просили, записывает один символ в / dev / pts / 3 и затем читает из него один байт:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main() {
char byte;
int fd = open("/dev/pts/3", O_RDWR);
write(fd, "X", 1);
ssize_t size = read(fd, &byte, 1);
printf("Read byte %c\n", byte);
return 0;
}
Реальное устройство TTY, подключенное к эмулятору оболочки или терминала, будет иметь интересное поведение, но вы должны получить что-то обратно.
Для доступа к терминалу вам необходимо иметь разрешение на его использование. Это просто стандартные права доступа к файлам, которые вы видите ls -l
и устанавливаете с помощью chmod
: вам нужно разрешение на чтение, чтобы открыть файл и прочитать его, и разрешение на запись для записи в него. TTY, которые поддерживают ваш терминал, будут принадлежать вам, а TTY другого пользователя - нет, а TTY для USB-устройств могут быть или не быть, в зависимости от вашей конфигурации. Вы можете изменить разрешения так же, как всегда.
Что касается написания программы для работы с ней, вам не нужно делать ничего особенного. В примере вы можете видеть, что вам не нужно закрывать файл каждый раз, когда ваши данные читаются на другом конце: файлы TTY действуют как конвейеры, просто толкая данные в обоих направлениях по мере их поступления. Когда я написал текст в TTY, он появился сразу, а когда я прочитал его позже, меня уже ничего не ждали. Это не то же самое, что запись в обычный файл, где данные сохраняются на диске - они сразу передаются на другую сторону или сохраняются в памяти, пока кто-то их не прочитает.
Возможно, вы захотите использовать функцию выбора, чтобы вы могли делать другие вещи, пока вы ожидаете, что устройство что-то скажет, но если вы просто хотите дождаться поступления данных, вы можете просто использовать блокировку чтения и позволить ОС делать это. подъем.
Следует иметь в виду, что в ядре может быть ограниченный размер буфера, и если вы пишете много данных одновременно, блокировка может оказаться бессмысленной. Если это может быть проблемой, используйте неблокирующий ввод-вывод с open("/dev/...", O_RDWR | O_NONBLOCK)
. Принцип будет одинаковым в любом случае.