sysctl

Autres langues

Langue: pl

Autres versions - même langue

Version: 1996-04-11 (openSuse - 09/10/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)