best practice bei Signalen
Von: Markus Wichmann (nullplan@gmx.net) [Profil]
Datum: 10.04.2009 13:02
Message-ID: <slrngtu9q8.4cv.nullplan@voyager.wichi.de.vu>
Newsgroup: de.comp.os.unix.programming
Datum: 10.04.2009 13:02
Message-ID: <slrngtu9q8.4cv.nullplan@voyager.wichi.de.vu>
Newsgroup: de.comp.os.unix.programming
Hi all, ich habe schon bei Google nach allem Möglichen gesucht, aber ich habe nix richtiges gefunden: Wie soll sich eine Anwendung bei Signalen verhalten, die es nicht kennt? Hintergrund ist, dass ich gerade bei audacious bemerkt habe, dass es zusammenbricht, wenn es ein SIGHUP abbekommt. Dabei ist ein SIGHUP doch für audacious ungefährlich, schließlich ist es eine X11-Anwendung und als solche in ihrer Funktion nicht von einem Terminal abhängig. Nun habe ich mir mal den Quelltext von audacious angesehen und fragte mich, ob so eine Implementierung nicht eigentlich in die Schublade "Herr, vergib ihnen, denn sie wissen nicht, was sie tun!" gehört: Audacious hat sich einen eigenen Signlhandler gebastelt: Man nehme - einen eigenen Thread - ein sigset, in das nur rein kommt, welche Signale behandelt werden sollen - eine Endlosschleife - sigwait() - und ein switch/case Also richtig ekelhaft. Nun wollte ich wissen, ob das irgendwelche Vorteile gegenüber der guten alten Registrierung von Signalhandlern mittels signal() oder sigaction() hat. Aber BTT: Wie soll sich eine Anwendung uninteressanten Signalen gegenüber verhalten? Ignorieren klingt gut, aber wie geht das halbwegs portabel? Ich meine, C99 definiert ein paar wenige Signale, SUSv3 schon wesentlich mehr und beide Standards lassen noch implementierungsabhängige Signale zu. Spontan klingt da die Geschichte mit sigset_t nicht schlecht, weil es dafür die Funktion sigfillset() gibt, die wirklich _alle_ Signale erfasst. Ich dachte jetzt an folgendes: - ein sigset_t erstellen, in dem alle Signale drinstehen, die mich nicht ineressieren - diese Signale ignorieren Nur fehlt leider irgendwie das Mittelstück: Es gibt keine Funktion, die alle Elemente eines sigset_t ignoriert. Ich kann die Signale nur blockieren, was bedeutet, dass ich sie in eine Warteschlange stelle, die im Laufe des Betriebes immer länger wird. Außerdem gibt es ein paar undefinierte Verhaltensweisen, wenn bestimmte Signale ankommen, während sie blockiert sind. Schlussendlich wäre also eine Möglichkeit gefragt, über wirklich alle Signale, die die Platform bereitstellt, zu iterieren. Wenn das geht, möglichst portabel, dann hätte ich ein paar Probleme weniger. Es bleibt die Frage, ob es überhaupt gut ist, diese Signale einfach zu ignorieren. Oder gibt es ein paar Signale, die man immer behandeln sollte, oder so? Tschö, Markus -- GUI - ein Hintergrundbild und zwölf XTerms vim -c "exec \"norm iwHFG#NABGURE#IVZ#UNPXRE\"|%s/#/ /g|norm g??g~~"[ Auf dieses Posting antworten ]
Antworten
- Juergen Ilse (10.04.2009 17:01)
- Rainer Weikusat (11.04.2009 11:54)
- Frank Mertens (27.04.2009 20:44)
- Rainer Weikusat (28.04.2009 19:03)
- Frank Mertens (29.04.2009 03:33)
