Sono nuovo alla gestione dei segnali in Unix tramite C e ho esaminato alcuni tutorial su di esso (per puro interesse).Un programma C può continuare l'esecuzione dopo che un segnale è stato gestito?
Le mie domande sono, è possibile continuare l'esecuzione di un programma oltre il punto in cui viene gestito un segnale?
Capisco che la funzione di gestione del segnale esegue la pulizia ma, nello spirito di gestione delle eccezioni (come in C++), è possibile che quel segnale sia gestito nello stesso modo e che il programma continui a funzionare normalmente?
Al momento catch
passa in un ciclo infinito (presumibilmente un modo per uscire sarebbe chiamare exit(1)
).
La mia intenzione è che b
venga assegnato 1 e che il programma termini con grazia (se ciò è ovviamente possibile).
Ecco il mio codice:
#include <signal.h>
#include <stdio.h>
int a = 5;
int b = 0;
void catch(int sig)
{
printf("Caught the signal, will handle it now\n");
b = 1;
}
int main(void)
{
signal(SIGFPE, catch);
int c = a/b;
return 0;
}
Inoltre, come C è procedurale, come mai il gestore di segnale dichiarato prima della dichiarazione incriminata è effettivamente chiamato dopo che quest'ultimo ha eseguito?
Infine, per fare in modo che la funzione di gestione esegua correttamente la pulizia, tutte le variabili di quelle da pulire in caso di eccezione devono essere dichiarate prima della funzione, giusto?
Grazie in anticipo per le vostre risposte e scuse se alcune delle precedenti sono molto ovvie.
Caso di utilizzo comune: molti processi (daemon) possono gestire un segnale 'SIGHUP' che li fa caricare nuovamente il file di configurazione. –