Enviar Respuesta  Enviar Tema 
Problema captando y tratando señales.
Autor Mensaje
eugenioclrc
Usuario PL


Mensajes: 2
Grupo: Registrado
Registro en: Sep 2007
Estado: Sin Conexión
Reputación: 0
Mensaje: #1
Question  Problema captando y tratando señales.

Hola a todos!

Apelo a la sabiduria de ustedes para ver si me ayudan a resolver el siguiente problemita.

Bien, digamos que tengo un vector de tipo int llamado televisores, que tiene un numero, 0 si el tele esta apagado y 1 si el tele esta prendido.

Mi meta es que un proceso hijo, que hereda esta matriz del padre, modifique el estado de uno o mas televisores, y que el padre se "entere" de las modificaciones, y por lo tanto actualice su vector de televisores.

Para lograr todo esto creo que deberia usar señales y pipes, mediante el pipe transfiero la informacion necesaria del proceso hijo al proceso padre, y por señales le aviso al padre que deberia leer del pipe para saber que datos modificar y cual sera el nuevo estado.

El "protocolo" con el que se leera del pipe el numero de vector a modificar y el nuevo estado, por ejemplo, si quisiera avisar que prendi el televisor numero 5, mediante el pipe mandaria 5-1

Hasta ahora parece facil, pero se me complica a la hora de atender la señal, puesto que no encontre la forma de que un manipulador de señales reciba varios argumentos, en esta caso necesita recibir el vector de televisores para ser modificado y el descriptor del pipe.

A continuacion les pego el codigo que uso;

******************************
******************************
******************************

#include <stdio.h>
#include <signal.h>

typedef void (*funcPtr)();

void cambiarEstado( int **televisores,int *descriptorPipe )
{
//lee desde el descriptorPipe
//obtiene el numero de vector a modificar y el nuevo estado
//modifica el vector y listo

}


int main()
{
int televisores[10],descriptorPipe[2],i,pidPadre;

//iniciamos los televisores como apagados
for(i=0; i<10; i++)
televisores[i]=0;

//cargamos el controlador de señal
signal( 12 , (funcPtr)cambiarEstado(&televisores,descriptorPipe));


//creamos un nuevo proceso
if (!fork())
{

//obtenemos pids para usar en señales entre ads padre y ads hijo
pidPadre=getppid();

//prendemos un televisor
FILE *stream;
stream = fdopen (descriptorPipe[1], "w");
fprintf (stream, "%d-%d",5,1);
fclose (stream);

//mandamos la señal indicando que prendimos un tele y es necesario actualizar la matriz
kill(pidPadre, 12);
}

for(i=0; i<10; i++)
printf("televisor %d, estado: %d\n",i,televisores[i]);


}

******************************
******************************
******************************

Si algun alma bondadosa podria guiarme se lo agradeceria.

Saludos, Eugenio

09-26-2007 04:37 PM
Encuentra todos los mensajes de este usuario Cita este mensaje en tu respuesta
Enviar Respuesta  Enviar Tema 

Ver la Versión para Impresión
Mandar este Tema a algún Amigo
Subscríbete a este Tema | Agrega este Tema a Tus Favoritos

Salto de Foro: