Jestem nowy w obsłudze sygnałów w systemie Unix przez C i szukałem na nim kilku tutoriali (z czystego zainteresowania).Czy program C może kontynuować wykonywanie po odebraniu sygnału?
Moje pytanie brzmi, czy możliwe jest kontynuowanie programu po przekroczeniu punktu, w którym sygnał jest obsługiwany?
Rozumiem, że funkcja obsługi sygnału wykonuje czyszczenie, ale w duchu obsługi wyjątków (np. W C++), czy jest możliwe, aby ten sygnał był obsługiwany w ten sam sposób i aby program działał normalnie?
W tej chwili catch
przechodzi w nieskończoną pętlę (prawdopodobnie sposobem na zakończenie byłoby wywołanie exit(1)
).
Moim zamiarem będzie przypisanie numeru b
1 i ukończenie programu z wdziękiem (o ile to oczywiście możliwe).
Oto mój kod:
#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;
}
Ponadto, jak C jest proceduralny, jak przychodzą obsługi sygnału zadeklarowane przed rachunku naruszającego jest faktycznie nazywa po tym jak została wykonana?
Na koniec, aby funkcja obsługi mogła prawidłowo przeprowadzić czyszczenie, wszystkie zmienne, które nie wymagają czyszczenia w przypadku wyjątku, muszą być zadeklarowane przed funkcją, prawda?
Z góry dziękuję za odpowiedzi i przeprosiny, jeśli niektóre z powyższych są bardzo oczywiste.
Wspólny przypadek użycia: wiele procesów (demonów) może obsłużyć sygnał 'SIGHUP', który powoduje, że ponownie ładują plik konfiguracyjny. –