2010-09-03 11 views
6

Während der Prozess einen blockierenden Systemaufruf ausführt, z. B. Lesen oder Schreiben, ist das Signal angekommen. Wird der Systemaufruf mit dem Fehler EINTR beendet? Wird der Systemaufruf nach der Behandlung des Systemaufrufs neu gestartet?Problem mit Signalverarbeitung, Interruptbehandlung

Angenommen, für Systemaufruf mit dem Fehler beendet wird EINTR, Griffe Kernel das Signal vor dem Benutzerraum returing.

Ist das Signal Griff im User-Modus/Kernel-Modus ausgeführt? Wenn seine im User-Modus, wird werden dort auf die Anweisung nach dem Systemaufruf zurückkehren (Lesen/Schreiben), während der Signal angekommen oder wieder geht es den Kernelmodus, nachdem das Signal und kehrt zu dem Benutzer von ret_from_syscall Handhabung. Wie wird die Ausführung bei der Anweisung neben dem Systemaufruf, bei dem das Signal angekommen ist, fortgesetzt?

Ist es möglich, das System neu zu starten, indem SA_RESTART Flagge in sigaction vorbei?

Antwort

3

Signal ausgeführt wird, in Benutzermodus , aber mit einem anderen Benutzerkontext , dann zurück zum Kern, der mit ret_from_syscall user_mode zurückzukehren. Das Verhalten des Systemaufrufs bei der Installation des Signal Handlers mit SA_RESTART hängt vom Systemaufruf ab.

Eine Beschreibung, welchen Systemaufruf ist in der letzten Version der signal overview manpage verfügbar werden neu gestartet:

man 7 signal 

Wenn die SA_RESTART Flag nicht verwendet wird, Systemaufruf nicht neu gestartet wird.

+1

Jetzt habe ich, was Sie meinen, indem Signal im Benutzermodus mit einem anderen Benutzerkontext ausgeführt wird. Wenn der Prozess ein Signal empfängt, wechselt der Prozess in den Kernel-Modus, um die Ausnahme zu behandeln, in der die Bitmaske des Signalarrays des aktuellen Prozesses gesetzt ist. Kurz bevor er in den Benutzermodus zurückkehrt, überprüft der Kernel das Signal pending und ruft die Funktion do_signal auf, um das Signal zu verarbeiten, das wiederum handle_signal aufruft, das den Kernel-Hardware-Kontext kopiert und den Benutzermodus-Stack durch Aufrufen von setup_frame ändert. –

+0

Der neue Stack-Frame enthält Signum, PC-Wert, der auf den Benutzermodus-Signalhandler zeigt, Rücksendeadressenfeld, das die Adresse des Systemaufrufs sigreturn enthält. Wenn der Prozess in den Benutzermodus zurückkehrt, beginnt er mit der Ausführung des Signalhandlers und bei der Beendigung wird sigreturn ausgeführt, wodurch der Prozess in den Kernelmodus wechselt, in dem er im Hardwarekontext aus dem Benutzermodusstapel in den Kernelstapel von restore_sigcontext zurückkopiert wird Originalzustand). Wenn der Sigreturn-Systemaufruf beendet wird, schaltet der Prozess zurück in den Benutzermodus und fährt von dort fort, wo er vor dem Signal verbleibt. –

+0

Es ist wichtig zu beachten, dass SA_RESTART nicht immer gilt. Einige Schnittstellen werden nie wieder gestartet, nachdem sie von einem Signal-Handler unterbrochen wurden, unabhängig von der Verwendung von SA_RESTART. Sie schlagen immer mit dem Fehler EINTR fehl, wenn sie von einem Signal-Handler unterbrochen werden. Überprüfen Sie [Signalman-Seite für Details] (http://man7.org/linux/man-pages/man7/signal.7.html). – kikeenrique