Tercer curso Ingeniería Informática. Curso 2007-2008
Práctica 2: Procesos en UNIX.
Continuar la codificación de un intérprete de comandos (shell) en UNIX, que se irá
completando en suscesivas prácticas.
- 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 (segmentation, bus error ...), salvo
que se diga explicitamente
- 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 al shell con su entrada estándar
redireccionada a dicho archivo.
Nuestro shell debe mantener dos nuevas listas:
- ruta de búsqueda. Es la lista de directorios donde el shell busca los ejecutables
externos (análogo a la variable de entorno PATH del sistema). El comando path
manipula y/o muestra dicha lista. La implementación es libre (cada uno como quiera) pero NO DEBE
implementarse como una variable de entorno (ni usar la variable de entorno PATH para implementarla)
- lista de procesos en segundo plano. Cada vez que desde nuestro shell cree un proceso
en segundo plano, debe incluirlo en una lista de procesos en segundo plano. El comando jobs
muestra y/o manipula dicha lista. La implementación de la lista es libre
- path [op] [dir |file]
- Manipula y/o muestra la ruta de bsqueda de nuestro
intérprete de comandos. Los directorios de esta lista se especificarán sin el caracter '/'
al final (salvo el directorio raíz "/"). Se admiten directorios relativos (p.e. "../bin") en
esta lista y NO DEBEN convertirse en absolutos. op puede ser -a, -d, -q, -n, -p o
-f Ejemplos
#path -a /usr/local/bin /* correctos */
#path -d /
#path -q .
- path -a [dir]
- Añade dir a la ruta de búsqueda.
- path -d [dir]
- Elimina dir de la ruta de búsqueda.
- path -q [dir]
- Indica si dir está en la ruta de búsqueda.
- path -n
- Vacía la ruta de búsqueda.
- path -p
- Añade los directorios de la variable de entorno PATH a la
ruta de búsqueda.
- path
- Muestra la ruta de búsqueda.
- path -f [file]
- Si se le indica
una trayectoria completa (empezando por ./, por / o por ../) indicará si dicho fichero existe. Si
no se especifica trayectoria completa lo busca file en la lista de directorios que constituyen
la ruta de búsqueda del intérprete de comandos y devuelve la trayectoria completa hasta él.
(es TOTALMENTE análogo al comando which del sistema, véase el ejemplo a continuación).
(NOTA: muy reutilizable para el comando exec y la ejecución en primer o segundo plano)
Si no se especifica
dir o file en -a, -d, -q o -f, se mostrará la ruta de búsqueda.
#path -a /usr/openwin/bin
#path -f xterm
/usr/openwin/bin/xterm
#path -f xternp
xternp: no encontrado
#path -f ./aa.out
./aa.out: no encontrado
#path -f ./a.out
./a.out
- exec com
- El intérprete de comandos ejecuta, sin crear un nuevo proceso
(reemplaza su código), el programa especificado en com. com representa un
ejecutable con sus parámetros. Para poder ser ejecutado, dicho ejecutable debe residir en uno
de los directorios de la ruta de búsqueda del intérprete de comandos o bien
especificarse la trayectoria completa hasta él (comenzando por /, ./ o ../). Debe usarse la
llamada al sistema execv.
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 */
- com
- Totalmente análogo al comando exec, salvo que el shell crea el proceso
que ejecuta dicho comando y espera a que dicho proceso termine (la ejecución es, por tanto, en primer plano).
Todo lo dicho sobre los ejecutables en el comado exec es aplicable aquí. com
representa un ejecutable junto con sus parámetros.
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 */
.
- com &
- Exactamente igual a com salvo que la ejecución es en segundo plano
(el shell no
espera a que el proceso termine). Además añade com a la lista de procesos en segundo
plano del shell
Ejemplos
#xterm -e csh &
crea un proceso que ejecuta xterm en segundo plano.
- getpriority [pid]
- Muestra la prioridad del proceso pid. Si no se especifica pid,
muestra la prioridad del intérprete de comandos.
- setpriority [pid] valor
- Estable la prioridad del proceso pid. Si no se
especifica pid, establece la prioridad del intérprete de comandos.
- exec @valor com
- El intérprete de comandos ejecuta, sin crear un nuevo proceso
(reemplaza su código), el programa especificado en com con la prioridad establecida a
valor. com representa un
ejecutable con sus parámetros. Para poder ser ejecutado, dicho ejecutable debe residir en uno
de los directorios de la ruta de búsqueda del intérprete de comandos o bien
especificarse la trayectoria completa hasta él (comenzando por /, ./ o ../). Debe usarse la
llamada al sistema execv.
Ejemplo:
#exec @10 xterm -e csh /*ejecuta sin crear proceso xterm -e csh*/
/*cambiando su prioridad a 10*/
....
- @valor com [&]
- Crea un proceso que ejecuta el comando especificado en com con la
prioridad establecida a valor. Al igual que en exec y en la ejecucíon en primer
y segundo plano com representa un
ejecutable con sus parámetros. Para poder ser ejecutado, dicho ejecutable debe residir en uno
de los directorios de la ruta de búsqueda del intérprete de comandos o bien
especificarse la trayectoria completa hasta él (comenzando por /, ./ o ../). Debe usarse la
llamada al sistema execv. En el caso de que la ejecución sea en segundo plano, el shell
añadirá el proceso a la lista de procesos en segundo plano.
Ejemplo:
#@10 xterm -e csh & /*crea un proceso que ejecuta */
/*xterm -e csh en segundo plano*/
/*cambiando su prioridad a 10*/
....
- jobs[[-n] [-s] [-p] [-a]
- ] |[pid1 [pid2]...] Muestra los
procesos en segundo plano con pids pid1, pid2 .... Alternativamente,
en lugar de especificar los
pids puede usarse
- -n
- todos los que ha terminado normalmente
- -s
- todos los que han terminado debido a una señal
- -p
- todos los que están parados
- -a
- todos los activos
Si no se especifica sobre que conjunto de procesos quiere actuarse (bien mediante lista de pids o
bien mediante las opciones -a, -s ...) se entenderá que es todos
La lista indicará, para cada proceso, EN UNA SOLA LINEA
- pid del proceso
- estado, uno de los siguientes
- ACTIVO
- TERMINADO POR SEÑAL, se indicará las señal que lo ha parado
- TERMINADO NORMALMENTE, se indicará el valor devuelto
- PARADO, se indicará la señal que lo ha parado
- prioridad actual del proceso
- instante de comienzo del proceso
- línea de comando que se está ejecutando
- cleanjobs[[-n] [-s] [-p] [-a]
- ] |[pid1 [pid2]...] Elimina de la
lista de procesos en segundo plano los procesos con pids pid1, pid2 ....
Alternativamente, en lugar de especificar los pids puede usarse
- -n
- todos los que ha terminado normalmente
- -s
- todos los que han terminado debido a una señal
- -p
- todos los que están parados
- -a
- todos los activos
Si no se especifica sobre que conjunto de procesos quiere actuarse (bien mediante lista de pids o
bien mediante las opciones -a, -s ...) no se eliminará ninguno y se imprimirá la lista
completa (como el el caso de jobs sin argumentos
Información detallada de las llamadas al sistema y las funciones de la librería
debe obternerse con man (exec, 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:
FECHA DE ENTREGA VIERNES 9 MAYO 2007