Definitionsmethode schreiben
Dieser Artikel beschreibt, wie eine Methode zum Definieren von Geräten funktioniert. Außerdem werden Richtlinien für Programmierer vorgeschlagen, die ihre eigenen Methoden zur Einheitenkonfiguration definieren.
Syntax
defDev -c Klasse -s SubClass -t Typ [ -p Übergeordnet -w Verbindung ] [ -l Name ]
Beschreibung
Die Definitionsmethode ist für die Erstellung einer angepassten Einheit in der angepassten Datenbank verantwortlich. Dazu wird ein Objekt für die Einheit zur Objektklasse "Angepasste Einheiten" (CuDv) hinzugefügt. Die Methode Define wird entweder durch den Konfigurationsbefehl mkdev , durch ein Knotenkonfigurationsprogramm oder durch die Konfigurationsmethode einer Einheit aufgerufen, die untergeordnete Einheiten erkennt und definiert.
Die Methode "Define" verwendet Informationen, die als Eingabe bereitgestellt werden, sowie Informationen in der vordefinierten Datenbank zum Ausfüllen des CuDv -Objekts. Wenn die Methode zur Unterstützung einer einzelnen Einheit geschrieben wird, kann sie die Optionen für Klasse, Unterklasse und Typ ignorieren. Wenn die Methode hingegen mehrere Einheiten unterstützt, muss sie möglicherweise diese Optionen verwenden, um das PdDv -Einheitenobjekt für den Typ der Einheit abzurufen, die angepasst wird.
Gemäß der Konvention sollten die ersten drei Zeichen des Namens der Definitionsmethode Deflauten. Der Rest des Namens (Entwicklung) kann beliebige Zeichen sein, die die Einheit oder Gruppe von Einheiten angeben, die die Methode verwenden, vorbehaltlich der Einschränkungen des Betriebssystems für Dateinamen.
Flags
| Element | Beschreibung |
|---|---|
| -c Klasse | Gibt die Klasse der zu definierenden Einheit an. Klasse, Unterklasse und Typ sind erforderlich, um das vordefinierte Einheitenobjekt in der vordefinierten Einheitenobjektklasse (PdDv) zu identifizieren, für die eine angepasste Einheiteninstanz erstellt werden soll. |
| -s SubClass | Gibt die Unterklasse der Einheit an, die definiert wird. Klasse, Unterklasse und Typ sind erforderlich, um das vordefinierte Einheitenobjekt in der Objektklasse PdDv zu identifizieren, für die eine angepasste Einheiteninstanz erstellt wird. |
| -t Typ | Gibt den Typ der zu definierenden Einheit an. Klasse, Unterklasse und Typ sind erforderlich, um das vordefinierte Einheitenobjekt in der Objektklasse PdDv anzugeben, für die eine angepasste Einheiteninstanz erstellt werden soll. |
| -p Übergeordnetes Element | Gibt den logischen Namen der übergeordneten Einheit an. Dieser logische Name ist für Geräte erforderlich, die eine Verbindung zu einem übergeordneten Gerät herstellen. Diese Option gilt nicht für Einheiten, die keine übergeordneten Einheiten haben, z. B. die meisten Pseudoeinheiten. |
| -w Verbindung | Gibt an, wo die Einheit eine Verbindung zum übergeordneten Element herstellt. Diese Option gilt nur für Geräte, die eine Verbindung zu einem übergeordneten Gerät herstellen. |
| -l Name | Wird vom Befehl mkdev übergeben und gibt den Namen für die Einheit an, wenn der Benutzer, der den Befehl aufruft, eine neue Einheit definiert und den Namen für die Einheit auswählen möchte. Die Methode "Define" ordnet diesen Namen als logischen Namen der Einheit im Objekt "Customized Devices" (CuDv) zu, wenn der Name noch nicht verwendet wird. Wenn diese Auswahl nicht angegeben wird, generiert die Definitionsmethode einen Namen für die Einheit. Nicht alle Einheiten unterstützen diese Option oder müssen sie unterstützen. |
Richtlinien für das Schreiben einer Definitionsmethode
Diese Liste von Tasks soll als Richtlinie für das Schreiben einer Definitionsmethode dienen. Beim Schreiben eines Verfahrens für ein bestimmtes Gerät können einige Tasks weggelassen werden. Wenn eine Einheit beispielsweise über kein übergeordnetes Element verfügt, müssen nicht alle übergeordneten Tasks und alle Tasks zur Verbindungsvalidierung einbezogen werden. Außerdem kann eine Einheit besondere Anforderungen haben, die in diesen Tasks nicht aufgeführt sind.
Die Methode "Define" muss:
- Überprüfen Sie die Eingabeparameter. Im Allgemeinen wird eine Konfigurationsmethode, die die Definitionsmethode für untergeordnete Einheiten aufruft, so codiert, dass sie die von der Definitionsmethode für untergeordnete Einheiten erwarteten Optionen übergibt. Der Befehl mkdev übergibt jedoch immer die Klassen-, Unterklassen-und Typoptionen, während nur die anderen Optionen auf der Basis der Benutzereingabe an den Befehl mkdev übergeben werden. Daher muss die Definitionsmethode möglicherweise sicherstellen, dass alle erforderlichen Optionen angegeben wurden. Wenn die Methode Define beispielsweise übergeordnete Optionen und Verbindungsoptionen für die zu definierende Einheit erwartet, muss sie sicherstellen, dass die Optionen angegeben werden. Außerdem wird eine Definitionsmethode, die die Namensspezifikationsoption -l nicht unterstützt, mit einem Fehler beendet, wenn die Option angegeben wird.
- Initialisieren Sie Object Data Manager (ODM) mit der Subroutine odm_initialize und sperren Sie die Konfigurationsdatenbank mit der Subroutine odm_lock . Das folgende Codefragment veranschaulicht diesen Prozess:
#include <cf.h> if (odm_initialize() < 0) exit(E_ODMINIT); /* initialization failed */ if (odm_lock("/etc/objrepos/config_lock",0) == -1) { odm_terminate(); exit(E_ODMLOCK); /* database lock failed */ } - Rufen Sie das vordefinierte Objekt PdDv für den Typ der zu definierenden Einheit ab. Dazu wird das Objekt aus der Objektklasse PdDv abgerufen, deren Klassen-, Unterklassen-und Typdeskriptoren mit den Klassen-, Unterklassen-und Typoptionen übereinstimmen, die für die Define-Methode bereitgestellt werden. Wenn keine Übereinstimmung gefunden wird, wird die Definitionsmethode mit einem Fehler beendet. Die Informationen werden dem Einheitenobjekt PdDv entnommen, um das Einheitenobjekt CuDv zu erstellen.
- Stellen Sie sicher, dass die übergeordnete Einheit vorhanden ist. Wenn die Einheit, die definiert wird, eine Verbindung zu einer übergeordneten Einheit herstellt und der Name der übergeordneten Einheit angegeben wurde, muss die Definitionsmethode sicherstellen, dass die angegebene Einheit tatsächlich vorhanden ist. Dazu wird das Objekt CuDv abgerufen, dessen Deskriptor für den Einheitennamen mit dem Namen der übergeordneten Einheit übereinstimmt, die mit dem Flag -p bereitgestellt wird. Wenn keine Übereinstimmung gefunden wird, wird die Definitionsmethode mit einem Fehler beendet.
- Wenn die Einheit über eine übergeordnete Einheit verfügt und diese übergeordnete Einheit in der Objektklasse CuDv vorhanden ist, überprüfen Sie, ob die zu definierende Einheit mit der angegebenen übergeordneten Einheit verbunden werden kann. Rufen Sie dazu das vordefinierte Verbindungsobjekt aus der Objektklasse "Predefined Connection" (PdCn) ab, deren Deskriptoren "Unique Type", "Connection Key" und "Connection Location" mit dem Deskriptor "Link to Predefined Devices Object Class" des CuDv -Objekts des übergeordneten Elements, das im vorherigen Schritt abgerufen wurde, und den in die Methode "Define" eingegebenen Unterklassen-und Verbindungsoptionen übereinstimmen. Wenn keine Übereinstimmung gefunden wird, wird eine ungültige Verbindung angegeben. Dies kann auftreten, wenn das angegebene übergeordnete Element keine Zwischeneinheit ist, den Typ der zu definierenden Einheit nicht akzeptiert (wie durch Unterklasse beschrieben) oder die Verbindungsposition nicht durch die Verbindungsoption angegeben ist.
- Weisen Sie der Einheit einen logischen Namen zu. Jeder neu zugeordnete logische Name muss im System eindeutig sein. Wenn ein Name mit dem Flag -l angegeben wurde, stellen Sie sicher, dass er eindeutig ist, bevor Sie ihn dem Gerät zuordnen. Dazu wird die Objektklasse CuDv für jedes Objekt überprüft, dessen Einheitennamensdeskriptor mit dem gewünschten Namen übereinstimmt. Wenn eine Übereinstimmung gefunden wird, wird der Name bereits verwendet und die Definitionsmethode muss mit einem Fehler beendet werden.
Wenn die Definitionsmethode einen Namen generieren soll, kann sie dies tun, indem sie den Präfixnamen aus dem Präfixnamensdeskriptor des Einheitenobjekts PdDv der Einheit abruft und die Subroutine genseq aufruft, um eine eindeutige Folgenummer für dieses Präfix abzurufen. Das Anhängen der Folgenummer an den Präfixnamen führt zu einem eindeutigen Namen. Die Routine genseq sucht in der Objektklasse CuDv , um sicherzustellen, dass sie eine Folgenummer zuordnet, die nicht mit dem angegebenen Präfix verwendet wurde, um einen Einheitennamen zu bilden.
In einigen Fällen muss eine Definitionsmethode möglicherweise sicherstellen, dass nur eine Einheit eines bestimmten Typs definiert wurde. Es kann beispielsweise nur eine einzige angepasste pty-Einheit in der Objektklasse CuDv geben. Die Methode "pty Define" führt dies durch Abfragen der Objektklasse CuDv aus, um festzustellen, ob eine Einheit mit dem Namenpty0vorhanden. Ist dies der Fall, wurde die Einheit pty bereits definiert. Andernfalls wird die Methode "Define" fortgesetzt, um die pty-Einheit mit dem Namen pty0zu definieren.
- Bestimmen Sie den Positionscode der Einheit. Wenn die zu definierende Einheit eine physische Einheit ist, hat sie einen Positionscode.
- Erstellen Sie das neue CuDv -Objekt.
Legen Sie die CuDv -Objektdeskriptoren wie folgt fest:
Beschreibung Einstellung Einheitenname Verwenden Sie den in Schritt 6 festgelegten Namen. Flag für Einheitenstatus Wird auf den Status 'Definiert' gesetzt Statusflag ändern Wird auf denselben Wert gesetzt, der im Deskriptor für das Flag zum Ändern des Status im PdDv -Objekt des Geräts gefunden wurde. Einheitentreiberinstanz Wird auf denselben Wert wie der Name des Einheitentreibers im PdDv -Objekt der Einheit gesetzt. Dieser Wert kann später von der Konfigurationsmethode verwendet werden. Positionscode der Einheit Wird auf eine Nullzeichenfolge gesetzt, wenn die Einheit keinen Positionscode hat. Andernfalls setzen Sie ihn auf den berechneten Wert. Logischer Name der übergeordneten Einheit Wird auf eine Nullzeichenfolge gesetzt, wenn die Einheit kein übergeordnetes Element hat. Andernfalls setzen Sie diesen Deskriptor auf den Namen des übergeordneten Elements, wie durch die übergeordnete Option angegeben. Standort, an dem die Verbindung zum übergeordneten Gerät hergestellt wurde Wird auf eine Nullzeichenfolge gesetzt, wenn die Einheit kein übergeordnetes Element hat. Andernfalls setzen Sie diesen Deskriptor auf den von der Verbindungsoption angegebenen Wert. Link zur Objektklasse für vordefinierte Einheiten Wird auf den Wert gesetzt, der aus dem Deskriptor für den eindeutigen Typ des PdDv -Objekts des Geräts abgerufen wird. - Schreibt den Namen der Einheit in die Standardausgabe. An den Einheitennamen sollte ein Leerzeichen angehängt werden, das als Trennzeichen verwendet wird, wenn andere Methoden Einheitennamen in die Standardausgabe schreiben. Entweder der Befehl mkdev oder die Methode Configure, die die Methode Define aufgerufen hat, fängt die Standardausgabe ab, um den Einheitennamen abzurufen, der der Einheit zugeordnet ist.
- Schließen Sie alle Objektklassen und beenden Sie ODM. Exit mit Exit-Code 0, wenn keine Fehler aufgetreten sind.