Was passiert unter Linux, wenn ein Programm (das möglicherweise mehrere Threads hat) ein Signal wie SIGTERM oder SIGHUP empfängt?
Welcher Thread fängt das Signal ab? Können mehrere Threads das gleiche Signal erhalten? Gibt es einen speziellen Thread, der ausschließlich dem Umgang mit Signalen gewidmet ist? Wenn nicht, was passiert innerhalb des Threads, der das Signal verarbeiten soll? Wie wird die Ausführung fortgesetzt, nachdem die Signalhandler-Routine beendet ist?
pthreads(7)
beschreibt, dass POSIX.1 alle Threads in einem Prozess erfordert, die Attribute gemeinsam nutzen, einschließlich:POSIX.1 erfordert auch einige Attribute sein verschieden für jeden Thread, einschließlich:
Signalmaske (
pthread_sigmask(3)
)alternativer Signalstapel (
sigaltstack(2)
)Die
complete_signal
Routine des Linux-Kernels hat den folgenden Codeblock - die Kommentare sind sehr nützlich:Sie sehen also, dass Sie dafür verantwortlich sind, wohin die Signale geliefert werden:
Wenn Ihr Prozess die Disposition eines Signals auf
SIG_IGN
oder gesetzt hatSIG_DFL
, wird das Signal für alle Threads ignoriert (oder standardmäßig - töten, kernen oder ignorieren).Wenn Ihr Prozess die Disposition eines Signals auf eine bestimmte Handlerroutine festgelegt hat, können Sie steuern, welcher Thread die Signale empfängt, indem Sie bestimmte Thread-Signalmasken mit bearbeiten
pthread_sigmask(3)
. Sie können einen Thread benennen, um alle zu verwalten, oder einen Thread pro Signal oder eine beliebige Mischung dieser Optionen für bestimmte Signale erstellen, oder Sie verlassen sich auf das aktuelle Standardverhalten des Linux-Kernels bei der Übermittlung des Signals an den Hauptthread.Einige Signale sind jedoch laut
signal(7)
Manpage speziell :quelle