2012-04-06 20 views
9

Ho un'applicazione server che desidero proteggere dall'arresto di qualsiasi segnale che posso ignorare. C'è un modo per ignorare tutti i possibili segnali contemporaneamente, senza impostarli uno per uno?È possibile ignorare tutti i segnali?

risposta

12

Sì:

#include <signal.h> 

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

Questo non è esattamente ignora i segnali, ma li blocca; che in pratica è lo stesso effetto.

Suppongo che non sia necessario menzionare che SIGKILL e SIGSTOP non possono essere bloccati né ignorati in alcun modo.

Per semantica più dettagliate, come regole di ereditarietà maschera e simili, check the man page

+1

prega, mai dimenticare di controllare i valori di ritorno. Ho saltato quella parte per brevità. – C2H5OH

+0

... non SIGABRT o SIGSEGV, suppongo. –

+1

@KerrekSB: puoi effettivamente catturare SIGSEGV e SIGBUS, quindi credo che tu possa ignorarli anche tu. A proprio rischio, ovviamente. La pagina man [signal (7)] (http://www.kernel.org/doc/man-pages/online/pages/man7/signal.7.html) menziona solo 'SIGSTOP' e' SIGKILL'. – C2H5OH

8

segnali blocco non è la stessa di loro ignorare.

Quando si bloccano i segnali come suggerito da C2H5OH, questo viene aggiunto a una coda di segnale in attesa e verrà consegnato al processo non appena lo si sblocca.

sblocco può essere fatto utilizzando

#include <signal.h> 

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

Per rispondere alla tua domanda su come ignorare i segnali, deve essere gestito da un gestore di segnale che è una funzione definita dall'utente che esegue ogni volta che un segnale viene consegnato al il processo

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

quindi registrare questa funzione utilizzando

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

Se si desidera ignorare tutti i segnali

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

Questo codice prendere tutti i segnali forniti al processo e ignorarli, invece di bloccarli.

NOTA: In base alle pagine man, non è il metodo consigliato, ma è consigliata la sigaction. Do check out sigaction

2

Le soluzioni basate su sigprocmask() e pthread_sigmask() non hanno funzionato per me. Ecco cosa ho trovato a lavorare:

#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; 
} 
Problemi correlati