¿Cómo funciona un terminal Linux?

32

Si enciende un terminal y llama a un ejecutable (suponiendo que esté orientado a la línea por simplicidad) obtendrá una respuesta al comando del ejecutable. ¿Cómo se imprime esto (el usuario)? ¿La terminal hace algo así pexpect? (encuesta esperando salida) o qué? ¿Cómo se le notifica la salida que se va a imprimir? ¿Y cómo un terminal inicia un programa? (¿Es algo parecido al os.fork de Python ()?) Me sorprende cómo funciona un terminal, he estado jugando con un emulador de terminal y todavía no entiendo cómo funciona toda esta magia. Estoy mirando la fuente de konsole (kde) y yakuake (posiblemente usa konsole) y no puedo llegar a donde sucede toda esa magia.

micro
fuente
66
Eche un vistazo a un emulador de terminal simple y un sistema operativo de juguete simple con un shell simple (y las primeras quince páginas de su libro). Además, lea esta respuesta a una pregunta relacionada.
2
Este enlace también es interesante para el asunto del terminal y el historial de tty: linusakesson.net/programming/tty/index.php
@nwildner cool,
mike

Respuestas:

30

Originalmente solo tenías terminales tontas, al principio en realidad teletipos (similar a una máquina de escribir eléctrica, pero con un rollo de papel) (de ahí / dev / tty - TeleTYpers), pero luego pantalla + teclado-combos, que solo enviaron un código de tecla a la computadora y la computadora envió un comando que escribió la carta en el terminal (es decir, el terminal no tenía eco local, la computadora tuvo que ordenar al terminal que escribiera lo que el usuario escribió en el terminal) - esta es una de las razones por qué tantos comandos importantes de Unix son tan cortos. La mayoría de los terminales estaban conectados por líneas en serie, pero (al menos) uno estaba conectado directamente a la computadora (a menudo la misma habitación): esta era la consola. Solo se confiaba en unos pocos usuarios seleccionados para trabajar en "la consola" (a menudo, este era el único "terminal" disponible en modo de usuario único).

Más tarde también hubo algunos terminales gráficos (llamados "xterminals", que no deben confundirse con el xtermprograma) con pantalla y tarjeta gráfica de pantalla, teclado, mouse y un procesador simple; que simplemente podría ejecutar un servidor X. No hicieron ningún cálculo ellos mismos, por lo que los clientes X se ejecutaron en la computadora a la que estaban conectados. Algunos tenían discos duros, pero también podían arrancar a través de la red. Eran populares a principios de la década de 1990, antes de que las PC se volvieran tan baratas y potentes.

Un "emulador de terminal", la "ventana de terminal" que abre con programas como xtermo konsole, intenta imitar la funcionalidad de dichos terminales tontos. También programas como PuTTY(Windows) emulan terminales.

Con la PC, donde "la consola" (teclado + pantalla) y "la computadora" es más una sola unidad, tienes "terminales virtuales" (en Linux, teclas Alt + F1 a Alt + F6), pero también estas imitan terminales de estilo antiguo. Por supuesto, dado que Unix / Linux se está convirtiendo en un sistema operativo de escritorio utilizado a menudo por un usuario individual, ahora realiza la mayor parte de su trabajo "en la consola", donde los usuarios antes usaban terminales conectadas por líneas en serie.


Por supuesto, es el shell que inicia los programas. Y utiliza la llamada fork-systemcall (lenguaje C) para hacer una copia de sí mismo con una configuración de entorno, luego se usa exec-systemcall para convertir esta copia en el comando que desea ejecutar. El shell se suspende (a menos que el comando se ejecute en segundo plano) hasta que se complete el comando. A medida que el comando hereda la configuración de stdin, stdout y stderr del shell, el comando escribirá en la pantalla del terminal y recibirá información del teclado del terminal.

Baard Kopperud
fuente
Y entre los terminales serios tontos y Xterms había en.wikipedia.org/wiki/Blit_(computer_terminal)
sendmoreinfo
31

Cuando "abre un terminal", está iniciando un programa emulador de terminal, como xterm, gnome-terminal, lxterm, konsole, ...

Una de las primeras cosas que hace el emulador de terminal es asignar un pseudo terminal (a menudo llamado pseudo-tty, o pty para abreviar). El pty es un par de archivos de dispositivos de caracteres : el maestro pty, que es el lado en que se abre el emulador de terminal, y el esclavo pty, que es el lado en que se han abierto los programas que se ejecutan dentro del terminal. En la mayoría de los equipos modernos, el maestro es /dev/ptmx(que cada emulador de terminal ha abierto) y el esclavo es /dev/pts/NUMBER. El controlador del kernel para pseudo-terminales realiza un seguimiento de qué proceso controla el maestro para cada dispositivo esclavo. El emulador de terminal puede recuperar la ruta al esclavo correspondiente a través de un ioctl en el dispositivo maestro.

Una vez que el emulador de terminal ha abierto el dispositivo maestro, inicia un subproceso (generalmente un shell, pero depende del usuario que invocó el emulador de terminal para decidir). El emulador hace esto de la manera habitual para invocar un programa:

  • bifurcar un proceso hijo,
  • abra el dispositivo esclavo pty en los descriptores de archivo 0, 1 y 2 (entrada estándar, salida estándar y flujo de error),
  • ejecutar el shell u otro programa en el proceso hijo.

Cuando el niño (o cualquier otro proceso) escribe en el esclavo pty, el emulador ve la entrada en el maestro pty.

Por el contrario, cuando el emulador escribe en el dispositivo maestro, se ve como entrada en el esclavo.

Esperar funciona exactamente de la misma manera. La diferencia entre Expect y un emulador de terminal como xterm es donde obtienen la entrada que alimentan al programa (script vs entrada de teclado) y lo que hacen con la salida (archivo de registro o analizador vs dibujar texto en una ventana).

Gilles 'SO- deja de ser malvado'
fuente
Uno de los ejemplos simples de lo que se describe aquí es la implementación del scriptcomando por parte de BusyBox , donde la xgetptyfunción es el núcleo del trabajo /dev/ptmx.
Ruslan
@Tim Aprecio que el inglés no sea tu lengua materna. Pero si edita una publicación, asegúrese de no equivocarse. Si no lo entiende, no edite. Además, una vez más, no use negrita para resaltar cosas que no necesitan resaltarse.
Gilles 'SO- deja de ser malvado'