nntp2http.com
Posting
Suche
Optionen
Hilfe & Kontakt

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
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