Pseudoterminales

La solución mas completa al problema de la comunicación bidireccional con procesos externos a nuestro programa la proporciona Expect . Expect se basa en el módulo IO::Pty el cual nos provee con un API para la creación de seudo tty s. El módulo hereda de IO::Handle y por tanto sus objetos poseen acceso a todos los métodos que IO::Handle provee para los manejadores de fichero/proceso. En esta sección estudiaremos el moulo IO::Pty.

Los dispositivos diseñados para uso interactivo, esto es, los dispositivos que se usan a la vez para entrada y salida, tienen una interfaz de programación similar - conocida como interfaz tty - que se deriva de la que se creo hace ya muchas décadas para las terminales serie de la marca TeleType (teclado e impresora) . El estándar API tty mas usado es POSIX termios.

Un dispositivo tty tiene dos extremos. En su forma mas sencilla uno de los extremos esta asociado con un programa y el otro con un dispositivo hardware. Esto es cierto para una consola: el driver de consola conecta el teclado y la pantalla a los mismos tipos de programas. En ciertos casos hay un programa en cada extremo. En tales casos uno de los extremos toma el papel del hardware. Por ejemplo, en una conexión de red uno de los extremos está conectado al programa que proporciona la conexión de red y el otro esta conectado a la shell.

Una seudoterminal o pty es una tty cuyos dos extremos son programas. Un lado del canal se denomina lado maestro o dispositivo seudo terminal maestro y el otro se denomina lado esclavo.

Un proceso que espera trabajar conectado a una terminal puede abrir el lado esclavo de una seudoterminal y ser conducido por el programa que ha abierto el lado maestro. Cualquier cosa que se escriba en el lado maestro se le proporciona al lado esclavo como si hubiese sido tecleado en una terminal. Por ejemplo, escribir el carácter de interrupción "\cC" en el lado maestro causa la generación de una señal de interrupción SIGINT que será enviada al grupo de procesos en foreground que esta conectado al lado esclavo. Recíprocamente, cualquier cosa que se escriba en el lado esclavo puede ser leída por el proceso conectado al lado maestro.

Es usando seudo terminales que algunos programas como xterm implementan su capacidad para la emulación de terminales. El proceso xterm esta asociado con el lado/dispositivo maestro y la shell con el lado esclavo. Cualesquiera operaciones en la terminal llevada a cabo por la shell son recibidas por el proceso xterm (por ejemplo, el redimensionamiento de la terminal o la inicialización de la terminal). El proceso xterm recibe entrada desde el teclado y el ratón a través de eventos y es asi capaz de transmitir esos caracteres a la shell, dándole a la shell la apariencia de ser una auténtica terminal hardware. Otros ejemplos de la aplicación de las seudoterminales son las aplicaciones telnet y ssh los cuales son el lado maestro y la correspondiente shell ocupa el lado esclavo.

También la utilidad script que nos permite grabar en un fichero los resultados de una sesión usa seudoterminales (Figura 7.1).


Tabla: Grabación de una sesión con script
lhp@nereida:~$ script tutu
Script started, file is tutu
lhp@nereida:~$ uname -a
Linux nereida.deioc.ull.es 2.4.20-perfctr #6 SMP vie abr 2 18:36:12 WEST 2004 
                                                               i686 GNU/Linux
^D
lhp@nereida:~$ exit
Script done, file is tutu
lhp@nereida:~$ cat tutu
Script started on mar 18 abr 2006 11:06:33 WEST
lhp@nereida:~$ uname -a
Linux nereida.deioc.ull.es 2.4.20-perfctr #6 SMP vie abr 2 18:36:12 WEST 2004 
                                                               i686 GNU/Linux
lhp@nereida:~$ exit

Script done on mar 18 abr 2006 11:06:40 WEST
lhp@nereida:~$




Subsecciones
Casiano Rodríguez León
Licencia de Creative Commons
Programación Distribuida y Mejora del Rendimiento
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=44.
2012-06-19