La era de la informatica

Friday, February 16, 2007

Como hacer un shell

Buenas a todos. Quizas el titulo es demasiado pretencioso. No quiero dar una forma detallada de como hacer un shell, hoy en dia hacer un shell es una tonteria ya que existen muchos en el mercado que ademas hacen cosas increibles, pero vamos a hablar de los princpios que tiene todo shell. Repito que lo mejor no es hacer un shell, sino contribuir a la mejora de los que ya existen (de eso va el software libre).

Empecemos por definir un shell.
Como yo no soy muy elocuente, intentare definirlo atendiendo a su funcionalidad y espero que con eso sea suficiente para que todo el mundo lo entienda (si ya lo sabes podeis obviar esta seccion). Historicamente los ordenadores no tenian lo que se llamaban terminales de entrada o consola de entrada, y la unica salida era una impresora o una cinta. Las cosas avanzaron y se crearon los sistemas operativos que procesaban las ejecuciones de los procesos en forma de ejecucion por lotes (un trabajo tras otro). Segun evolucionaba todo y a la vez de disponer de teclados y pantallas era necesaria una forma de comunicarse con el sistema operativo de forma que le indicasemos que proceso debia ejecutar a continuacion. Esa forma arcaica de comunicacion entre el humano y la maquina la llevaba a cabo el shell (interprete de comandos). Para muchos es simplemente la pantallita negra con el cursor parpadeante. El shell era el encargado de hacer las llamadas al sistema operativo necesarias para que éste ejecutase un programa. Hoy en dia todo esto esta muy avanzado, los shell no solo permiten comunicarse con el SO para ejecutar un programa, ademas permiten la ejecucion en paralelo de varios programas, crear scripts propios para automatizar tareas, mandar la salida de un proceso como entrada de otro de forma automatica, etc.

Nuestro shell basico.
Dado que mi nombre empieza por P lo voy a llamar SHell de P, abreviado shp. Las funciones que va a tener serán las siguientes:
1. Debe coger la entrada de un comando mediante teclado, y ejecutar el comando en un proceso hijo
2. Normalmente el shell debe esperar a que el proceso hijo termine de ejecutarse para pedir otro comnado, pero si el ultimo parametro del comando es &, entonces no debe esperar, ejecutandose el shell y el comando de forma simultanea.
3. Vamos a incluir la ejecucion especial de comandos propios del shell, que seran cd para cambiar de directorio, export para crear variables de entorno y exit para terminar la ejecucion del shell.
4. Mediante una señal provocada por la combinacion de teclas CTRL+C (señal SIGINT) se imprimira por pantalla el historial de los ultimos comandos ejecutados (se podra especificar mediante una variable de entorno la longitud de esta lista, que por defecto sera de 10)
5. Mediante un nuevo comnado r num (numero de linea) se reejecutara un comando que este en el historial de ejecuciones, determinado por el numero de entrada (num).

Dados los requerimientos vamos a determinar unas limitaciones del shell:
1. Tanto la creacion de procesos, como el manejo de señales sera el propio de UNIX intentando acomodarse a los estandares POSIX. Es decir, el programa no sera portable a otros sistemas operativos. Yo lo he programado y probado en BSD y Linux.
2. El shell es muy basico y no contendra de momento funcionalidades tipicas de otros shell como redireccionamiento de entrada o salida estandar, ni lectura de ficheros, etc etc.

Vamos a desarrollar el shell en C, intentando que sea ANSI, aunque no se si habre metido la pata en este punto, si es asi agradecer vuestras correcciones.
Las herramientas que necesitamos son las siguientes:
Funcion fork() para crear procesos
Funcion waitpid(...) para esperar a la ejecucion de un proceso
Funcion sigacion(...) para la captura de la interrupcion ctrl+c
Funcion execvp(...) para la ejecucion de un comando
Y lo demas son funciones de la libreria estandar de C. Para ver la ayuda de como usar estos comandos, tanto en unix como linux teclead man + nombre del comando, y vereis como se usan.

Esta es una breve descripcion funcional del proceso:
La funcion main(donde empieza todo) se mete en un bucle infinito y llama la funcion setup. La funcion setup coge la entrada de teclado, la separa en un array de comandos y retorna. La funcion main determina si es un comando propio de shell o se debe ejecutar en la maquina. Si es de shell se ejecuta en una funcion propia. Si es de la maquina se crea un proceso hijo. El proceso hijo ejecuta el comando y el shell determina si debe esperar o seguir su ejecucion (parametro &). Vuelve a empezar el proceso. Si durante el proceso el usuario pulsa ctrl+c, se imprime el historial de ejeuciones y se continua el proceso donde se dejo.

Os animo a que si teneis tiempo lo programeis, se tarda muy poquito y es divertido. Como veis no he detallado totalmente como funcionara el shell, los detalles se dejan a la imaginacion de cada uno. Si quereis podeis añadir cosas nuevas. En la proxima entrada del blog dentro de unos dias publicare el codigo fuente que yo he creado, aunque quiza el vuestro sea mejor. Agradecere comentarios y sugerencias, a ver si asi consigo hacer de esto algo participativo (aunque dada mi popularidad en la blogosfera lo dudo mucho...)

7 Comments:

  • Bueno muchas gracias, me ayudo esto.
    Me vendria muy bien si publicarias tu codigo del shell, estudio ingenieria en sistemas y tengo un plazo de 2 semanas para hacer un shell y un administrador de sesion.
    Desde ya muchas gracias.

    SEBAS

    By Anonymous Anonymous, at 10:37 PM  

  • Gracias!! Casualmente estoy estudiando ingenieria en sistemas y con el mismo trabajo!! aunque yo lo tengo que realizar completamente en bash scripts me me dio una buena base para arrancar. TIC TAC TIC TAC....

    By Anonymous Anonymous, at 10:33 PM  

  • Anabel!!!! Vos podes!!!!

    By Anonymous Anonymous, at 4:07 PM  

  • gracias me haz aclarado el panorama
    http://eibi.utalca.cl

    By Blogger Rodrigo Aguilar, at 5:39 PM  

  • por eso no posteo estas cosas en mi blog ya que muchas personas se aprovechan y no constribuyen a la inventiva copiandose los trabajos de la red, y bueno tratare de hechar a volar mi imaginacion y hacer una shell remota en java para que se pueda ejecutar en todos los so, y con respecto a lo de bash eso es shell y la shell generalmente se hace en c, incluso algunos o casi todos los comandos son estandar de c, graciaas sigue men

    creo q el segundo programa es en batch jeje ^^

    By Anonymous Anonymous, at 5:17 AM  

  • Saludos bueno resulta que yo tengo que hacer el mismo trabajo para mi universidad quisiera pedirles ayuda acerca de esto ya que no tengo ninguna referencia clara de como hacerlo dejo mi correo por si alguien puede hacerme favor de ayudarme elruso_4848@hotmail.com de antemano gracias

    By Blogger Silvercygnus, at 8:17 AM  

  • Me podrias decir como hago el comando echo en una shell propia?

    By Anonymous Anonymous, at 3:54 AM  

Post a Comment

<< Home