Tengo una aplicación de servidor que deseo proteger de ser detenida por cualquier señal que pueda ignorar. ¿Hay alguna manera de ignorar todas las señales posibles a la vez, sin configurarlas una por una?¿Es posible ignorar todas las señales?
Respuesta
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
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
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;
}
- 1. NUnit ignorar todas las pruebas
- 2. Python - trampa de todas las señales
- 3. ¿es posible ignorar las reglas .gitignore en el subdirectorio?
- 4. Ignorar SVN ¿ignorar ... posible?
- 5. ¿Es posible ignorar ciertas pruebas unitarias?
- 6. ¿es posible imprimir todas las reducciones en Haskell usando WinHugs?
- 7. ¿Es posible enumerar todas las variables globales en PHP?
- 8. ¿Es posible obtener todas las subclases de una clase?
- 9. ¿Es posible eliminar todas las variables de sesión, excepto algunas?
- 10. Ignorar todas las advertencias en un proyecto de Eclipse
- 11. Cómo rastrear las señales emitidas en QT?
- 12. Tortuga: ¿es posible ignorar la nueva carpeta antes de enviarla?
- 13. ¿Es posible eliminar las cookies del subdominio?
- 14. ¿Puedo establecer un solo manejador de señal para todas las señales en Perl?
- 15. ¿Es posible ignorar caso usando xpath y C#?
- 16. ¿Cómo bloquear todas las SEÑALES en el hilo SIN usar SIGWAIT?
- 17. ¿Cómo atrapo las señales en PowerShell?
- 18. Ignorar permanentemente las advertencias
- 19. ¿Cómo interceptar TODAS las señales emitidas por un evento determinado en Qt?
- 20. Django: ¿Para qué sirven exactamente las señales?
- 21. Extendiendo django-registration usando las señales
- 22. ¿Es posible reemplazar el "operador new() global" en todas partes?
- 23. ¿Es posible sobrescribir (forzar) siempre los cambios locales al actualizar desde SVN? Ignorar conflictos?
- 24. ¿Es posible en Ghostscript para añadir marca de agua a todas las páginas en PDF
- 25. ¿Es posible iterar sobre todas las clases dentro de un paquete con Reflection?
- 26. ¿Es posible deshabilitar todas las funciones de desplazamiento y acercamiento en una vista web de Android?
- 27. ¿Es posible generar alguna o todas las variables disponibles en un archivo .htaccess?
- 28. ¿Es posible crear una fila que abarque todas las columnas de una matriz en SSRS 2008?
- 29. ¿Es posible encontrar todas las clases anotadas con @MyAnnotation usando un GWT GeneratorContext?
- 30. Es posible capturar todas las llamadas al selector y redirigirlas en tiempo de ejecución
Por favor, nunca olvide comprobar los valores de devolución. Me salté esa parte por brevedad. – C2H5OH
... ni SIGABRT o SIGSEGV, supongo. –
@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