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.
32
Respuestas:
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
xterm
programa) 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
xterm
okonsole
, intenta imitar la funcionalidad de dichos terminales tontos. También programas comoPuTTY
(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.
fuente
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:
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).
fuente
script
comando por parte de BusyBox , donde laxgetpty
función es el núcleo del trabajo/dev/ptmx
.