makefile
. El nombre del fichero
fuente será ring.c
y del fichero ejecutable
que se produzca a partir de él será ring
.
El programa admitirá un único argumento que será el número
de procesos que forman el corro. Si se le invoca sin ningún
argumento, el programa imprimirá una línea indicando su forma
correcta de uso.
Vuelta número 1 completada.
".
En ese momento, el hijo más joven
volverá a mandar la señal SIGUSR1,
para volverla a recibir más tarde
e informar de que se ha completado la segunda vuelta.
En total, debe hacer esto siete veces. Después de
cada una de las tres primeras vueltas, el proceso más
joven debe dormir
un segundo (usad sleep
para ello) antes de
mandar la señal al proceso más viejo de nuevo. En el resto
de vueltas, no dormirá nada.
Ejecución satisfactoria
.Fracaso
".
-1
de kill
porque mataría a todos los procesos del usuario. Sólo deben
morir los procesos que pertenezcan al programa que ejecutáis.
pause()
y arrancad el programa
en segundo plano con &
. Haced
un ps
y observad que se han creado
justo tres procesos y que su relación de
parentesco es lineal (Hay un padre, un hijo
y un nieto). No os olvidéis de matarlos.
[[Código de iniciación, registro de SIGUSR1, etc.]] mi_hijo=fork(); ... if (mi_hijo==0) /* Si soy el hijo menor */ {kill(padre_de_todos, SIGUSR1); } for (;;) pause(); [...] void manejadora(int seNal) { printf("Soy %d y voy a mandar la señal a %d.\n", getpid(),mi_hijo); fflush(stdout); /* kill(mi_hijo,SIGUSR1); */ }El hijo manda bien la señal al padre de todos porque se imprime el mensaje de la manejadora del padre, pero he tenido que comentar el
kill
porque mi_hijo
vale 0. Su valor tiene
que ser el pid del hijo del padre (lo que
devolvió fork
) pero vale 0. Es como
si la variable global no funcionara. Además, en
mi casa sí que funciona. Me estoy volviendo loco.