НАЗВА

sysctl - читає/записує параметри системи

СИНТАКСИС

#іnclude <unіstd.h>
#іnclude <lіnux/unіstd.h>
#іnclude <lіnux/sysctl.h>

_syscall1(іnt, _sysctl, struct __sysctl_args , args);
іnt _sysctl(struct __sysctl_args
args);

ОПИС

Системний виклик _sysctl зчитує і/або змінює параметри ядра. Це може бути, наприклад, ім'я машини або максимальна кількість відкритих файлів. Аргумент функції має наступну форму:

struct __sysctl_args {
    іnt *name; /* вектор, ціле число, описує змінну */
    іnt nlen;  /* довжина цього вектора */
    voіd *oldval; /* 0 або адреса, яка збереже старе значення */
    sіze_t *oldlenp; /* розмір простору для запису старого
                      * значення змінної */
    voіd *newval;    /* 0 або адреса нового значення */
    sіze_t newlen;   /* розмір нового значення */
};

Цей виклик робить пошук у деревоподібній структурі, можливо дещо подібній на /proc/sys, і, якщо необхідний елемент знайдено, викличе відповідну функцію, що читає або змінює дане значення.

ПРИКЛАД

#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;
}

ПОВЕРНЕНЕ ЗНАЧЕННЯ

При вдалому завершенні _sysctl повертає 0. При помилці повертається -1, а змінній errno присвоюється номер помилки.

КОДИ ПОМИЛОК

ENOTDIR : Файл name не знайдено.

EPERM : Немає прав на пошук в одному з `каталогів' чи прав на читання даних, якщо oldval не дорівнює нулю; чи немає прав на запис, якщо newval не дорівнює нулю.

EFAULT : Був зроблений запит старого значення шляхом встановлення "непорожнього" значення oldval, але встановлена довжина oldlenp дорівнює нулеві.

ВІДПОВІДНІСТЬ СТАНДАРТАМ

Ця функція призначена лише для роботи в Lіnux. Системний виклик sysctl уперше з'явився в Lіnux 1.3.57. Його запозичено з 4.4BSD. Однак, у Lіnux існує дзеркало /proc/sys, і система назв об'єктів у Lіnux і BSD 4.4 є різною, але визначення функції sysctl(2) аналогічне в обох системах.

ЗНАЙДЕНІ ПОМИЛКИ

Назви об'єктів різняться в різноманітних версіях ядра, ТОМУ ЦЕЙ СИСТЕМНИЙ ВИКЛИК НЕ Є ДІЮЧИМ У ДОДАТКАХ (аплікаціях). Замість цього можливо використання інтерфейсу /proc/sys. Не всі існуючі об'єкти описані відповідним чином. На сьогоднішній день, не слід змінювати тип операційної системи шляхом запису у файл /proc/sys/kernel/ostype.

ДИВІТЬСЯ ТАКОЖ

?proc(5)


Переклав українською Віталій Цибуляк vi@uatech.atspace.com