PRÁCTICAS DE LABORATORIO DE SISTEMAS OPERATIVOS
PRIMERA PRÁCTICA OBLIGATORIA (1999-2000)
Caín y Abel
Enunciado.
La práctica constará de dos ficheros fuente y su correspondiente
makefile
:
padre.c
y cain.c
. El programa
padre
no admitirá nada como argumentos de la línea de órdenes de la
shell. Hará lo siguiente:
- Tendrá dos hijos. Uno de ellos escribirá en la pantalla
"Soy Abel y mi PID es número_de_pid." y no acabará
pero tampoco hará nada más.
- El otro hijo escribirá en la pantalla "Soy Caín y mi
PID es número_de_PID" y pasará a ejecutar el
código resultante de la compilación de
cain.c
.
- El padre se quedará esperando por la finalización de
cualquiera de sus hijos. Cuando reciba la información
de la muerte de Abel, comprobará que ha muerto por
una señal e imprimirá el número de dicha señal que le
mató: "Abel ha muerto al recibir la señal número
número_de_señal". A continuación,
enviará una señal
SIGUSR1
a Caín. Si recibe la información de la muerte de Caín,
comprobará que es una terminación normal e imprimirá
el código de retorno que le devuelve Caín: "Caín ha muerto
y su código de retorno es código_de_retorno. Acto
seguido finalizará normalmente y devolverá como código
de retorno un cero.
- En
cain.c
, lo primero que se hace es dormir
cinco segundos (usad sleep
), matar a Abel
con la señal SIGTERM y no acabar. Cuando se reciba la
señal SIGUSR1
, se acaba con un código de
retorno igual a 1.
- Si el esquema que se sigue no es el previsto por cualquier
circunstancia, el padre devolverá 1. Hacer un tratamiento
no paranoico de errores.
Se permitirá pasar un argumento al programa cain
.
Mientras están esperando, los procesos involucrados no deben
consumir CPU.
Plazo de presentación.
Hasta el lunes 3 de abril de 2000, inclusive.
LPEs.
En esta práctica debéis tener cuidado con un problema de
sincronización. No quiere decir que todos tengáis este problema,
pero he visto que es bastante frecuente. En el caso de que
tengáis un proceso que tiene que recibir una señal
que va a ser interceptada por el proceso, debéis garantizar
que:
- La señal nunca llegará ANTES de que hayáis hecho
el
sigaction
correspondiente para
interceptarla.
- Si habéis hecho algún
pause
para que
el proceso no consuma CPU mientras espera la señal
Y queréis que el proceso continúe después del
pause
cuando se reciba la señal,
ENTONCES debéis garantizar que el proceso ejecuta
el pause
ANTES de recibir la señal,
pues si no, se quedaría atrapado en él para siempre.
© 2000 Guillermo González Talaván.