TAREA PROGRAMADA #1
El programa que hay que presentar constará de un único archivo fuente de nombre TareaPSos1.c. La correcta compilación de dicho programa, producirá un archivo ejecutable, cuyo nombre será obligatoriamente TareaPSos1. Respetar las mayúsculas/minúsculas de los nombres, si las hubiere. La ejecución del programa creará una serie de procesos que se transmitirán señales entre ellos. En concreto, el árbol de procesos que hay que crear es el siguiente:
Las relaciones paterno-filiales son las indicadas por las líneas sólidas. Una vez construido el arbol, el proceso padre muere y los demás permanecen vivos, bloqueados y sin consumir CPU. En este momento, habremos recuperado el control desde nuestra shell y enviaremos al procesoA una señal SIGTERM. La señal se va a ir transmitiendo a otros procesos según el esquema que se indicará más abajo.
Transcurridos tres segundos, el proceso A comprobará cuántos procesos siguen vivos, imprimirá un dibujo con la situación por la pantalla, ejecutará una orden ps -fu usuario que sirva de comprobación y acabará, no dejando ningún proceso vivo. En el siguiente dibujo, se observa cómo se propagan las señales:
Si un proceso recibe la señal SIGTERM y no es un proceso del final (no es ni G, ni H, ni I, ni J) puede hacer una de estas cuatro cosas:
1. No enviar la señal a ningún proceso.
2. Enviar la señal al proceso situado debajo a la izquierda.
3. Enviar la señal al proceso situado debajo a la derecha.
4. Enviar la señal a ambos procesos.
El que realice una u otra acción va a depender del reloj del sistema. Consultará los microsegundos marcados por el reloj del sistema mediante una llamada gettimeofday. Dividirá el valor entre cuatro y obtendrá el resto. Dependiendo del valor del resto de la división (0, 1, 2 ó 3) se realizará la acción correspondiente de la lista anterior.
Para que el proceso A sepa si siguen vivos E, H o I, puede usar la llamada al sistema waitpid en su versión no bloqueante. Para saber qué ha ocurrido con los procesos de la hilada B-D-G, se procederá así:
1. Si A no mandó la señal a B, sabe que los tres están en pie.
2. Si A mandó la señal a B, hará un wait bloqueante y B le dirá en su código de retorno cuántos nodos de la hilada B-D-G siguen en pie. Para que B sepa cuántos nodos quedan se hace lo mismo, pero ahora el papel de A lo ocupa B y el de B lo ocupa D.
En el caso de la hilada C-F-J, se procede de modo equivalente.
Restricciones
Se deberán usar llamadas al sistema siempre que sea posible, a no ser que se especifique lo contrario.
No está permitido usar la función de biblioteca system, salvo indicación explícita en el enunciado de la práctica.
Se ha de lograr que al hacer un ps aparezca por la pantalla en lugar de TareaPSos1, el nombre de cada proceso: A, B, C, etc.
No se puede suponer que los PIDs de los procesos de una hilada van a aparecer consecutivos. Puestos en plan exquisito, ni siquiera podemos suponer que estarán ordenados de menor a mayor (puede ocurrir que se agoten los PIDs y retome la cuenta partiendo de cero).
No está permitido el uso de ficheros, tuberías u otro mecanismo externo para transmitir información entre los procesos.
El programa que hay que presentar constará de un único archivo fuente de nombre TareaPSos1.c. La correcta compilación de dicho programa, producirá un archivo ejecutable, cuyo nombre será obligatoriamente TareaPSos1. Respetar las mayúsculas/minúsculas de los nombres, si las hubiere. La ejecución del programa creará una serie de procesos que se transmitirán señales entre ellos. En concreto, el árbol de procesos que hay que crear es el siguiente:
Las relaciones paterno-filiales son las indicadas por las líneas sólidas. Una vez construido el arbol, el proceso padre muere y los demás permanecen vivos, bloqueados y sin consumir CPU. En este momento, habremos recuperado el control desde nuestra shell y enviaremos al procesoA una señal SIGTERM. La señal se va a ir transmitiendo a otros procesos según el esquema que se indicará más abajo.
Transcurridos tres segundos, el proceso A comprobará cuántos procesos siguen vivos, imprimirá un dibujo con la situación por la pantalla, ejecutará una orden ps -fu usuario que sirva de comprobación y acabará, no dejando ningún proceso vivo. En el siguiente dibujo, se observa cómo se propagan las señales:
Si un proceso recibe la señal SIGTERM y no es un proceso del final (no es ni G, ni H, ni I, ni J) puede hacer una de estas cuatro cosas:
1. No enviar la señal a ningún proceso.
2. Enviar la señal al proceso situado debajo a la izquierda.
3. Enviar la señal al proceso situado debajo a la derecha.
4. Enviar la señal a ambos procesos.
El que realice una u otra acción va a depender del reloj del sistema. Consultará los microsegundos marcados por el reloj del sistema mediante una llamada gettimeofday. Dividirá el valor entre cuatro y obtendrá el resto. Dependiendo del valor del resto de la división (0, 1, 2 ó 3) se realizará la acción correspondiente de la lista anterior.
Para que el proceso A sepa si siguen vivos E, H o I, puede usar la llamada al sistema waitpid en su versión no bloqueante. Para saber qué ha ocurrido con los procesos de la hilada B-D-G, se procederá así:
1. Si A no mandó la señal a B, sabe que los tres están en pie.
2. Si A mandó la señal a B, hará un wait bloqueante y B le dirá en su código de retorno cuántos nodos de la hilada B-D-G siguen en pie. Para que B sepa cuántos nodos quedan se hace lo mismo, pero ahora el papel de A lo ocupa B y el de B lo ocupa D.
En el caso de la hilada C-F-J, se procede de modo equivalente.
Restricciones
Se deberán usar llamadas al sistema siempre que sea posible, a no ser que se especifique lo contrario.
No está permitido usar la función de biblioteca system, salvo indicación explícita en el enunciado de la práctica.
Se ha de lograr que al hacer un ps aparezca por la pantalla en lugar de TareaPSos1, el nombre de cada proceso: A, B, C, etc.
No se puede suponer que los PIDs de los procesos de una hilada van a aparecer consecutivos. Puestos en plan exquisito, ni siquiera podemos suponer que estarán ordenados de menor a mayor (puede ocurrir que se agoten los PIDs y retome la cuenta partiendo de cero).
No está permitido el uso de ficheros, tuberías u otro mecanismo externo para transmitir información entre los procesos.