Eingangspunkt des Einheitentreibers 'ddselect'
Zweck
Prüft, ob mindestens ein Ereignis auf dem Gerät aufgetreten ist.
Syntax
Parameter
| Element | Beschreibung |
|---|---|
| Devno | Gibt die Haupt-und Nebeneinheitennummern an. |
| Ereignisse | Gibt die zu prüfenden Ereignisse an. |
| Reventp | Zeiger für zurückgegebene Ereignisse. Dieser Parameter, nach Referenz übergeben, wird von der Routine Datendefinitionsauswahl verwendet, um anzugeben, welche der ausgewählten Ereignisse zum Zeitpunkt des Aufrufs wahr sind. Die Position der zurückgegebenen Ereignisse, auf die durch den Parameter Reventp verwiesen wird, wird auf 0 gesetzt, bevor diese Routine aufgerufen wird. |
| Chan | Gibt die Kanalnummer an |
Beschreibung
Der Eingangspunkt Datendefinitionsauswahl wird aufgerufen, wenn die Subroutine Auswählen oder Umfrage verwendet wird oder wenn der fp_auswählen -Kernelservice aufgerufen wird. Sie ermittelt, ob ein angegebenes Ereignis oder Ereignisse auf der Einheit aufgetreten sind.
Nur Einheitentreiber für Zeichenklassen können die Routine Datendefinitionsauswahl bereitstellen. Es kann nicht von Blockeinheitentreibern bereitgestellt werden, auch wenn unformatierter Schreib-/Lesezugriff bereitgestellt wird.
Informationsanfragen zu Ereignissen
Der Parameter Ereignisse stellt mögliche Ereignisse dar, die als Flags (Bit) überprüft werden können. Für die Subroutinen Auswählen und Umfrage sind drei Basisereignisse definiert, wenn sie auf Einheiten angewendet werden, die SELECT-oder Polling-Operationen unterstützen:
| Ereignis | Beschreibung |
|---|---|
| POLLIN | Die Eingabe ist auf der Einheit vorhanden. |
| POLLOUT | Die Einheit kann ausgegeben werden. |
| POLLPRI | Auf der Einheit ist eine Ausnahmebedingung aufgetreten. |
Ein viertes Ereignisflag wird verwendet, um anzuzeigen, ob die Datendefinitionsauswahl -Routine diese Anforderung zur späteren Benachrichtigung über das Ereignis mithilfe des Selnotify -Kernel-Service aufzeichnen soll. Dieses Flag kann im Parameter Ereignisse gesetzt werden, wenn der Einheitentreiber keine asynchrone Benachrichtigung über die angeforderten Ereignisse bereitstellen muss.
| Ereignis | Beschreibung |
|---|---|
| POLLSYNC | Diese Anforderung ist nur eine synchrone Anforderung. Die Routine muss den Selnotify -Kernel-Service für diese Anforderung nicht aufrufen, auch wenn die Ereignisse später auftreten. |
Zusätzliche Ereignisflags im Parameter Ereignisse verbleiben für einheitenspezifische Ereignisse im Aufruf der Subroutine Umfrage .
Verarbeitung auswählen
Wenn mindestens ein im Parameter Ereignisse angegebenes Ereignis wahr ist, sollte die Routine Datendefinitionsauswahl dies durch Festlegen der entsprechenden Bits im Parameter Reventp angeben. Beachten Sie, dass der von Reventp zurückgegebene Ereignisparameter nach Referenz übergeben wird.
Wenn keines der angeforderten Ereignisse wahr ist, setzt die Routine Datendefinitionsauswahl den zurückgegebenen Ereignisparameter auf 0. Sie wird nach Referenz über den Parameter Reventp übergeben. Außerdem wird das Flag POLLSYNC im Parameter Ereignisse überprüft. Wenn dieses Flag auf "true" gesetzt ist, sollte die Routine Datendefinitionsauswahl nur zurückkehren, da die Ereignisanforderung nur eine synchrone Anforderung war.
Wenn das Flag POLLSYNC jedoch auf "false" gesetzt ist, muss die Datendefinitionsauswahl -Routine den Kernel benachrichtigen, wenn eines oder mehrere der angegebenen Ereignisse zu einem späteren Zeitpunkt eintreten. Zu diesem Zweck sollte die Routine für jedes im Parameter Ereignisse angeforderte Ereignis separate interne Flags setzen.
Wenn eines dieser Ereignisse wahr wird, sollte die Einheitentreiberroutine den Selnotify -Service verwenden, um den Kernel zu benachrichtigen. Die entsprechenden internen Flags sollten dann zurückgesetzt werden, um eine erneute Benachrichtigung über das Ereignis zu vermeiden.
Manchmal kann sich die Einheit in einem Status befinden, in dem ein unterstütztes Ereignis oder Ereignisse nie erfüllt werden können (z. B. wenn eine Übertragungsleitung nicht betriebsbereit ist). In diesem Fall sollte die Routine Datendefinitionsauswahl einfach die entsprechenden Reventp -Flags auf 1 setzen. Dadurch wird verhindert, dass die Subroutine Auswählen oder Umfrage unbegrenzt wartet. Dies führt jedoch dazu, dass der Anrufer in diesem Fall nicht zwischen erfüllten und nicht erfüllbaren Ereignissen unterscheiden kann. Nur wenn eine spätere Anforderung mit der Option NVERZÖGERUNG fehlschlägt, wird der Fehler erkannt.
Ausführungsumgebung
Die Routine Datendefinitionsauswahl wird nur in der Prozessumgebung ausgeführt. Er sollte die erforderliche Serialisierung seiner Datenstrukturen bereitstellen, indem er die Sperrenkernel-Services in Verbindung mit einem im Treiber definierten privaten Sperrwort verwendet.
Rückgabewerte
Die Routine Datendefinitionsauswahl sollte den Rückgabecode 0 zurückgeben, wenn die angeforderte Auswahl-oder Abfrageoperation für die angegebene Ressource gültig ist. Angeforderte Operationen sind jedoch ungültig, wenn eine der folgenden Bedingungen zutrifft:
- Der Einheitentreiber unterstützt ein angefordertes Ereignis nicht.
- Die Einheit befindet sich in einem Status, in dem Polling-und Auswahloperationen nicht akzeptiert werden.
In diesen Fällen sollte die Routine Datendefinitionsauswahl mit einem Rückkehrcode ungleich null (normalerweise EINVAL) zurückgegeben werden, ohne die relevanten Reventp -Flags auf 1 zu setzen. Dies bewirkt, dass die Subroutine Umfrage an das aufrufende Programm zurückgegeben wird, wobei das Flag SENDEFEHLER im zurückgegebenen Ereignisparameter, der dieser Ressource zugeordnet ist, gesetzt ist. Die Subroutine Auswählen zeigt dem Aufrufenden an, dass alle angeforderten Ereignisse für diese Ressource wahr sind.
Sofern zutreffend sollten die Rückgabewerte verwendet werden, die im Standard POSIX 1003.1 für die Subroutine select definiert sind.