Práctica 2: Procesos en UNIX.
Comenzar la codificación de un intérprete de comandos (shell) en UNIX, que se irá completando en suscesivas prácticas. Dicho intérprete incluirá de momento los comandos que se citan a continuación. Los argumentos entre corchetes [] son opcionales. Los argumentos separados por | indican que debe ir uno u otro, pero no ambos simultaneamente. No debe dilapidar memoria (ejemplo: variable que se asigna cada vez que se llama a una función y no se libera). Cuando el shell no pueda ejecutar una acción por algún motivo, debe indicarlo con un mensaje como el que se obtiene con sys_errlist[errno] o con perror() (por ejemplo, si no puede cambiar de directorio debe indicar por qué). En ningún caso debe producir un error de ejecución. Las direcciones de memoria deben mostrase en hexadecimal. La información que se nuestra en pantalla no debe incluir en ningun caso líneas en blanco. El shell leerá de su entrada estándar y escribirá en su salida estándar, de manera que podría ser ejecutado un archivo de comandos invocando el shell con su entrada estándar redireccionada a dicho archivo.
La ruta de búsqueda del intérprete de comandos es el conjunto de directorios donde se buscan los ejecutables (Su misión es análoga a la variable de entorno PATH en el shell del sistema). NO DEBE implementarse con una variable de entorno. Los directorios se especificarán sin el caracter '/' al final Ejemplos
#pathadd /usr/local/bin /* correctos */ #pathadd / #pathdel . ...... #pathchk /usr/local/bin/ /*incorrecto*/ #pathdel ./ /*incorrecto*/
#pathadd /usr/openwin/bin #whereis xterm /usr/openwin/bin/xterm #whereis xternp xternp: no encontrado #whereis ./aa.out ./aa.out: no encontrado #whereis ./a.out ./a.out
Ejemplo
#exec /usr/bin/ls -l /home /*ejecuta /usr/bin/ls*/ .... #exec ./a.out -l /*ejecuta a.out, /*que esta en el directorio actual */ ...... #exec ls -l /* para ejecutar esto, es necesario */ /*que el directorio /usr/bin, */ /*donde esta el programa ls, se haya incluido */ /* a la ruta de busqueda */
Ejemplo
#/usr/bin/ls -l /home /*crea un proceso que ejecuta /usr/bin/ls*/ .... #./a.out -l /* crea un proceso que ejecuta a.out,*/ ...... /* que esta en el directorio actual */ #ls -l /* para ejecutar esto, es necesario que el directorio */ /* /usr/bin, donde esta el programa ls, se haya incluido */ /* a la ruta de busqueda */.
#background xterm -e csh
crea un proceso que ejecuta xterm en segundo plano.
Esta función debe hacer lo siguiente
Un posible código pra la función recursiva (sin las definiciones de constantes)podría ser:
void recursiva (int n, int liberar) { char automatico[TAMANO]; static char estatico[TAMANO]; void * puntero; puntero=(void *) malloc (TAMANO); printf ("parametro n:%d en %p\n",n,&n); printf ("valor puntero:%p en direccion: %p\n", puntero,&puntero); printf ("array estatico en:%p, array automatico en %p\n", estatico,automatico); if (liberar==ANTES) free (puntero); if (n>0) recursiva(n-1,liberar); if (liberar==DESPUES) free (puntero); }
Información detallada de las llamadas al sistema y las funciones de la librería debe obternerse con man (exec, chdir, fork, strtok, waitpid, getpid..)
FORMA DE ENTREGA Va a ser utilizado el servicio de recogida de prácticas suministrado por el Centro de Cálculo de esta Facultad y parte del proceso de corrección de las prácticas va a ser automtico (compilación, listado de practicas entregadas etc) por lo cual deben entregarse exactamente como se indica a continuación:
/* AUTOR:apellido11 apellido12, nombre1:login_del_que_entrega_la_practica AUTOR:apellido21 apellido22, nombre2:login_del_que_entrega_la_practica */donde: