Asynchrone Signale und Wartestatusbeendigung

Ein asynchrones Signal kann die Operation eines Systemaufrufs oder einer Kernelerweiterung ändern, indem eine lange Wartezeit beendet wird.

Kernel-Services wie Blockthread, _Sleep_Threadund Et_Wait sind von Signalen betroffen. Die folgenden Optionen werden bereitgestellt, wenn ein Signal an einen Thread gesendet wird:

  • Rückgabe des Kernel-Service mit einem Rückkehrcode, der anzeigt, dass der Aufruf durch ein Signal unterbrochen wurde
  • Rufen Sie den Kernel-Service Longjmpx auf, um die Ausführung bei einem zuvor gespeicherten Kontext im Falle eines Signals fortzusetzen.
  • Ignorieren Sie das Signal mit der Option Kurzwartezeit , damit der Kernel-Service normal zurückkehren kann.

Der Kernel-Service Ruhezustand , der aus Kompatibilitätsgründen bereitgestellt wird, unterstützt auch die Optionen PCATCHKATCH und SWAKEONSIGConstellation name (optional) , um die Antwort auf ein Signal während der Funktion Ruhezustand zu steuern.

Bisher hat der Kernel den Kontext bei der Eingabe im Systemaufrufhandler automatisch gespeichert. Daher hat jeder lange (unterbrechbare) Ruhemodus ohne Angabe der Option PCATCHKATCH die Steuerung an den gespeicherten Kontext zurückgegeben, wenn ein Signal den Wartestatus unterbrochen hat. Der Systemaufruf-Handler setzte daraufhin die globale Variable errno auf EINTR und gab einen Rückgabewert von -1 aus dem Systemaufruf zurück.

Der Kernel erfordert jedoch jeden Systemaufruf, der direkt oder indirekt einen Ruhezustand -Aufruf ohne die Option PCATCHKATCH absetzen kann, um einen gespeicherten Kontext mit dem Setjmpx -Kernelservice einzurichten. Dies wird ausgeführt, um den Systemaufwand für Systemaufrufe zu vermeiden, die Wartezeiten verarbeiten, die durch Signale beendet wurden. Mit dem setjmpx-Dienst kann das System einen gespeicherten Kontext einrichten, der den Rückgabewert des Systemaufrufs auf -1 setzt und dieut_errorauf EINTR, wenn ein Signal eine lange Wartezeit unterbricht, ohne Signal 'return-from-signal'anzugeben.

Es ist wahrscheinlich schneller und robuster, Signal 'return-from-signal' für alle langen Wartestatus anzugeben und den Rückkehrcode zu verwenden, um die Rückgabe des Systemaufrufs zu steuern.