martes, 26 de marzo de 2013

El intérprete de órdenes II






Recordemos lo que se mencionó en la última entrega. Un shell, básicamente, es un intérprete de órdenes en línea. Su trabajo consiste en leer las instrucciones que da el usuario, realizar una serie de funciones de análisis y pasar la instrucción interpretada al SO.
En los unnixlike, el mecanismo clásico de ejecución de una orden por parte del shell es llamar a un conjunto de operaciones llamadas “primitivas” o en inglés “system calls”. En la siguiente listas se dan las primitivas más conocidas.
El System Calls para el sub-sistema de manejo de archivos provee:
Acceso a archivos existentes: open, read, lseek, close.
Creación de nuevos archivos: create, mknod.
Manejo atraves del file system: chdir, chown, chmod.
Creación y borrado de links: link y unlink.
El System Calls para el subsitema de control de procesos prove:
Creación de proceso Hijo: Fork
Ejecución de proceso: Exec
Evío de señales: Kill y signal
El mecanismo clásico (ver figura), sin entrar en detalles profundos, de ejecución de una instrucción por parte del shell es llamar la primitiva “fork”(1) se crean dos procesos idénticos uno el proceso hijo y otro el padre. Se duplican las pilas y las tablas de datos en áreas de memoria incompatibles. El proceso shell padre se pone a dormir con la primitiva “wait” a espera que el shell hijo termine. El shell hijo ejecuta las instrucciones con la primitiva “exec”; una vez que finalice este le indica al shell padre que terminó con la primitiva “exit”. Además por un mecanismo de comunicación entre procesos (IPC) el hijo le comunica al padre los resultados de la ejecución de los comandos.
(1) No confundir con la primitiva “clone” que pertenece al POSIX 1001.
El shell tiene incorporado algunas órdenes dentro de sus propio código, es decir, no existe como programa ejecutable en ningún directorio. Estas son intrínsecas del shell como ser cd, pwd, echo, etc. Cuando se ejecuta una órden interna al shell no crea proceso hijo. Las funciones internas se puden ver con la instrucción “help” en BASH.
Un ejemplo de ejecución interna es:
hcaste@azul:~$ x=37
hcaste@azul:~$ cadena="hola"
hcaste@azul:~$ echo "$cadena $x"
hola 37
En la primera se le crea la variable con etiqueta “x” y se le asocia el contenido 37. En el segundo caso se crea la variable con etiqueta “cadena” se le asocia la cadena de caracteres (string en inglés) “hola”. Luego la instrucción interna echo muestra los contenidos de cada variable, observar el signo “$” que indica “contenido”. En cambio si hago:
hcaste@azul:~$ echo "cadena x"
cadena x
para saber que hace echo, basta con hacer “help echo”
hcaste@azul:~$ help echo
echo: echo [-neE] [arg ...]
Escribe argumentos en la salida estándar.
Muestra los argumentos en la salida estándar seguidos por un carácter
de fin de línea.
también se puede consultar al manual “man echo” pero este en general está en inglés…
ECHO(1) User Commands ECHO(1)
NAME
 echo - display a line of text
SYNOPSIS
 echo [SHORT-OPTION]... [STRING]...
 echo LONG-OPTION
DESCRIPTION
 Echo the STRING(s) to standard output.
-n do not output the trailing newline
-e enable interpretation of backslash escapes
En la próxima entrega se focalizará ya en el shell-scrypt.