![¿Puedo acceder al archivo de terminal?](https://rvso.com/image/109249/%C2%BFPuedo%20acceder%20al%20archivo%20de%20terminal%3F.png)
En los años 1970, teníamos terminales de hardware CUI.
Ahora, en mi caja de Linux, veo siete emuladores de terminal, donde la GUI ocupa el séptimo emulador de terminal (Ctrl+Alt+F7).
Por ejemplo, este es mi primer emulador de terminal (Ctrl+Alt+F1).
$ tty
/dev/tty0
Al >cat
INGRESAR en el espacio de usuario, cat
el proceso espera stdin
a recibir información del /dev/tty0
archivo. No pude ver /dev/tty0
el archivo usando ningún editor.
Ambos stdin
y stdout
del cat
proceso están trabajando con /dev/tty0
el archivo.
Pregunta:
Usando algún editor, ¿se /dev/tty0
puede acceder a este archivo de terminal en el espacio del usuario?
Respuesta1
Estás accediendo al archivo de terminal todo el tiempo. Pero esto no hace lo que probablemente crees que hace.
Cuando escribe en un archivo de disco y luego lo lee, lo que lee es lo que escribe. Este no es el caso de archivos especiales como los terminales. Un archivo es algo en lo que se puede escribir y leer¹; el vínculo entre lo que se escribe y lo que se lee depende de la naturaleza del archivo. Con un archivo de dispositivo de caracteres, normalmente no hay ningún vínculo.
Los archivos de terminal conectan dos entidades que desempeñan funciones diferentes: el propio terminal y una aplicación que quiere interactuar con un usuario. El terminal puede ser una pieza de hardware, representada por el kernel, o un emulador de terminal, que es un proceso. Cuando la aplicación escribe datos, el terminal los lee (y normalmente se los muestra al usuario de alguna manera); cuando la aplicación lee datos, los datos provienen del terminal (normalmente los ingresa el usuario).
En su caso, la aplicación es sucesivamente el shell, cat, el editor, etc. El editor puede intentar leer desde la terminal, pero si es así, está esperando su entrada y puede reaccionar o no correctamente al final de la entrada. (que señalarías presionando Ctrl+D al principio de una línea). Una vez más, leer desde la terminal no te dará cosas que estabanproduccióna la terminal.
En el caso de una consola, los datos que se escriben en el terminal se dibujan en la pantalla. Con las consolas Linux, el texto que se muestra /dev/tty1
se puede leer desde el dispositivo/dev/vcs1
mientras permanezca visible (por lo que solo obtendrá lo que se muestra en la pantalla, más lo que todavía está disponible al retroceder; todo lo que no sea accesible al retroceder se perderá para siempre).
Tenga en cuenta que esta es una función que ofrece la interfaz del terminal de Linux. Una terminal podría simplemente dibujar los píxeles y olvidarse del texto. La mayoría de los emuladores de terminal no ofrecen ninguna función similar.
¹ La mayoría de los archivos son así, en realidad, pero no todos. Los directorios no se pueden escribir a través de la interfaz normal y, en muchas variantes de Unix, tampoco se pueden leer. Algunos dispositivos no admiten lectura ni escritura, solo archivos ioctl
.
Respuesta2
Sí, sin embargo, el archivo de terminal no es un archivo normal.
Si enumera las propiedades extendidas de un archivo de terminal, verá:
$ ls /dev/tty1 -lah
crw--w---- 1 root tty 4, 0 Apr 6 13:07 /dev/tty1
Observe que el primer carácter en la sección de permiso es la letra "c", esto indica que el archivo es un dispositivo de caracteres especiales. Por el contrario, un archivo normal tendría un "-", un directorio una "d", un dispositivo especial de bloque una "b", un enlace simbólico una "l" y un socket de dominio Unix una "s".
Es importante tener en cuenta que en sistemas Unix como Linux, un sistema de archivos es en realidad más como un espacio de nombres para interacciones con objetos del kernel, donde puede nombrar varios objetos del kernel para que varias partes del sistema puedan hacer referencia a ellos sin ambigüedades. Estos objetos del kernel no son solo archivos normales respaldados por almacenamiento persistente, sino también cosas como dispositivos de hardware, sockets, etc.
Un dispositivo especial de caracteres es un objeto del núcleo que interactúa con el espacio de usuario leyendo y escribiendo secuencias de caracteres, a los que se accede haciendoread()
ywrite()
llamada al sistema.
Por ejemplo, en mi máquina con Ctrl+Alt+F1 (que es /dev/tty1 en mi máquina, no tty0), podría leer todo lo que se escribe en la consola virtual usando un programa que usa la read()
llamada al sistema como cat
:
- En el emulador gráfico,
sudo cat /dev/tty1
- Cambie al emulador de consola virtual con Ctrl+Alt+F1
- Escribe algo en el emulador de la consola virtual
- Vuelva a la interfaz de usuario gráfica con Ctrl+Alt+F7
- En el emulador gráfico, veía todo lo que escribía en el emulador de consola virtual como resultado de
cat
Al revés, también podría mostrar caracteres en la consola virtual usando un programa que use write()
syscall como tee
:
- En el emulador gráfico,
echo "hello world" | sudo tee /dev/tty1
- Cambie al emulador de consola virtual con Ctrl+Alt+F1
- En el emulador de consola virtual, vería "hola mundo".
La mayoría de los editores de texto habituales se negarán a abrir archivos especiales no normales porque están programados para comprobar el tipo de archivo y se negarán a editar archivos no normales. Esto es para evitar "accidentes", porque no tiene mucho sentido editar dispositivos especiales en los editores de texto habituales. Además, la mayoría de los editores de texto habituales no solo llaman write()
al archivo existente, sino que escriben en un archivo nuevo y rename()
en el archivo de intercambio para reemplazar el archivo antiguo. Incluso cuando tienes un editor de texto que admite la escritura en el lugar, normalmente intentan truncar el archivo primero, lo que por supuesto no es compatible con un dispositivo de caracteres especiales.
Respuesta3
En los años 1970, teníamos terminales de hardware CUI.
Sin embargo, nadie utilizó el término CUI en los años 70.
Ahora, en mi caja de Linux, veo siete emuladores de terminal, donde la GUI ocupa el séptimo emulador de terminal (Ctrl+Alt+F7).
Estos emuladores de terminal ya estaban disponibles en los años 80 y no existían GUI.
Usando algún editor, ¿se puede acceder a este archivo de terminal /dev/tty0 en el espacio del usuario?
Esta pregunta no tiene sentido. Todos los archivos son accesibles en el espacio del usuario por diseño, ese es el objetivo de los archivos, especialmente los que están en formato /dev
. /dev/tty0
Al ser un dispositivo, no se puede editar ya que su "contenido" es esencialmente efímero. Lo que lees es lo que eventualmente escribes en la consola y lo que escribes se muestra en la pantalla.
Respuesta4
Sí, ciertamente puedes acceder a cualquier TTY como un archivo como cualquier dispositivo en Unix. Marcaría esta pregunta como potencialmente duplicada comoesteLa respuesta hace un buen trabajo al explicar cómo hacer lo que pide en una situación similar.
Para resumir lo que dice esa respuesta, puede interactuar con otros TTY usando echo y cat tal como lo haría con cualquier otro archivo. La razón por la que no vio nada al abrir el archivo es porque, como muchos archivos especiales, sólo hay datos nuevos disponibles.