Tengo 1 práctica de ingeniería informática que me trae de cabeza. No llego a mandar señales con kill

La practica que te pongo a continuación me trae de cabez, conseguí formar los hijos como dios manda, pero mi problema llega al querer mandar las señales con kill(pid, SIGUSR1). No se si debo igualar esta llamada a un valor para comprobar si se envía bien, ademas para poner los pids primero los guarde en una matriz global, pero no se almacenan y por lo tanto no da vueltas... De esta dejo la carrera, ¿podrías echarme un mano por favor?
Gracias
Las practicas las realizo tanto en C como en unix.
En esta práctica, los procesos formarán un corro. Irán transmitiendo la señal SIGUSR1 alrededor del corro. Cuando la señal haya dado siete vueltas, los procesos morirán.
La práctica constará de un único ficheros fuente y su correspondiente 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.
El proceso original tendrá un único hijo. Dicho hijo tendrá otro hijo sólo, que a su vez tendrá otro, y así hasta que la familia tenga tantos miembros como esté especificado en la línea de órdenes.
Una vez creados todos los hijos, el hijo más joven manda la señal SIGUSR1 al primer proceso. Cuando este proceso reciba la señal, la transmitirá a su hijo, el cual la transmitirá al suyo, y así sucesivamente hasta que la señal retorne al hijo más joven. El hijo más joven imprimirá por la pantalla "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.
Cuando el hijo menor acabe con las siete vueltas, morirá y devolverá un código de retorno unidad a su padre.
Cuando cualquier proceso detecte que su hijo ha muerto, tomará su código de retorno, le sumará uno y devolverá el resultado de la suma a su padre al morir.
Cuando el padre de todos los procesos detecte que su hijo ha muerto, tomará su código de retorno. Si el código de retorno obtenido más uno coincide con el número de procesos totales, imprimirá por pantalla:
Ejecución satisfactoria.
Si no es así, imprimirá: "Fracaso

3 respuestas

Respuesta
1
La verdad es que me pillas un pelín verde hace mucho que no programo en C y menos bajo Unix (linux me imagino) pero haber si te sirve esta respuesta.
LA solución la tienes en los propios comandos del Linux recuerda que tienes el PS; grep, 1> y 2> lo más seguro es que no sete guarde el valor en la variable porque lo igualaras directamente y como son procesos externos a la aplicación eso no sirva por otro lado también puede ser que se te haya olvidado hacer que los procesos hereden las variables de los padres con lo que en cada creación de proceso las variables se redefinen con lo que tienes POR variables que se llaman igual en POR procesos diferentes, si al crearlos les dices que los hereden solo tendrás una matriz de POR elementos, pero no estoy seguro que la necesites ya que el proceso hijo tiene PIDPadre + 1 o PIDHijo - 1 como te sea más fácil y con eso puedes sacar el SIGUSR1 casi seguro.
1> Saca la salida estándar donde quieras y 2> saca el error o el código de error así que así puedes saber si ha fallado
Muchísimas gracias, la verdad es que si que estaba igualando directamente a pesar de ser una variable global, intentaré hacerlo como me has dicho. Gracias otra vez.
Respuesta
1
En efecto, es una buena práctica de programación el guardar el valor de retorno de una función para controlar errores.
Lo que te escribo a continuación es un ejemplo del funcionamiento:
int errret;
errret = kill(child, SIGUSR1);
if(errret < 0)
perror("kill:SIGUSR1");
else
printf("La señal se ha enviado satisfactoriamente.");
Respuesta
-1
Siento no poder ayudarte, mi especialidad es la gestión no la programación, es decir, yo diseño programas no los elaboro.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas