Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Tha_Traker en 17 Agosto 2010, 00:15 am



Título: Manejo de Señales en Linux(resuelto)
Publicado por: Tha_Traker en 17 Agosto 2010, 00:15 am
Hola todo el mundo,
me he estado machacando buscando información sobre señales por google, pero lo que encuentro esta siempre a medias y no me explica como usar las señales y sus funcione.

Basicamente lo que me gustaria saber es que hacen y como se usan ciertas señales en c.
La funciones que tengo que usar son:
1-sigqueue (no me queda claro para que sirve la variable sig).
2-sigaction ( he leido que se pueden enviar datos con esta, aunque tampoco entiendo como)
3-sigwaitinfo(entiendo que es para esperar la señal pero la variables nose como se usan).
4-sigemptyset ( Para que sirven los sets?)
5-sigaddset
6-sigprocmask (Para que sirven la mascaras?)

También he visto que para usar ciertas variables de las funciones se han de declarar estructuras he inicializar no se que cosas.
Llevo toda la tarde leyendo paginas con ejemplos raros que no hacen nada y no encuentro nada que tenga una función util o que explique como se usa de verdad cada función. Espero que alguien tenga un momento para explicarme como funcionan, aunque sean algunas, o por lo menos recomendarme alguna página donde tengan información sobre como se usan.

Para lo que necesito estas funciones es para comunicar dos procesos, el main con un hijo creado con fork y ejecutando execlp para ejecutar al hijo. Solo necesito enviar una variable al otro proceso y matarlo cuando transcurra un tiempo.

Espero que alguién me pueda echar un cable, si hace falta mas información estare pendiente del post así que diganme y lo cuelgo cuanto antes.

Un saludo


Título: Re: Manejo de Señales en Linux
Publicado por: GroK en 17 Agosto 2010, 00:49 am
Hola,

Quizas este documento te ayude:

http://www.4shared.com/document/03TDOS9e/apuntessig.html

Saludos


Título: Re: Manejo de Señales en Linux
Publicado por: Tha_Traker en 17 Agosto 2010, 01:07 am
Tiene buena pinta y contiene todas las funciones. Mañana le echo un vistazo que me voy a sobar ahora. Lo único malo esque es otra vez un montón de tecnicismos, a ver si alguien me lo puede explicar en pocas palabras.
 Mil gracias Grok


Título: Re: Manejo de Señales en Linux
Publicado por: Littlehorse en 17 Agosto 2010, 02:42 am
Creo que lo principal para que comprendas que hace cada función es que leas la documentación correspondiente (hay demasiada) y algún libro sobre manejo de señales.
El problema sobre responder cada duda es que no te podemos explicar que hace cada parámetro de cada función porque seria demasiado largo, igualmente creo que preguntaste dos cosas que si vale la pena responder, porque a lo mejor no lo vas a encontrar en la documentación de determinada función.

Un set, en este caso el tipo de dato sigset_t, es una estructura que se utiliza con las funciones de manejo de señales, en este caso, para especificar cuales son las señales involucradas.
En cuanto a las mascaras, cada proceso contiene una mascara de señales, que especifica cuales están permitidas y cuales no, es decir, para bloquear u desbloquear grupos enteros de señales. En cada envió se chequea si la señal esta permitida en la mascara del proceso.

En cuanto a lo demás, bueno, te dejo estos links a ver si junto con lo que te paso GroK sacas algo en limpio, pero lo que te recomiendo es que trates de buscar algún libro ya que suelen explicar un poco mas desde el lado de la teoría, y creo que es eso lo que estas buscando.

SIGNAL (http://www.helsinki.fi/atk/unix/dec_manuals/DOC_40D/APS33DTE/DOCU_006.HTM)
Signal (Computing) (http://en.wikipedia.org/wiki/Signal_%28computing%29#Sending_signals)
Signal (2) (http://www.win.tue.nl/~aeb/linux/lk/lk-5.html)

Saludos


Título: Re: Manejo de Señales en Linux
Publicado por: Tha_Traker en 17 Agosto 2010, 12:58 pm
Me estoy haciendo un lio de cojones. A ver:

Código:
    //Declaración de señales
        //Declaramos una estructua action y un handler info
        struct sigaction action;
        void info();
        //Inicializamos la nueva estructura a cero
        sigemptyset(&newmask);
        //Asignamos el bit correspondiente a KILL_CHILD
        sigaadset(&newmask,KILL_CHILD);
        //Asignamos SIG_KILL y la bloqueamos
        sigpromask(SIG_BLOCK,&newmask,&oldmask);
       
        action.sa_flags=0;
        action.sa_handler=info;
        //
            if (sigaction(KILL_CHILD, &action, NULL) == -1)
            {
                printf("Sistema operativo cerrando");
                exit(0);
            }
       

Todo esto es para que cuando llegue la señal KILL_CHILD el proceso muera no??