НАЗВА
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