ayuda con manejo de señales

Imagen de fede89
0 puntos

hola tengo un par de dudas con el manejo de señales tengo que :

Hacer un programa con el cual se creen 3 procesos emparentados con la relación:
padre­>hijo­>nieto.
El padre debe "matar" al nieto cuando el hijo le envíe una señal a tal efecto.
El nieto informará al padre (su abuelo) el PID a través de un archivo.
El nieto enviará una señal al padre cuando el archivo está disponible.
El hijo no debe finalizar hasta que no termine el nieto.
El padre no debe finalizar hasta que no termine el hijo.

pude hacer los 3 procesos pero que el hijo le envie una señal al padre cuando quiera matar al nieto nose , y que el nieto le envie una señal al padre cuando el archivo este disponible tampoco
si alguien me puede ayudar con el manejo de señales seria uan gran ayuda.

desde ya muchas gracias y muy bueno el foro

Imagen de elgatogordo
+1
0
-1

¿es una pregunta de informática o el argumento de una telenovela?

+1
0
-1
Imagen de fede89
+1
0
-1

de informatica no entiendo el manejo de señales entre procesos si alguien me puede ayudar por favor
muchas gracias

+1
0
-1
Imagen de elgatogordo
+1
0
-1

que alguien que sepa te conteste tal vez en este foro de programadores puedan darte una mano
http://www.redusers.com/foros/viewforum.php?f=7&sid=88f04421f4f21c624f83...

PD: perdón por el chiste

+1
0
-1
Imagen de Julius-Caesar
+1
0
-1

Creo que lo que debes hacer es estudiar más y no venir aquí a que alguien te haga los
deberes.

Parece que solo vienes aquí para eso. Un poquito de morro sí que tienes.

Yo no soy programador, pero si lo fuera, no le haría los deberes a nadie.

Julio para los amigos.

+1
0
-1
Imagen de fede89
+1
0
-1

no quiero que me hagan los deveres solo necesito saver como hago para mandarle una señal a otro proceso y que este la reciva. si alguien save por favor conteste
desde ya muchas gracias

+1
0
-1
Imagen de slap
+1
0
-1

Puedes empezar mirándote este hilo: http://www.ubuntu-es.org/index.php?q=node/60602

Y, por supuesto, las páginas man de las funciones que se usan para que entiendas para qué sirve cada una.

Saludos.
----
Slap

+1
0
-1

Saludos.

0000 start out (+FD),A
           ld  BC, +7FFF
           jp 03CB, RAM-CHECK

http://www.injiniero.es

Imagen de fede89
+1
0
-1

todavia no puedo entender bien como hacer para mandar y recibir una señal
este es mi codigo y cuando lo ejecuto tira :"user defined signal1" y termina la ejecucion

#include
#include
#include
#include
#include
#include
#include
#include
void manejador (int sig){
printf("señal %d recibida\n",sig);
}

int main (){
int pid = 0,padre=0,hijo=0;
padre=getpid();
if ((pid = fork()) == -1)
{
printf("Error al crear proceso hijo\n");
exit(1);
}
if (pid == 0){
hijo=getpid();
printf("hijo %d creado\n",getpid());
printf("Hijo: %d liberado.\n",getpid());
fflush(stdout);
kill(getppid(),SIGUSR1);
printf("SEÑAL ENVIADA\n");
exit(1);

}
else
{
signal(SIGUSR1,manejador);
printf("padre: %d liberado.\n",getpid());
fflush(stdout);
exit(0);

}
return 0;
}

+1
0
-1
Imagen de slap
+1
0
-1

printf("hijo %d creado\n",getpid());
printf("Hijo: %d liberado.\n",getpid());

¿liberado?

signal(SIGUSR1,manejador);
printf("padre: %d liberado.\n",getpid());

Aquí estás asignando un manejador para la señal SIGUSR1 al padre, pero si el padre a continuación acaba, nunca recibirá la señal.

Tienes que hacerlo esperar la señal con pause().
Mira cómo está hecho en el post que te puse anteriormente.

También tienes información en este enlace [1].
Saludos.
----
Slap

+1
0
-1

Saludos.

0000 start out (+FD),A
           ld  BC, +7FFF
           jp 03CB, RAM-CHECK

http://www.injiniero.es

Imagen de fede89
+1
0
-1

los printf no van ya se me equivoque. el tema es que donde va el pause???
el enlace lo vi pero mucho no lo entiendo el programa de verdad es este:

#include
#include
#include
#include
#include
#include
#include
#include
FILE *arch;
void manejador (int sig_num);
void manejapadre (int sig_num);
void manejapadre2 (int sig);
void manejador (int sig_num)
{
int condicion;
wait(&condicion);
printf("Aviso que termino el hijo\n");
};

