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).