Tengo un dispositivo que envía información por USB a mi computadora. Arch Linux configura este dispositivo mediante la creación de un archivo con el nombre ttyUSB0
de /dev/
. He estado usando GTKterm
para recibir esta información entrante y mostrarla en una ventana de terminal emulada.
Mi pregunta es, ¿cómo exactamente GTKterm
lee / escribe en este ttyUSB0
archivo y dónde podría comenzar a aprender cómo implementar una funcionalidad similar? Es decir, en la forma más básica, ¿cómo podría escribir un carácter ttyUSB0
o, por el contrario, recibir un byte y escribirlo en un archivo?
screen
puede hacer esto, yminiterm
screen
y / ominiterm
programáticamente.Respuestas:
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:Ese es el dispositivo TTY en el que se está ejecutando su terminal. Puede escribir algo en ese terminal:
Incluso puedes leerlo:
(
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
oxterm
, puede ejecutar ejecutarecho 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:
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 configurarchmod
: 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.fuente
sudo echo Hello > /dev/tty4
cuando estoy en el entorno de escritorio, perobash: /dev/tty4: Permission denied
aparece si no estoy conectado a tty4. Sin embargo, si estoy conectado a tty4, todo funciona bien. ¿Cuál es la razón para esto?ls -l /dev/tty4
> /dev/tty4
parte no es parte delecho
subproceso iniciado por,sudo
sino parte delsudo
proceso en sí, que es ejecutado por el usuario actual. se aplican permisos de archivo para el usuario actual en lugar de root.