sysctl

Autres langues

Langue: pl

Autres versions - même langue

Version: 1996-04-11 (fedora - 25/11/07)

Autres sections - même nom

Section: 2 (Appels système)

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)