variablen an signal handler übergeben
-
hallo leute!
system: redhat linux 9
programmiersprache cich möchte gerne meine programme mit einem kill(pid,SIG) beenden. bevor nun mein programm sich verabschiedet soll es noch aufräumarbeiten erledigen. dazu muss ich dem signal handler aber variablen übergeben, welche ich in main() benutze, (beispiel siehe unten) die ich nicht umbedingt global anlegen möchte.
ich kenne nur folgende vorgehensweise für signale, hier kann ich aber keine variable von main nach catch_sig.void catch_sig()
{
free(z); (nice to have)
exit(0);
}int main()
{
char *z
signal(SIG, catch_SIG);
...
allokiere speicher für z;
...
}ich wäre sehr dankbar für hilfe.
-
Du kannst im Signalhandler nur Variablen den Typs sig_atomic_t, die AFAIK auch noch volatile sein müssen, verwenden. Mit anderen Worten, vergiß es, das macht man anders.
-
wie macht es denn anders?
-
Bashar schrieb:
Du kannst im Signalhandler nur Variablen den Typs sig_atomic_t, die AFAIK auch noch volatile sein müssen, verwenden.
was heißt "verwenden"? Ist folgendes nicht korrekt?
bool done; void handler() { done = true;}
-
nö, weil die signal-Signal Händler ein int als Parameter erwarten :p
aber mal im ernst. free ist unnötig, da es automatisch gemacht wird.
Aber vielleicht lohnt sich in einem C++ Programm folgendes, damit auch ggf. Transaktionen oder so verfollständigt werden und alle dtoren schön aufgerufen werden
class signal_exception { int sig; public: signal_exception(int s) : sig(s) { } int what() const { return sig; } }; void handler(int sig) { throw signal_exception(sig); } int main() { signal(SIGTRM,handler); //weitere signale ... try { //... } catch(signal_exception &e) { //... } }
-
kingruedi schrieb:
nö, weil die signal-Signal Händler ein int als Parameter erwarten
So gehts aber auch :p (jedenfalls in C, oder ist das eine gcc-Eigenart?)
Aber vielleicht lohnt sich in einem C++ Programm folgendes, damit auch ggf. Transaktionen oder so
verfollständigt werden und alle dtoren schön aufgerufen werdenDu meinst das geht gut? Hmm...
-
Du meinst das geht gut? Hmm...
warum sollte das nicht gut gehen?
-
Ich habe ehrlich gesagt keine Ahnung, was da dann überhaupt passiert. Sah nur so gefährlich aus.
In der signal-Manpage gibts da noch diese Bemerkung, über sichere und unsichere Funktionen. Wenn man aber erstmal im catch-Block ist, will man darauf ja nicht mehr achten müssen.Aber laut google, war meine Vermutung richtig:
http://www.google.de/search?hl=de&ie=UTF-8&oe=UTF-8&q=c%2B%2B+exception+signalhandler&btnG=Suche&meta=
-
hmm, dann besser kein throw. Schade, wär zu einfach gewesen
-
DrGreenthumb: OK, das Bestehen auf sig_atomic_t ist ziemlich pedantisch. Normalerweise wird das wohl der größte Typ sein, der atomar verarbeitet werden kann (also eine Größe entsprechend der Maschinenwortbreite haben). Kleinere Typen dürften dann kein Problem darstellen.
Dein bool sollte aber trotzdem volatile deklariert sein. Wer garantiert dir sonst, dass die Schleife, die durch done kontrolliert wird, die Änderung überhaupt bemerkt?
-
jo, das stimmt wohl. Hatte zwar bisher keine Probleme derart, aber man muss es ja nicht drauf ankommen lassen