Estoy jugando con las bibliotecas signal.h y unistd.h y tengo algunos problemas. En el siguiente código, cuando envío la señal SIGINT a mi programa en ejecución llamando a CTRL-C , la señal es captada. Sin embargo, al presionar CTRL-C nuevamente, el programa finaliza. Según tengo entendido, la declaración de impresión "Received signal 2" debe imprimirse cada vez que presiono CTRL-C .
¿Mi comprensión de esta señal es incorrecta o hay un error en mi código?
¡Gracias por tu contribución!
#include "handle_signals.h" void sig_handler(int signum) { printf("\nReceived signal %d\n", signum); } int main() { signal(SIGINT, sig_handler); while(1) { sleep(1); } return 0; }Salida terminal:
xxx@ubuntu:~/Dropbox/xxx/handle_signals$ ./handle_signals ^C Received signal 2 ^C xxx@ubuntu:~/Dropbox/xxx/handle_signals$Editar: aquí está el encabezado que he incluido
#include <stdio.h> #include <stdlib.h> #include <signal.h> #include <unistd.h> void sig_handler(int signum);Gracias por sus respuestas. ¡Leyendo a través de ellos ahora!
No uses signal , usa sigaction :
El comportamiento de la señal () varía según las versiones de UNIX y también ha variado históricamente entre las diferentes versiones de Linux. Evite su uso: use sigaction(2) en su lugar.
http://man7.org/linux/man-pages/man2/signal.2.html
En los sistemas UNIX originales, cuando la entrega de una señal invocaba un controlador que se establecía mediante signal(), la disposición de la señal se restablecía a SIG_DFL y el sistema no bloqueaba la entrega de más instancias de la señal.
Linux implementa la misma semántica: el controlador se restablece cuando se entrega la señal.
El comportamiento de signal al recibir la primera señal varía según la implementación. Por lo general, requiere reinstalar el controlador después de recibir la señal, ya que el controlador se restablece a su acción predeterminada:
void sig_handler(int signum) { signal(SIGINT, sig_handler); printf("\nReceived signal %d\n", signum); } que es una de las razones por las que ya no debería usar signal y usar sigaction . Puede ver un ejemplo básico del uso de sigaction aquí.