Системный вызов
_sysctl
считывает и/или изменяет параметры ядра. Они могут представлять собой, например,
имя машины или максимальное количество открытых файлов. Параметр функции имеет
следующую структуру:
struct __sysctl_args {
int *name; /* вектор в виде целого числа, описывающий переменную */
int nlen; /* длина этого вектора */
void *oldval; /* 0 или адрес, по которому будет помещено старое значение */
size_t *oldlenp; /* размер пространства для записи старого значения
переменной */
void *newval; /* 0 или адрес нового значения*/
size_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("Эта машина работает в %*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.