Los TTY son archivos que puede usar como cualquier otro. Puede abrirlos con las herramientas estándar de apertura de archivos de su idioma y leer o escribir desde ellos. Tienen un comportamiento especial que es diferente a los archivos "ordinarios", pero los conceptos básicos son los mismos. Cubriré algunos de los casos especiales al final, pero primero, un experimento.
Una cosa interesante que puede hacer directamente desde una terminal regular. Ejecutar tty
e imprimirá una línea como:
/dev/pts/2
Ese es el dispositivo TTY en el que se está ejecutando su terminal. Puede escribir algo en ese terminal:
$ echo Hello > /dev/pts/2
Hello
$
Incluso puedes leerlo:
$ read X < /dev/pts/2
hello
$ echo $X
hello
$
( read X
es el comando "leer una línea desde la entrada estándar a la variable X" de sh; el <es usar / dev / pts / 2 como entrada estándar para el comando de lectura; el primer "hola" que escribí y el segundo se imprimió) .
Si abre otro shell, digamos usando screen
o xterm
, puede ejecutar ejecutar echo spooky > /dev/pts/2
en ese shell para que el texto aparezca en su terminal original, y lo mismo para los otros comandos. Todo esto es solo su shell abriendo un archivo sin saber que es un TTY.
Aquí hay un programa C muy simple que hace exactamente lo que le pediste y escribe un solo carácter en / dev / pts / 3, luego lee un solo byte:
#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;
}
Un dispositivo TTY real que esté conectado a un shell o emulador de terminal tendrá un comportamiento interesante allí, pero debería recuperar algo.
Para acceder a un terminal necesita tener permiso para usarlo. Esos son solo los permisos de archivo estándar con los que puede ver ls -l
y configurar chmod
: necesita permiso de lectura para abrir el archivo y leerlo, y permiso de escritura para escribir en él. Los TTY que respaldan su terminal serán de su propiedad, pero el TTY de otro usuario no lo será, y los TTY para dispositivos USB pueden o no serlo, dependiendo de su configuración. Puede cambiar los permisos de la misma manera que siempre.
En cuanto a escribir un programa para trabajar con él, no necesitas hacer mucho especial. Puede ver en el ejemplo que una cosa que no necesita hacer es cerrar el archivo cada vez para que sus datos sean leídos por el otro extremo: los archivos TTY actúan como tuberías, simplemente empujando los datos en ambas direcciones a medida que entran. Cuando escribí un mensaje de texto al TTY, apareció de inmediato, y cuando leí después ya no había nada esperándome. Es no como escribir a un archivo normal, donde los datos se guardan en el disco - que se pasa inmediatamente al otro lado, o se almacena en la memoria hasta que alguien lo lee.
Es posible que desee utilizar la función de selección para que pueda hacer otras cosas mientras espera que el dispositivo diga algo, pero si está contento de esperar a que lleguen los datos, puede usar lecturas de bloqueo y dejar que el sistema operativo haga El levantamiento.
Una cosa a tener en cuenta es que puede haber un tamaño de búfer limitado en el núcleo, y si escribe muchos datos a la vez, puede terminar bloqueando sin querer. Si es probable que sea un problema, use IO sin bloqueo con open("/dev/...", O_RDWR | O_NONBLOCK)
. El principio será el mismo de cualquier manera.