Signalhandling
-
mein Programm soll durch ein Signalhandling beendet werden wenn ctrl+c gedrückt wird.
allerdings sagt er das die bezeichner in der Methode nicht deklariert sidn weil die ja auch in anderen methoden aufgerufen werden und dann ja noch geschlossen werden sollen.wie geht das?
-
Moment - was für Bezeichner sind nicht deklariert ? Und was meinst du wenn du sagst dass die Bezeichner aufgerufen bzw. geschlossen werden ?
Nochmal verständlich bitte ich hab keine Ahnung was du meinst
-
Hallo,
also ich habe ein Programm und öffne darin mit öffne mit fopen und opendir
dateien bzw. ordner und greife auf den inhalt in einer endlosschleife zu.
Nun soll das Programm mit ctrl+c beendet werden also um dann den speicher wieder freizugeben muss ich ja ein Signalhandling machen.
aber dann sagt er in der funktion die aufgerufen wird wenn ctrl+c gedrückt wurde das die bezeichner für den speicher der reserviert wurde dort noch nicht deklariert wurden.ist das verständlicher? ich weiß halt nicht wie man das sonst machen kann.
-
daniev schrieb:
aber dann
Wann?
sagt er
Wer?
in der funktion die aufgerufen wird wenn ctrl+c gedrückt wurde das die bezeichner für den speicher der reserviert wurde dort noch nicht deklariert wurden.
Computer haben in der Regel recht, das wird wohl auch so sein.
ist das verständlicher? ich weiß halt nicht wie man das sonst machen kann.
Zeig einfach Code. Vermutlich ein Fehler deinerseits.
-
daniev schrieb:
Hallo,
also ich habe ein Programm und öffne darin mit öffne mit fopen und opendir
dateien bzw. ordner und greife auf den inhalt in einer endlosschleife zu.
Nun soll das Programm mit ctrl+c beendet werden also um dann den speicher wieder freizugeben muss ich ja ein Signalhandling machen.
aber dann sagt er in der funktion die aufgerufen wird wenn ctrl+c gedrückt wurde das die bezeichner für den speicher der reserviert wurde dort noch nicht deklariert wurden.ist das verständlicher? ich weiß halt nicht wie man das sonst machen kann.
Man kann an die Signalhandler (mit signal registriert) keine Daten im Voraus übergeben.
Für Aufräumarbeiten musst du daher irgend etwas global deklarieren.
Z.B. alle Zeiger in einer Struktur gekapselt. Das kann den Vorteil haben,
dass man im Code diese Zeiger nicht als Parameter in Funktionen durschleifen muss,
oder z.B. eine globale run Variable, die deiner Endlosschleife ein Ende macht.#include <signal.h> int run = 1; void sigfunc ( int sig ) { if ( sig == SIGINT ) run = 0; } int main ( void ) { signal ( SIGINT, sigfunc ); while ( run ) { puts ( "Mit STRG + C beenden" ); // ... } // ... Hier Aufräumfunktionen starten. return 0; }
-
Vorsicht du solltest run als volatile deklarieren
sonst könnte es sein daswhile(run)
zu
while(1)
optimiert wird
-
Hmm ... du meinst also, der Compiler 'merkt' nicht, dass sich der Wert der Variable in Zeile 8
ändern könnte oder das er, obwohl er es 'merkt', so frech sein könnte, diese einfach wegzuoptimieren?
Also wenn du mich fragst, das wäre schon ein ganz schön dicker Hund!
-
Der Compiler bekommt Zeile 8 schon mit aber die funktion wird in der while-schleife nicht aufgerufen also warum sollte sich run ändern??
Der Compiler hat keine Ahnung das es eine Unterbrechung geben könnte durch die run geändert wird, er geht davon aus das es nur einen thread gibt wobei alles schön nacheinander gemacht wird ohne Unterbrechungen wie zB ein Signal.
Und auf Basis dieser Annahme wird der Code auch optimiert.Der dicke Hund kann dir ordentlich in die ei** beissen wenn du nicht aufpasst.
-
Okay,
Hab hier http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_21.html#SEC352 etwas darüber gefunden, die Variable sollte auch atomic sein.volatile sig_atomic_t run = 1;