2011-02-25 26 views
8
struct sigaction psa; 

He permitido que mi manejador de la señal en la función principal como se muestra a continuación:Habilitar un manejador de señales usando sigaction en C

memset (&psa, 0, sizeof (psa)); 
    psa.sa_handler = pSigHandler; 
    sigaction (SIGALRM, &psa, NULL); 
    sigaction(SIGVTALRM, &psa, NULL); 
    sigaction(SIGPROF, &psa, NULL); 

Mi manejador de la señal es la siguiente:

static void pSigHandler(int signo){ 
    printf("Pareint signum: %d", signo);// debug 
    switch (signo) { 
     case SIGALRM: 
      printf("P SIGALRM handler");//debug 
      break; 
     case SIGVTALRM: 
      printf("P SIGVTALRM handler");//debug 
      break; 
     case SIGPROF: 
      printf("P SIGPROF handler");//debug 
      break; 
     default: /*Should never get this case*/ 
      break; 
    } 
    return; 
} 

Ahora mi pregunta puede ser obvia para algunas personas, ¿por qué no veo las líneas de depuración impresas cuando ejecuto esto? De hecho, nada fue impreso. Muchas gracias por ayudarme a entender esto. Lo estoy ejecutando en Linux, utilicé Eclipse para programar.

Respuesta

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

static void pSigHandler(int signo){ 
    switch (signo) { 
      case SIGTSTP: 
      printf("TSTP"); 
      fflush(stdout); 
      break; 
    } 
} 

int main(void) 
{ 
    struct sigaction psa; 
    psa.sa_handler = pSigHandler; 
    sigaction(SIGTSTP, &psa, NULL); 
    for(;;) {} 
    return 0; 
} 

Porque necesita fflush (stdout)

tratar con el C-z

Ni siquiera estoy seguro de si es seguro de usar stdio en un manejador de señales embargo.

Actualización: http://bytes.com/topic/c/answers/440109-signal-handler-sigsegv

De acuerdo a ese enlace, usted no debe hacer esto.

+0

He intentado agregar fflush (stdout); Todavía no imprimí nada, Comenté otros códigos en mi programa, por lo que se ve más o menos lo mismo que arriba, simplemente sin el bucle infinito. ¿Algunas ideas? Gracias Tom. – txs

+0

En mi ejemplo de código, fflush hace la diferencia entre imprimir o no. Creo que tal vez la aplicación no está recibiendo tus señales? ¿Has probado el mío? Creo que esto podría ser un comportamiento indefinido de todos modos, el enlace que puse en la parte inferior tiene algo de información que explica que se supone que debes hacer ciertas cosas allí ... Debe estar en los documentos de tu sistema. –

+0

También menciona que eliminó el bucle infinito --- Si no está allí, el código se cerrará y los controladores de señal desaparecerán ... Debe bloquear y esperar las señales ... –