2012-04-06 24 views

Respuesta

12

Sí:

#include <signal.h> 

sigset_t mask; 
sigfillset(&mask); 
sigprocmask(SIG_SETMASK, &mask, NULL); 

Esto no significa exactamente ignorar las señales, pero los bloquea; que en la práctica es el mismo efecto.

Supongo que no es necesario mencionar que SIGKILL y SIGSTOP no se pueden bloquear ni ignorar de ninguna manera.

Para la semántica más detallados, como las reglas de herencia máscara y similares, check the man page

+1

Por favor, nunca olvide comprobar los valores de devolución. Me salté esa parte por brevedad. – C2H5OH

+0

... ni SIGABRT o SIGSEGV, supongo. –

+1

@KerrekSB: En realidad puedes atrapar SIGSEGV y SIGBUS, así que supongo que también puedes ignorarlos. Por su cuenta, por supuesto. La página del manual [signal (7)] (http://www.kernel.org/doc/man-pages/online/pages/man7/signal.7.html) solo menciona 'SIGSTOP' y' SIGKILL'. – C2H5OH

8

señales de bloqueo no es lo mismo que haciendo caso omiso de ellos.

Cuando bloquea señales como sugiere C2H5OH, se agrega a una cola de señal pendiente y se entregará al proceso tan pronto como la desbloquee.

de desbloqueo se puede hacer usando

#include <signal.h> 

sigset_t mask; 
sigemptyset(&mask); 
sigprocmask(SIG_SETMASK, &mask, NULL); 

Para responder a su pregunta sobre cómo hacer caso omiso de las señales, que tiene que ser manejado por un controlador de señal que es una función definida por el usuario que se ejecuta cada vez que se produzca una señal de el proceso

static void foo (int bar) 
{ 
    /*some code here. In your case, nothing*/ 
} 

continuación, registrar esta función mediante el uso de

signal(SIGINT,foo); //or whatever signal you want to ignore 

Si desea ignorar todas las señales

int i; 
for(i = 1; i <=31 ; i++) 
{ 
    signal(i,foo); 
} 

Este código se llevará a todas las señales entregadas al proceso y los ignore en lugar de bloquearlos.

NOTA: Según las páginas man, no es la manera recomendada, en su lugar se recomienda sigaction. Verifique hombre sigaction

2

Las soluciones basadas en sigprocmask() y pthread_sigmask() no me han funcionado. Esto es lo que encontré para trabajar:

#include <signal.h> 
#include <unistd.h> 
#include <assert.h> 
int main() { 
    struct sigaction act; 
    act.sa_handler = SIG_IGN; 
    for(int i = 1 ; i < 65 ; i++) { 
     printf("i = %d\n", i); 
     // 9 and 19 cannot be caught or ignored                          
     // 32 and 33 do not exist                              
     if((i != SIGKILL) && (i != SIGSTOP) && (i != 32) && (i != 33)) { 
      assert(sigaction(i, &act, NULL) == 0); 
     } 
    } 
    sleep(10000); 
    return 0; 
} 
Cuestiones relacionadas