void manejapadre (int sig_num)
{
printf("Aviso que el archivo esta\n");
}

void manejapadre2 (int sig){ // Manejador para el nieto
printf("padre recibe señal: %d de ???.\n",sig);
fflush(stdout);
}

int main()
{
int pid = 0, nieto=0, padre=0;
signal(SIGCHLD,manejador);
signal(SIGUSR1,manejapadre);
signal(SIGUSR2,manejapadre2);
if ((pid = fork()) == -1)
{
printf("Error al crear proceso hijo\n");
exit(1);
}
if (pid == 0) /* Proceso Hijo */
{
padre=getppid();
printf("mi pid(hijo) es es %d\n", getpid());
pid=getpid();
if ((nieto = fork()) == 0)/*proceso nieto*/
{
printf("mi pid(nieto) es es %d\n", getpid());
if((arch=fopen("/home/fede/uno.txt","w")))
{
fprintf(arch,"%d",getpid());
fclose(arch);
kill(padre,SIGUSR1);
printf("envia señal");
}
exit(1);
}
else
if(nieto==-1)
printf("error");
kill(pid,SIGUSR2);
exit(1);
}
else /* Proceso Padre */
{
printf("Padre: %d esperando.\n",getpid());
fflush(stdout);
pause();
printf("padre: %d liberado.\n",getpid());
fflush(stdout);
// exit(0);
}
exit(0);
return 0;
}
tira error ya nose como acomodarlo bien. la idea es que el nieto le mande una señal al padre cuando el archivo este listo. y que el hijo le mande al padre cuando quiera matar al nieto
como viste tengo un porblema con el manejo de señales si me podes ayudar seria grandioso

+1
0
-1
Imagen de slap
+1
0
-1

Tienes que poner un poquito de tu parte ¿no te parece?.

En el enlace que te puse hay un ejemplo muy clarito de donde va el pause(), además, te he dado otro enlace que te explica el manejo de señales y la sincronización de procesos. ¿Te los has leído? ¿Los has entendido?.

Si nos vuelves a poner el código y nos dice que te da error pero no dices ni qué error ni dónde se produce, no sé cómo quieres que te ayudemos.

Leete esto también cuando puedas: http://www.ubuntu-es.org/index.php?q=node/85232

Saludos.
----
Slap

+1
0
-1

Saludos.

0000 start out (+FD),A
           ld  BC, +7FFF
           jp 03CB, RAM-CHECK

http://www.injiniero.es

Imagen de joseluis
+1
0
-1

Como ya te ha dicho slap debes poner un poco de tu parte porque de lo contrario parecerá que lo único que te interesa es que te hagan los deberes, y seguro que no es esa tu intención ¿verdad?

el tema es que donde va el pause???

Teniendo en cuenta que slap te ha dicho Tienes que hacerlo esperar la señal con pause() (refiriendose al padre) no hay que pensar mucho para darse cuenta que el pause() lo tendrás que poner en la parte del código del padre ya que lo que te interesa es que sea este quien espera. Y dentro de la parte del código del padre, el lugar adecuado será antes de lo que tenga que hacer después de recibir la señal, pero como mínimo lo tendrás que poner antes del final del padre, más que nada porque si lo pones después no vas a conseguir mucho ¿no?.

tira error ya nose como acomodarlo bien. la idea es que el nieto le mande una señal al padre cuando el archivo este listo. y que el hijo le mande al padre cuando quiera matar al nieto

Pues con el código que has escrito difícilmente hará eso más que nada porque en tu código te falta el nieto porque sólo has hecho un padre y un hijo.

En resumen tu programa lo que debería hacer es:

  1. El programa principal (padre) crea un hijo y se queda meditando
  2. El hijo crea un nieto y se queda un rato sin hacer nada
  3. El nieto dejará un paquete (archivo) con su dirección (pid) y le enviará una señal al padre para que lo recoja
  4. El padre recibe la señal del nieto, recoge el paquete y se queda esperando.
  5. El hijo, cansado de su propio hijo (el nieto) le pide su padre que lo mate (le envía una señal) y se queda esperando
  6. El padre recibe la señal del hijo y mata al nieto y se queda esperando.
  7. El hijo se muere en cuanto el nieto es asesinado
  8. El padre se muere con la muerte de su hijo

