sysctl - читает/записывает параметры системы
НАЗВАНИЕsysctl - читает/записывает параметры системы
СИНТАКСИС
#include
#include
#include
_syscall1(int, _sysctl, struct __sysctl_args *, args);
int _sysctl(struct __sysctl_args *args);
ОПИСАНИЕ
Системный вызов _sysctl считывает и/или изменяет параметры
ядра. Они могут представлять собой, например, имя машины
или максимальное количество открытых файлов. Параметр
функции имеет следующую структуру:
struct __sysctl_args {
int *name; /* вектор в виде целого числа, описывающий переменную */
int nlen; /* длина этого вектора */
void *oldval; /* 0 или адрес, по которому будет помещено старое значение */
size_t *oldlenp; /* размер пространства для записи старого значения
переменной */
void *newval; /* 0 или адрес нового значения*/
size_t newlen; /* размер нового значения */
};
Этот вызов производит поиск в древовидной структуре,
возможно, изменяя при этом структуру каталогов /proc/sys,
и, если необходимый элемент найден, вызывает
соответствующую процедуру, читающую или изменяющую данное
значение.
ПРИМЕР
_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);
}
char osname[OSNAMESZ];
int osnamelth;
int name[] = { CTL_KERN, KERN_OSTYPE };
main(){
osnamelth = SIZE(osname);
if (sysctl(name, SIZE(name), osname, &osnamelth, 0, 0))
perror("sysctl");
else
printf("Эта машина работает в %*s\n", osnamelth, osname);
return 0;
}
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При удачном завершении возвращается нулевое значение. При
ошибке возвращается -1, а переменной errno присваивается
номер ошибки.
КОДЫ ОШИБОК
ENOTDIR
Файл name не найден.
EPERM Нет прав на поиск в одном из встретившихся
"каталогов" или нет прав на чтение данных, если
oldval не равен нулю; или нет прав на запись, если
newval не равен нулю.
EFAULT Был сделан запрос старого значения путем установки
"непустого" значения oldval, но установленная длина
oldlenp равна нулю.
СООТВЕТСТВИЕ СТАНДАРТАМ
Эта функция предназначена специально для работы в Linux.
Системный вызов sysctl впервые появился в Linux 1.3.57. Он
взят из 4.4BSD. Однако, в Linux существует зеркало
/proc/sys, и система именования объектов в Linux и BSD 4.4
является различной, но определение функции sysctl(2)
аналогично в обеих системах.
НАЙДЕННЫЕ ОШИБКИ
Названия объектов различаются в разных версиях ядра,
ПОЭТОМУ ЭТОТ СИСТЕМНЫЙ ВЫЗОВ НЕ ЯВЛЯЕТСЯ ДЕЙСТВЕННЫМ В
ПРИЛОЖЕНИЯХ. Вместо этого возможно использование
интерфейса /proc/sys.
Не все существующие объекты описаны соответствующим
образом.
В настоящее време не следует изменять тип операционной
системы путем записи в файл /proc/sys/kernel/ostype.