SISTEMAS OPERATIVOS II

Tercer curso Ingeniería Informática. Curso 2010-2011

Práctica 1: Procesos en Unix: Señales

Comenzar la codificación de un intérprete de comandos (shell) en UNIX. Nótese que los comandos aquí descritos deben interpretarse de la siguiente manera

Además deben tenerse en cuenta las siguientes indicaciones

Comandos a implementar en esta práctica

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

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.

getpid [-p]
Muestra el pid del proceso. Con -p muestra el pid del proceso padre del shell

cd [dir]
Cambia el directorio actual del shell a dir. Si no se especifica dir muestra el directorio actual del shell

fork
El shell crea un hijo y se queda en espera (el shell) a que ese hijo termine.

exec
prog arg1 ... Ejecuta, sin crear proceso (es decir REEMPLAZANDO el código del shell) el programa prog con sus argumentos. prog representa un ejecutable externo y para poder ser encontrado debe especificarse una trayectoria completa hasta él (comenzando por "/", "./" o "../"). Debe usarse la llamada execv.

prog
arg1 ... El shell crea un proceso que ejecuta en primer plano el programa prog con sus argumentos. prog representa un ejecutable externo y para poder ser encontrado debe especificarse una trayectoria completa hasta él (comenzando por "/", "./" o "../"). Debe usarse la llamada execv. NO DEBE ESCRIBIRSE "prog" PARA EJECUTAR ALGO. "prog" REPRESENTA EL NOMBRE DEL EJECUTABLE

sigaction
[-verbose] [-resend] [-resethand] [-onstack] [-nodefer] [-sleepNN] [-maskSEN1] [-maskSEN2] ...S1 S2... Instala un manejador (utilizando la llamada sigaction) para las señales S1, S2 ...con las siguientes caractrísticas
El manejador incrementa un contador (para cada señal) que indica cuantas veces se ha ejecutado.
-maskSEN
El manejador ha de ejecutarse con la señal SEN enmascarada (se añade SEN al miembro sa_mask de la estructura sigaction)
-sleepNN
El manejador ha de quedar en espera NN segundos (con la llamada sleep). Debe ser la última instrucción dentro del manejador
-verbose
El manejador debe imprimir en pantalla el nombre de la 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 -verbose el manejador NO DEBE IMPRIMIR NADA en pantalla.
-resend
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 -sleepNN). Se enviará hasta que el contador de señales recibidas sea es establecido por maxmanejador. Si maxmanejador es 0, se reenvía continuamente
-resethand
El manejador es temporal: se instala con el flag SA_RESETHAND
-onstack
El manejador se ejecuta en la pila alternativa: se instala con el flag SA_ONSTACK
-nodefer
El manejador puede ser interrumpido por la propia señal: se instala con el flag SA_NODEFER
-restart
El manejador se instala con el flag SA_RESTART Ejemplo
-> sigaction -resend -nodefer -onstack -sleep10 -maskUSR1 -maskHUP INT SEGV
Instala, con los flags SA_NODEFER y SA_ONSTACK, un manejador para SIGINT y SIGSEGV. Dicho manejador se ejecuta con SIGUSR1 y SIGHUP enmascaradas (miembro sa_mask). El manejador cuando se ejecute, además de incrementar el contador de veces que se ha recibido la señal, envia la señal al propio proceso y luego se queda en espera 10 segundos.

maxmanejador
[N] Establece el número máximo de veces que se reenvía una señal con el manejador (que se ha instalado con la opción -resend). Si no se especifica N nos informa de cuál es su valor
siginfo
[S1] [S2] ... Nos da información del estado de las señales SI, S2 ...: manejada (con la dirección del menjador, los flags y la máscara asociada), ignorada o acción por defecto, asi como de si está enmascarada o no. Si no se especifican señales nos muestra la información de todas de todas. Ejemplo

#siginfo 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

showcont
[S1] [S2] ... Nos informa de los contadores de los manejadores de las señales S1, S2 .... Si no se especifican señales nos muestra los contadores de todas.

clearcont
[S1] [S2] ... Pone a cero los contadores de los manejadores de las señales S1, S2 .... Si no se especifican señales pone a cero los contadores de todas.

sigaltstack
[tam] [dir] Establece una pila alternativa de tamaño tam para la ejecución de las señales en la dirección de memoria dir. Si no se especifica dirección, se obtendrá una asignando mediante malloc del tamaño que se le indica. (/***/ es posible que, especificando alguna dirección de memoria concreta como pila alternativa, se pueda producir un fallo de segmentación al recibir una señal cuyo manejador se ejecuta en dicha pila). Si no se especifica tam nos muestra la dirección y el tamaño de la pila alternativa

sigprocmask
[-set|-block|-unblock] S1 S2 ... Enmascara o desenmascara (mediante sigprocmask) las señales S1, S2 .... Si no se especifican señales nos informa de las que están enmascaradas.

sigignore
[-dfl] [S1] [S2] ... Ignora las señales S1, S2 .... Si no se especifican señales nos informa de las que están ignoradas. Si se especifica -dfl pone las señales S1, S2 ...a su acción por defecto y si además no se indican 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). (/***/ evidentemente produce un error en tiempo de ejecución)

Información detallada de las llamadas al sistema y las funciones de la librería debe obternerse con man (sigprocmask, sigaction, sigaltstack, fork, execv, waitpid, stat, ...)

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 11 MARZO DE 2011