Por tanto parece lógico pensar que el padre debería manejar dos señales, una del hijo y otra distinta del nieto. Además se tiene que asegurar de no poner en práctica la petición del hijo si el nieto aún no le ha informado de su pid, más que nada porque sin el pid del nieto difícilmente podrá matarlo.
Y además el orden en que deben morir los procesos debe ser primero el nieto (realmente es asesinado), luego el hijo (supongo que morirá por remordimientos) y finalmente el padre (esto empieza a parecerse a Hamlet), para esto tal vez te puede interesar también la función waitpid (ya sabes man waitpid) en lugar de pause.


Fdo. Forense asesino, Censor fundamentalista, Fustigador de novatos y Patético maleducado

+1
0
-1

Fdo. Forense asesino, Censor fundamentalista, Fustigador de novatos y Patético maleducado

Imagen de fede89
+1
0
-1

ahora entiendo un poco mas.ahora lo pruevo. lo que no entendi bien es como hago para que el hijo se quede haciendo nada.con un pause seria??

+1
0
-1
Imagen de joseluis
+1
0
-1

Si al hijo le pones un pause se quedará esperando hasta que reciba una señal que no es lo que tú pretendes.

Si te he puesto que el hijo se quede un rato esperando es para que no envíe inmediatamente la señal de matar al nieto, pero realmente no pasaría nada si envía la señal nada más crear al hijo porque es el padre el que debe controlar que no puede matar al nieto hasta que reciba las dos señales (la del hijo y la del nieto).

En cualquier caso si quieres hacer que el hijo espere un rato antes de enviar la señal puedes usar la función sleep que recibe como parámetros el número de segundos que quieres que esté sin hacer nada.

Lo que sí tienes que hacer en cualquier caso, es que cuando el hijo envíe la señal se quede esperando hasta que se muera su hijo (esto es lo que te dije de la función waitpid).


Fdo. Forense asesino, Censor fundamentalista, Fustigador de novatos y Patético maleducado

+1
0
-1

Fdo. Forense asesino, Censor fundamentalista, Fustigador de novatos y Patético maleducado

Imagen de fede89
+1
0
-1

pero en ves de waitpid yo lo hice con la señal SIDCHLD e hice un manejador para esa señal.
nose si es lo mismo.yo lo uso para que terminen 1ero los hijos que el padre.y el sleep como se mas o menos cuantos segundos quiero que este sin hacer nada. mi idea es que hasta que el padre reciva la señal, pero nose cuantos segunods tarda. hay alguna forma de saver cuantos segundos?? o mas o menos pones un valor?
desde ya muchas gracias

+1
0
-1
Imagen de joseluis
+1
0
-1

pero en ves de waitpid yo lo hice con la señal SIDCHLD e hice un manejador para esa señal.
nose si es lo mismo.

Yo diría que no es lo mismo. Al capturar la señal SIGCHLD lo único que haces es que si muere un hijo se ejecute la función manejadora pero siempre y cuando siga vivo el proceso padre, y me temo que eso no lo puedes garantizar, de hecho lo más probable es que el padre muera antes y por tanto no pueda capturar ninguna señal.

Realmente lo que tienes que hacer es obligar a que el padre se espere a que terminen sus hijos y para eso es para lo que te sirve la función waitpid (o wait).
Si el padre tuviera varios hijos (como en el ejemplo que tienes en el otro hilo) tendrías que poner un waitpid por cada uno de los pid de los hijos que tenga para asegurarte que el padre finaliza después de que todos sus hijos se mueran. En este último caso deberías guardarte los pid de los hijos en un array de enteros y antes del final meter el waitpid dentro de un bucle que se recorra ese array de pid, de esa forma sólo saldrá de ahí cuando todos sus hijos hayan muerto (habría que hacer algo similar para los hijos con los nietos).

y el sleep como se mas o menos cuantos segundos quiero que este sin hacer nada. mi idea es que hasta que el padre reciva la señal, pero nose cuantos segunods tarda.

Yo no usaría el sleep para esto porque aunque la señal tarde muy poco en llegar realmente no tienes por qué saber cuándo llegará. Lo que deberías hacer es que el padre controle las señales que ha recibido para que mate al nieto únicamente cuando haya recibido las dos señales (la del hijo diciendo que mate al nieto, y la del nieto informándole de su pid).


Fdo. Forense asesino, Censor fundamentalista, Fustigador de novatos y Patético maleducado

+1
0
-1

Fdo. Forense asesino, Censor fundamentalista, Fustigador de novatos y Patético maleducado

Imagen de fede89
+1
0
-1

muchas gracias por la ayuda. lo hize siguiendo tus pasos y me funciono. la verdad sos un grande, muchas gracias por todo me anda perfecto, despues si tengo otra duda consulto.

+1
0
-1