Provided by: manpages-pl-dev_20060617-1_all bug

NAZWA

       sysctl - odczyt/zapis parametrów systemu

SKŁADNIA

       #include <unistd.h>

       #include <linux/unistd.h>

       #include <linux/sysctl.h>

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

       int _sysctl(struct __sysctl_args *args);

OPIS

       Wywołanie _sysctl odczytuje i/lub ustawia parametry jądra. Na przykład:
       nazwę hosta, maksymalną liczbę otwartych plików. Argument wywołania  ma
       postać

       struct __sysctl_args {
               int *name;        /* wektor liczb całkowitych opisujący zmienną */
               int nlen;         /* długość tego wektora */
               void *oldval;     /* 0 lub adres, gdzie zachować starą wartość */
               size_t *oldlenp;  /* ilość miejsca na starą wartość
                                    nadpisywana przez rzeczywisty jej rozmiar */
               void *newval;     /* 0 lub adres nowej wartości */
               size_t newlen;    /* rozmiar nowej wartości */
       };

       Wywołanie    to    dokonuje   przeszukiwania   struktury   drzewiastej,
       prawdopodobnie pzypominającej drzewo katalogowe z  /proc/sys,  i  jeśli
       żądany  element  zostanie  znaleziony,  wywołuje odpowiednią funkcję do
       odczytania lub zmodyfikowania wartości.

PRZYKŁAD

       #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 = sizeof(osname);
               if (sysctl(name, SIZE(name), osname, &osnamelth, 0, 0))
                       perror("sysctl");
               else
                       printf("This machine is running %*s\n", osnamelth, osname);
               return 0;
       }

WARTOŚĆ ZWRACANA

       Po pomyślnym  zakończeniu,  _sysctl  zwraca  0.  W  przeciwnym  wypadku
       zwracane jest -1 i ustawiane errno w sposób określający rodzaj błędu.

BŁĘDY

       ENOTDIR
              name nie zostało znalezione.

       EPERM  Brak   uprawnień   do   przeszukiwania   jednego  z  napotkanych
              `katalogów', lub brak praw odczytu, gdy oldval  było  niezerowe,
              lub brak praw zapisu, gdy newval było niezerowe.

       EFAULT Wywołanie żądało poprzedniej wartości przez ustawienie oldval na
              nie-NULL, lecz zezwalając na zerową wielkość w oldlenp.

ZGODNE Z

       Wywołanie to jest to specyficzne dla Linuksa i nie powinno być  używane
       w  przenośnych  programach.  Wywołanie sysctl jest obecne w Linuksie od
       1.3.57. Pochodzi z 4.4BSD. Jedynie Linux posiada  jego  odwzorowanie  w
       /proc/sys  a  konwencje nazywania obiektów różnią się między Linuksem i
       BSD 4.4, lecz  deklaracja  funkcji  sysctl(2)  jest  taka  sama  w  obu
       przypadkach.

USTERKI

       Nazwy  obiektów różnią się pomiędzy wersjami jądra.  CZYNI TO NINIEJSZĄ
       FUNKCJĘ SYSTEMOWĄ BEZUŻYTECZNĄ DLA  APLIKACJI.   Należy  zamiast  niego
       używać interfejsu /proc/sys.
       Nie wszystkie dostępne obiekty są odpowiednio udokumentowane.
       Nie jest jeszcze możliwe zmienianie systemu operacyjnego przez zapis do
       /proc/sys/kernel/ostype.

ZOBACZ TAKŻE

       proc(5)