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 |