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
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
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
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;
}
- 1. È possibile ignorare ThreadAbortException?
- 2. È possibile intercettare/ignorare tutti gli eventi click nella pagina?
- 3. Express: è possibile ignorare le sessioni per i file statici?
- 4. Come bloccare tutti i SEGNALI nel thread SENZA usare SIGWAIT?
- 5. Come ignorare gestore dei segnali di componente superclasse
- 6. Come monitorare i segnali QT?
- 7. È possibile acquisire/ricevere segnali IR in un'applicazione Android?
- 8. Segnali e segnali POSIX
- 9. È possibile richiamare Java 5 per ignorare gli errori @Override?
- 10. Ignorare i file dall'APK Android
- 11. È possibile installare tutti i moduli mancanti per un'applicazione nodo?
- 12. È possibile sostituire tutti i cicli "for" con un'istruzione LINQ?
- 13. È possibile trovare tutti i moduli che implementano determinati protocolli?
- 14. È possibile accedere a tutti i beacon con l'API ibeacon?
- 15. Come rendere mercuriale ignorare tutti i file nascosti?
- 16. Attività Concat Grunt, come ignorare tutti i file .min.js?
- 17. hgignore: è necessario ignorare tutti tranne uno .lib file
- 18. Come monitorare i segnali emessi in QT?
- 19. Disabilitare i segnali all'inizializzazione LLDB
- 20. I segnali Qt possono restituire un valore?
- 21. È possibile ignorare il valore iniziale per un oggetto ReactiveObject?
- 22. È possibile ignorare in modo permanente un ramo remoto?
- 23. Posso impostare un singolo gestore di segnale per tutti i segnali in Perl?
- 24. Posso attivare manualmente i segnali in Django?
- 25. Django: A cosa servono esattamente i segnali?
- 26. Come plottare i fasori dei segnali?
- 27. È possibile ignorare/escludere file/cartella da .editorconfig?
- 28. Tartaruga - è possibile ignorare la nuova cartella prima di eseguirla?
- 29. È possibile ignorare il caso usando xpath e C#?
- 30. Come si intercettano i segnali in PowerShell?
prega, mai dimenticare di controllare i valori di ritorno. Ho saltato quella parte per brevità. – C2H5OH
... non SIGABRT o SIGSEGV, suppongo. –
@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