sysctl

SYSCTL(2)                    Bibliotheksfunktionen                   SYSCTL(2)



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 geo^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.  Ausschlies^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).



Linux 1.3.85                     24. Juni 1996                       SYSCTL(2)