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.

Nuestro shell debe mantener dos nuevas listas:

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

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