Provided by: manpages-de-dev_0.5-4.1ubuntu1_all bug

NAME

       sysctl - lese/schreibe Systemparameter

ÜBERSICHT

       #include <unistd.h>

       #include <linux/unistd.h>

       #include <linux/sysctl.h>

       _syscall1(int, _sysctl, struct __sysctl_args *, args);

       int _sysctl(struct __sysctl_args *args);

BESCHREIBUNG

       Der  Aufruf  _sysctl  liest  und/oder  schreibt  Kernel-Parameter,  zum
       Beispiel den Rechnernamen oder die maximale Anzahl geöffneter  Dateien.
       Das Argument hat die Form

       struct __sysctl_args {
               int *name;        /* ganzzahliger Vektor, der eine Variable
                                    beschreibt */
               int nlen;         /* Länge dieses Vektors */
               void *oldval;     /* 0 oder Adresse, wo der alte Wert gespeichert
                                    werden soll */
               size_t *oldlenp;  /* freier Raum für den alten Wert, überschrieben
                                    durch die aktuelles Größe des alten Wertes */
               void *newval;     /* 0 oder Adresse des neuen Wertes */
               size_t newlen;    /* Länge des neuen Wertes */
       };

       Dieser  Aufruf  sucht  in  einer Baumstruktur, die möglicherweise einer
       Verzeichnisstruktur  unter  /proc/sys  ähnelt,  und  ruft,   wenn   der
       geforderte  Punkt gefunden wird, eine entsprechende Routine auf, um den
       Wert zu lesen oder zu verändern.

BEISPIEL

       #include <linux/unistd.h>
       #include <linux/types.h>
       #include <linux/sysctl.h>

       _syscall1(int, _sysctl, struct __sysctl_args *, args);
       int sysctl(int *name, int nlen, void *oldval, size_t *oldlenp,
                  void *newval, size_t newlen)
       {
               struct __sysctl_args args={name,nlen,oldval,oldlenp,newval,newlen};
               return _sysctl(&args);
       }

       #define SIZE(x) sizeof(x)/sizeof(x[0])
       #define OSNAMESZ 100

       char osname[OSNAMESZ];
       int osnamelth;
       int name[] = { CTL_KERN, KERN_OSTYPE };

       main(){
               osnamelth = SIZE(osname);
               if (sysctl(name, SIZE(name), osname, &osnamelth, 0, 0))
                       perror("sysctl");
               else
                       printf("This machine is running %*s\n", osnamelth, osname);
               return 0;
       }

RÜCKGABEWERTE

       Bei erfolgreicher beendigung gibt _sysctl 0 zurück.  Anderenfalls  wird
       ein  Wert  von  -1  zurückgegeben  und  errno  gesetzt,  um  den Fehler
       anzuzeigen.

FEHLER

       ENOTDIR
              name wurde nicht gefunden.

       EPERM  Keine   Such-Berechtigung    für    eines    der    auftretenden
              ‘Verzeichnisse’,  oder  keine Leseberechtigung wenn oldval nicht
              null war, oder keine Schreibberechtigung wenn newval nicht  null
              war.

       EFAULT Der  Aufruf  fragte  nach  dem  vorherigen Wert durch setzen von
              oldval auf nicht null, aber erlaubte Null Raum in oldlenp.

KONFORM ZU

       Dieser Aufruf ist Linux-spezifisch.

GESCHICHTE

       Einen Aufruf sysctl gibt es in Linux seit Version 1.3.57.  Er  entstand
       in  BSD-4.4.   Ausschließlich Linux hat das Abbild /proc/sys.  Schemata
       der Objektbenennung unterscheiden sich in Linux und BSD 4.4,  aber  die
       Deklaration der Funktion sysctl(2) sind in beiden die gleiche.

BUGS

       Nicht alles verfügbaren Objekte sind richtig dokumentiert.
       Es  ist  noch  nicht  möglich,  das Betriebssystem durch schreiben nach
       /proc/sys/kernel/ostype zu ändern.

SIEHE AUCH

       proc(5).