Under Construction

Informationen aus dem Kernel

Mit dem AIX spezifischen System-Call getkerninfo(), können auf einfache Weise Informationen zu verschiedenen Bereichen ermittelt werden, wie z.B. Liste der Netzwerk-Interfaces, Netzwerk-Statistiken, Prozeß-Informationen usw. Die Informationen werden dabei in einen angegebenen Pufferbereich zur weiteren Verarbeitung kopiert werden. Welche Informationen geliefert werden sollen, wird durch einen 32-bit Operations-Code bestimmt. Der System-Call besitzt die folgende Signatur:

int getkerninfo(int operation, char *buffer, int *buffer_size, int32long64_t argument);

Mögliche Werte für den 32-bit Operations-Code sind in dem Header-File /usr/include/sys/kinfo.h (Fileset bos.adt.includes) zu finden. Die Daten werden an die durch buffer angegebene Stelle geschrieben, die Größe des bereitgestellten Puffers wird über buffer_size angegeben. Einige Operations-Codes erfordern die Angabe eines Arguments, wie z.B. der Name eines Netzwerk-Interfaces (KINFO_GET_IFNET). Dies kann über das letzte Argument (argument) angegeben werden. Ist der Aufruf von getkerninfo() nicht erfolgreich, so wird der Wert -1 zurückgegeben und die Variable errno gesetzt. Bei Erfolg wird je nach Operations-Code 0 oder ein Wert größer 0 zurückgeliefert.

Bei einigen Operations-Codes ist nicht klar welche Puffergröße notwendig ist. Z.B. liefert KINFO_NETDEV_CLASS für alle Netzwerk-Devices Informationen, die Anzahl der Netzwerk-Devices hängt aber vom konkreten System und dessen Konfiguration ab und ist a priori nicht bekannt. In diesen Fällen kann der System-Call mit dem Null-Pointer als buffer und buffer_size Argument aufgerufen werden:

int ret = getkerninfo(KINFO_NETDEV_CLASS,NULL,NULL,0);

Der System-Call liefert dann die notwendige Größe des Puffers in Bytes als Rückgabewert (ret) zurück.

Hinweis: Für Operations-Codes mit fester Puffergröße (z.B. KINFO_GET_ICMPSTAT) führt dieses Vorgehen zu einem Fehler (Return-Code -1) und dem Fehler EFAULT (errno=14).

Die Funktion getkerninfo() ist in keinem der Header-Files deklariert, der GNU C-Compiler liefert daher die Warnung „implicit declaration of function ‚getkerninfo‘“. Durch eine eigene Deklaration im Source-Code kann diese Warnung vermieden werden. Der GNU C++-Compiler benötigt eine explizite Deklaration, ansonsten gibt es spätestens beim Linken die Fehlermeldung:

$ g++ -o kinfo kinfo.c
ld: 0711-317 ERROR: Undefined symbol: .getkerninfo(int, char*, int*, int)
ld: 0711-345 Use the -bloadmap or -bnoquiet option to obtain more information.
collect2: error: ld returned 8 exit status
$

Durch Hinzufügen der folgenden Deklaration kann die Fehlermeldung vermieden werden:

extern "C" {
int getkerninfo(int operation, char *buffer, int *buffer_size, int32long64_t argument);
}

Im Folgenden werden einige konkrete Beispiele für die Verwendung von getkerninfo() gezeigt.