table of contents
other sections
SYSCTL(2) | Linux-Programmierhandbuch | SYSCTL(2) |
BEZEICHNUNG¶
sysctl - Systemparameter lesen/schreibenÜBERSICHT¶
#include <unistd.h>#include <linux/sysctl.h>int _sysctl(struct __sysctl_args *args);
BESCHREIBUNG¶
Verwenden Sie diesen Systemaufruf nicht! Siehe ANMERKUNGEN.struct __sysctl_args { int *name; /* Variable beschreibender Vektor aus Ganzzahlen */ int nlen; /* Länge dieses Vektors */ void *oldval; /* 0 oder Adresse, an der der alte Wert gespeichert werden soll */ size_t *oldlenp; /* verfügbarer Platz für den alten Wert, überschrieben durch die tatsächliche Größe des alten Wertes */ void *newval; /* 0 oder Adresse des neuen Wertes */ size_t newlen; /* Größe des neuen Wertes */ };
Dieser Aufruf sucht in einer Baumstruktur, die möglicherweise einer Verzeichnisstruktur unter /proc/sys ähnelt, und ruft, wenn das gewünschte Element gefunden wird, eine entsprechende Routine auf, um den Wert zu lesen oder zu verändern.
RÜCKGABEWERT¶
Bei erfolgreichem Abschluss gibt _sysctl() 0 zurück. Andernfalls wird ein Wert von -1 zurückgegeben und errno entsprechend gesetzt.FEHLER¶
- EFAULT
- Der Aufruf fragte nach dem vorherigen Wert durch Setzen von oldval auf einen Wert ungleich NULL, stellte dafür aber keinen Platz in oldlenp zur Verfügung.
- ENOTDIR
- name wurde nicht gefunden.
- EPERM
- keine Suchrechte für eines der vorgefundenen »Verzeichnisse«, keine Leserechte, wenn oldval nicht null war oder keine Schreibrechte, wenn newval nicht null war.
KONFORM ZU¶
Dieser Aufruf ist Linux-spezifisch und sollte nicht in portierbaren Programmen benutzt werden. Einen sysctl()-Aufruf gibt es in Linux seit Version 1.3.57. Er entstammt BSD-4.4. Ausschließlich Linux hat das Abbild /proc/sys und die Schemata der Objektbenennung unterscheiden sich in Linux und 4.4BSD, aber die Deklaration der Funktion sysctl() ist in beiden gleich.ANMERKUNGEN¶
Glibc stellt keinen Wrapper für diesen Systemaufruf bereit; rufen Sie ihn mit syscall(2) auf. Oder besser … rufen Sie ihn nicht auf: Von der Benutzung dieses Systemaufrufs wird seit langen abgeraten und er ist so unbeliebt, dass er wahrscheinlich in einer künftigen Kernel-Version verschwinden wird. Entfernen Sie ihn nun aus Ihren Programmen und benutzen Sie stattdessen die Schnittstelle /proc/sys.FEHLER¶
Die Objektnamen verändern sich zwischen Kernel-Versionen, was diesen Systemaufruf für Anwendungen wertlos macht. Nicht alle verfügbaren Objekte sind richtig dokumentiert. Es ist noch nicht möglich, das Betriebssystem durch Schreiben nach /proc/sys/kernel/ostype zu ändern.BEISPIEL¶
#define _GNU_SOURCE #include <unistd.h> #include <sys/syscall.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #include <linux/sysctl.h> int _sysctl(struct __sysctl_args *args ); #define OSNAMESZ 100 int main(void) { struct __sysctl_args args; char osname[OSNAMESZ]; size_t osnamelth; int name[] = { CTL_KERN, KERN_OSTYPE }; memset(&args, 0, sizeof(struct __sysctl_args)); args.name = name; args.nlen = sizeof(name)/sizeof(name[0]); args.oldval = osname; args.oldlenp = &osnamelth; osnamelth = sizeof(osname); if (syscall(SYS__sysctl, &args) == -1) { perror("_sysctl"); exit(EXIT_FAILURE); } printf("Auf dieser Maschine läuft %*s\n", osnamelth, osname); exit(EXIT_SUCCESS); }
SIEHE AUCH¶
proc(5)KOLOPHON¶
Diese Seite ist Teil der Veröffentlichung 3.42 des Projekts Linux- man-pages. Eine Beschreibung des Projekts und Informationen, wie Fehler gemeldet werden können, finden sich unter http://www.kernel.org/doc/man-pages/.ÜBERSETZUNG¶
Die deutsche Übersetzung dieser Handbuchseite wurde von Chris Leick <c.leick@vollbio.de> erstellt.13. Juli 2012 | Linux |