SISTEMAS OPERATIVOS II

Tercer curso Ingeniería Técnica Informática Sistemas . Curso 2008-2009

Práctica 1: Procesos en UNIX: Señales.

Comenzar la codificación de un intérprete de comandos (shell) en UNIX, que se irá completando en suscesivas prácticas. El shell debe reconocer los comandos que se datallan ancontinuación, teniendo en cuanta que en dicha descripción:

Los comandos que incluirá el intérprete de comandos en esta primera nos permitirán práctica son

quit
Termina la ejecución del intérprete de comandos.

fin
Termina la ejecución del intérprete de comandos.

autores
Indica los nombres y los logins de los autores de la práctica.

chdir [dir]
Cambia el directorio actual a dir. Si no se le suministra argumento informa del directorio actual.

prompt prompt
Cambia el indicador (prompt) del intérprete de comandos.

getpid
Muestra el pid del proceso y de su proceso padre

fork
El intérprete de comandos crea un hijo con fork() y se queda (el propio intérprete de comandos) en espera hasta que dicho hijo (el creado con fork) termine.

stat fich
Nos da información del fichero fich (nombre, tamaño, permisos, fecha de ultimo acceso ...) (Una línea solamente)

delete fich
Elimina el fichero fich

files [-l][dir]
Lista los ficheros del directorio dir. Si no se especifica dir se entiende que es el directorio actual. -l indica que han de darse tambien los detalles de los ficheros (los mismos que en el comando stat)

 $$
sigaction [-v] [-r] [-p] [-t] [-f] [-dN] [-mSEN1] [-mSEN2] ...S1 [S2] .... Instala un manejador, mediante sigaction, para las señales S1, (S2 ...). El manejador incrementará un contador que indica cuantas veces se ha ejecutado para la señal por la que es invocado. Además se admitirán las siguientes opciones
-mSEN
El manejador ha de ejecutarse la señal SEN enmascarada (miempro sa_mask de la estructura sigaction
-dN
El manejador ha de quedar en espera N segundos (con la llamada sleep). Debe ser la última instrucción dentro del manejador
-v
El manejador debe imprimir en pantalla el nombre dela señal que se ha recibido (la cual está manejando), cuantas veces se ha recibido (el valor de contador) y la dirección de memoria donde está el parámetro que recibe. De no indicarse -v el manejador NO DEBE IMPRIMIR NADA en pantalla.
-r
El manejador reenvía al proceso la señal para la cual es manejador. En caso de reenviarse la señal, debe hacerse despues de imprimir en pantalla (en caso de que se imprima) y antes de quedarse en espera (en caso de que se haya especificado -sN)
-t
El manejador se instala con el flag SA_RESETHAND
-p
El manejador se instala con el flag SA_ONSTACK
-f
El manejador se instal con el flag SA_NODEFER

sigget [S1] [S2] ...
No da información del estado de cada señal: manejada (con la dirección del menjador, los flags y la máscara asociada), ignorada o acción por defecto, asi comode si está enmascarada o no. Ejemplo
#sigget INT HUP SEGV
INT Enmacarada manejador 0x30045a00 SA_RESTART SA_NODEFER. mascara asociada SIGUP SIGUSR1 
HUP No enmascarada Accion por defecto 
SEGV No emmascarada Ignorada

sigcont [-z] [S1] ...
Nos informa de los contadores de la señales S1 S2 ..., con -z pone a cero dichos contadores. Si no se especifican señales lo hace para todas (tanto mostrar los contadores como ponerlos a cero)

sigstack [tam]
Establece una pila alternativa para la ejecución de las señales de tamaño tam. Si no se especifica tamaño nos informa del tamaño de la pila alternativa y de su dirección .

sigmax [n ]
Establece el número máximo de veces que un manejador se reenvía la señal (valor máximo del contador). Si no se especifica n nos indica a cuanto está establecido dicho valor. Un valor 0 indica que no ha límite predefinido

sigmask [-n] [S1] ...
Enmascara (mediante sigprocmask las señales S1 S2 .... Si no se especifican señales nos informa de las que están enmascaradas. Con -n las desenmascara.

sigignore [S1] [S2] ...
Ignora las señales S1 S2 .... Si no se especifican señales nos informa de las que están ignoradas.

sigdefault [S1] [S2] ...
Pone las señales S1 S2 ...a su acción por defecto. Si no se especifican señales nos informa de las que están a su accion por defecto.

bucle
Hace que el shell entre en un bucle infinito. Instala un manejador para SIGINT que permite salir del bucle pulsando control-c para seguir ejecutando el shell.

segmentation
produce un fallo de segmentación en el shell. (No vale enviar SIGSEGV, tiene que ser un fallo de segmentación de verdad).

fpe
produce una excepción de la unidad en punto flotante en el shell. (No vale enviar SIGFPE, tiene que ser un fallo de segmentación de verdad).

NOTAS

Un shell es basicamente un bucle que imprime una petición de orden (prompt en la salida estándar (pantalla), lee una orden de la entrada estándar) teclado y procesa dicha orden.

Para imprimir en la salida estándar puede usarse printf, puts, putchar, ... o la llamada al sistema write con el descriptor 1 (STDOUT_FILENO); para leer de la entrada estándar gets, fgets scanf, getchar ... o la llamada al sistema read con el descriptor 0 (STDIN_FILENO). El troceado de la cadena de entrada puede resultar sencillo realizandose con strtok

Información detallada de las llamadas al sistema y las funciones de la librería debe obternerse con man, sección 2 para las llamadas al sistema y sección 3 para las funciones de libreria (strtok, sigaction, sigprocmask, sigaltstack, stat ...). Todo el manejo de señales debe realizarse con las llamadas al sistema de System V R4 (sigaction, sigprocmask, ...)

Salvo que se diga explicitamente (p.e., comandos segmentation y fpe, en ningún caso la práctica puede producir error en tiempo de ejecución.

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 7 NOVIEMBRE 2008